+Missing <time.h> include
[middleman.git] / include / macros.h
1 #ifndef MACROS_H
2 #define MACROS_H
3
4 #define ASSERT(x) { \
5    if (!(x)) { \
6       putlog(MMLOG_ERROR, "ASSERTION: %s:%d in function %s", __FILE__, __LINE__, __FUNCTION__); \
7       abort(); \
8    } \
9 }
10
11 #define ALIGN2(x, y) ( ((x) + (y) - 1) & ~((y) - 1) )
12
13 #define STRIP_CRLF(x) { \
14         char *crlf_ptr; \
15         for (crlf_ptr = x; *crlf_ptr; crlf_ptr++) { \
16                 if (*crlf_ptr == '\r' || *crlf_ptr == '\n') { \
17                         *crlf_ptr = '\0'; \
18                         break; \
19                 } \
20         } \
21 };
22
23 #define FREE_AND_STRDUP(x, a) { \
24         if ((x) != NULL) xfree(x); \
25         (x) = ((a) != NULL) ? xstrdup(a) : NULL; \
26 };
27
28 #define FREE_AND_NULL(x) { \
29         if ((x) != NULL) { \
30                 xfree((x)); \
31                 (x) = NULL; \
32         } \
33 };
34
35 #define XML_LIST_LOOP(x, y) \
36    while (x && (x = x->next) && x->item && strcasecmp(&x->item[2], &y[1]))
37
38 #define XML_LIST_CMP(x, y) \
39    if (x && x->item && !strcasecmp(x->item, y))
40
41 #define PUSH(x, y) { \
42         do { \
43                 if (x == NULL) { \
44                         x = xmalloc(sizeof(STACK)); \
45                         x->prev = NULL; \
46                 } else { \
47                         x->next = xmalloc(sizeof(STACK)); \
48                         x->next->prev = x; \
49                         x = x->next; \
50                 } \
51                 x->next = NULL; \
52                 x->data = xstrdup(y); \
53         } while(0); \
54 };
55
56 #define POP(x) { \
57         do { \
58                 if (x != NULL) { \
59                         xfree(x->data); \
60                         if (x->prev != NULL) { \
61                                 x = x->prev; \
62                                 xfree(x->next); \
63                                 x->next = NULL; \
64                         } else { \
65                                 xfree(x); \
66                                 x = NULL; \
67                         } \
68                 } \
69         } while(0); \
70 };
71
72 /*
73 this macro will move a node from anywhere in one list to the end of another
74 */
75 #define MOVENODE(t, a, x, y) { \
76         do { \
77                 if (a->next != NULL) \
78                         a->next->prev = a->prev; \
79                 if (a->prev != NULL) \
80                         a->prev->next = a->next; \
81                 if (a == x) x = a->next; \
82                 a->next = NULL; \
83                 if (y == NULL) { \
84                         y = a; \
85                         y->prev = NULL; \
86                 } else { \
87                         t tmpnode; \
88                         for (tmpnode = y; tmpnode->next; tmpnode = tmpnode->next); \
89                         if (tmpnode->next != NULL) { \
90                                 tmpnode->next->next = a; \
91                                 tmpnode->next->next->prev = tmpnode->next; \
92                         } else { \
93                                 tmpnode->next = a; \
94                                 tmpnode->next->prev = tmpnode; \
95                         } \
96                 } \
97         } while(0); \
98 };      
99
100 /*
101 this macro will shift a node in a linked list up or down one
102 */
103 #define SHIFTNODE(t, x, a, d) { \
104         do { \
105                 t tmp_node = NULL; \
106                 if (d == UP && a != (x)) { \
107                         if ((x) == a->prev) (x) = a; \
108                         if (a->prev->prev != NULL) a->prev->prev->next = a; \
109                         tmp_node = a->prev->prev; \
110                         a->prev->next = a->next; \
111                         a->prev->prev = a; \
112                         if (a->next != NULL) a->next->prev = a->prev; \
113                         a->next = a->prev; \
114                         a->prev = tmp_node; \
115                 } else if (d == DOWN && a->next != NULL) { \
116                         if ((x) == a) (x) = a->next; \
117                         if (a->next->next != NULL) a->next->next->prev = a; \
118                         tmp_node = a->next->next; \
119                         a->next->prev = a->prev; \
120                         a->next->next = a; \
121                         if (a->prev != NULL) a->prev->next = a->next; \
122                         a->prev = a->next; \
123                         a->next = tmp_node; \
124                 } \
125         } while(0); \
126 };
127
128 /*
129 this macro moves a list node to top or bottom of list
130 */
131 #define SETNODE(t, x, a, d) { \
132         do { \
133                 t tmp_node = NULL; \
134                 if (d == TOP && a != (x)) { \
135                         if (a->next != NULL) a->next->prev = a->prev; \
136                         a->prev->next = a->next; \
137                         a->prev = NULL; \
138                         (x)->prev = a; \
139                         a->next = (x); \
140                         (x) = a; \
141                 } else if (d == DOWN && a->next != NULL) { \
142                         tmp_node = a; \
143                         while (tmp_node->next != NULL) tmp_node = tmp_node->next; \
144                         if (tmp_node != a) { \
145                                 a->next->prev = a->prev; \
146                                 if (a->prev != NULL) \
147                                         a->prev->next = a->next; \
148                                 else \
149                                         (x) = a->next; \
150                                 a->prev = tmp_node; \
151                                 a->next = NULL; \
152                                 tmp_node->next = a; \
153                         } \
154                 } \
155         } while (0); \
156 };
157
158 #endif                          /* MACROS_H */