-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmacro.h
54 lines (41 loc) · 1.15 KB
/
macro.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#pragma once
#define arraysize(arr) (sizeof(arr) / sizeof(arr[0]))
#define METHOD0(rv, name) rv (*name)(void *ptr)
#define METHOD(rv, name, ...) rv (*name)(void *ptr, __VA_ARGS__)
#define OBJECT(ops_type) \
const ops_type *ops; \
void *data
#define CALL0(object, method) (object).ops->method((object).data)
#define CALL(object, method, ...) (object).ops->method((object).data, __VA_ARGS__)
#define GET(type, obj, ptr) \
type *obj = (type *)(ptr); \
assert(obj)
#define GOTO_WITH(label, retval, value) \
do { \
(retval) = (value); \
goto label; \
} while (0)
#define ERROR(msg) \
fputs(msg "\n", stderr)
#define PERROR1(msg, arg) \
do { \
fputs(msg " ", stderr); \
perror(arg); \
} while (0)
#define GAI_PERROR1(msg, arg, err) \
fprintf(stderr, "%s %s: %s\n", msg, arg, \
err == EAI_SYSTEM ? strerror(errno) : gai_strerror(err))
#define SYSCALL(expr) ((expr) != -1)
#define CHECK(cond, alert, act) \
do { \
if (!(cond)) {\
alert; \
act; \
} \
} while (0)
#define COND_CHECK(var, value, cond, alert) \
do { \
if (var != value) \
CHECK(cond, alert, ;); \
var = value; \
} while (0)