37#define def_init_xdr_array(name) \
38 static inline void init_##name##_array(name##_array *x)
39#define init_xdr_array(name) \
40 def_init_xdr_array(name) { \
41 x->name##_array_len = 2; \
42 x->name##_array_val = \
43 (name *)xcom_calloc((size_t)x->name##_array_len, sizeof(name)); \
49#define def_free_xdr_array(name) \
50 static inline void free_##name##_array(name##_array *x)
51#define free_xdr_array(name) \
52 def_free_xdr_array(name) { \
53 free(x->name##_array_val); \
54 x->name##_array_val = 0; \
55 x->name##_array_len = 0; \
58#define in_range(x, name, n) \
59 (((int)n) >= 0 && ((int)n) < ((int)(x).name##_array_len))
64#define expand_xdr_array(name) \
65 u_int old_length = x->name##_array_len; \
66 if (n + 1 > (x->name##_array_len)) { \
67 if (x->name##_array_len == 0) x->name##_array_len = 1; \
69 x->name##_array_len *= 2; \
70 } while (n + 1 > (x->name##_array_len)); \
71 x->name##_array_val = (name *)realloc(x->name##_array_val, \
72 x->name##_array_len * sizeof(name)); \
73 memset(&x->name##_array_val[old_length], 0, \
74 (x->name##_array_len - old_length) * sizeof(name)); \
80#define def_set_xdr_array(name) \
81 static inline void set_##name(name##_array *x, name a, u_int n)
82#define set_xdr_array(name) \
83 def_set_xdr_array(name) { \
84 expand_xdr_array(name); \
85 assert(n < x->name##_array_len); \
86 x->name##_array_val[n] = a; \
92#define def_get_xdr_array(name) \
93 static inline name get_##name(name##_array *x, u_int n)
94#define get_xdr_array(name) \
95 def_get_xdr_array(name) { \
96 expand_xdr_array(name); \
97 assert(n < x->name##_array_len); \
98 return x->name##_array_val[n]; \
104#define def_clone_xdr_array(name) \
105 static inline name##_array clone_##name##_array(name##_array x)
106#define clone_xdr_array(name) \
107 def_clone_xdr_array(name) { \
108 name##_array retval = x; \
110 retval.name##_array_len = x.name##_array_len; \
111 IFDBG(D_XDR, FN; NDBG(retval.name##_array_len, u)); \
112 if (retval.name##_array_len > 0) { \
113 retval.name##_array_val = \
114 (name *)xcom_calloc((size_t)x.name##_array_len, sizeof(name)); \
115 for (i = 0; i < retval.name##_array_len; i++) { \
116 retval.name##_array_val[i] = x.name##_array_val[i]; \
117 IFDBG(D_XDR, FN; STRLIT("clone_xdr_array"); NDBG(i, u)); \
120 retval.name##_array_val = 0; \
128#define d_xdr_funcs(name) \
129 def_init_xdr_array(name); \
130 def_free_xdr_array(name); \
131 def_set_xdr_array(name); \
132 def_get_xdr_array(name); \
133 def_clone_xdr_array(name);
138#define define_xdr_funcs(name) \
139 init_xdr_array(name) free_xdr_array(name) set_xdr_array(name) \
140 get_xdr_array(name) clone_xdr_array(name)
145#define insert_sort(type, x, n) \
148 for (i = 1; i < n; i++) { \
152 while (j > 0 && insert_sort_gt(x[j - 1], tmp)) { \
165#define bin_search_first_body(x, first, last, key, p) \
169 while (l + 1 != u) { \
171 if (bin_search_lt((x)[m], (key))) { \
183#define bin_search_last_body(x, first, last, key, p) \
187 while (l + 1 != u) { \
189 if (bin_search_gt((x)[m], (key))) { \
199#define bin_search_first(x, first, last, key, p) \
201 bin_search_first_body(x, first, last, key, p); \
203 if (p > last || (!bin_search_eq((x)[p], (key)))) p = -1; \
209#define bin_search_first_gt(x, first, last, key, p) \
211 bin_search_last_body(x, first, last, key, p); \
213 if (p > last || (!bin_search_gt((x)[p], (key)))) p = -1; \
219#define bin_search_last(x, first, last, key, p) \
221 bin_search_last_body(x, first, last, key, p); \
223 if (p < first || (!bin_search_eq((x)[p], (key)))) p = -1; \
229#define bin_search_last_lt(x, first, last, key, p) \
231 bin_search_first_body(x, first, last, key, p); \
233 if (p < first || (!bin_search_lt((x)[p], (key)))) p = -1; \
236#define diff_get(type, a, i) get_##type##_array(a, i)
237#define diff_output(type, x) set_##type##_array(&retval, x, retval_i++)
238#define diff_gt(x, y) insert_sort_gt(x, y)
244#define diff_xdr_array(type, x, y) \
245 type##_array diff_##type##_array(type##_array x, type##_array y) { \
250 init_##type##_array(&retval); \
251 insert_sort(type, x.type##_val, x.type##_len); \
252 insert_sort(type, y.type##_val, y.type##_len); \
253 while (x_i < x.type##_len && y < y.type##_len) { \
254 if (diff_eq(diff_get(type, x, x_i), diff_get(type, y, y_i))) { \
257 } else if (diff_lt(diff_get(type, x, x_i), diff_get(type, y, y_i))) { \
258 diff_output(type, diff_get(type, x, x_i++)); \
260 diff_output(type, diff_get(type, y, y_i++)); \
263 while (x_i < x.type##_len) { \
264 diff_output(type, diff_get(type, x, x_i++)); \
266 while (y_i < y.type##_len) { \
267 diff_output(type, diff_get(type, y, y_i++)); \
269 retval.type##_len = retval_i; \
275#define x_reverse(type, x, in_n1, in_n2) \
279 while ((n1) < (n2)) { \
280 type tmp = (x)[n1]; \
290#define x_blkmove(type, x, n1, n2, n3) \
292 if ((n3) < (n1)-1) { \
293 x_reverse(type, (x), (n3) + 1, (n1)-1); \
294 x_reverse(type, (x), (n1), (n2)); \
295 x_reverse(type, (x), (n3) + 1, (n2)); \
296 } else if ((n3) > (n2)) { \
297 x_reverse(type, (x), (n1), (n2)); \
298 x_reverse(type, (x), (n2) + 1, (n3)); \
299 x_reverse(type, (x), (n1), (n3)); \
__u_long u_long
Definition: types.h:73
bool_t(* xdrproc_t)(XDR *, void *,...)
Definition: xdr.h:142
u_long xdr_sizeof(xdrproc_t, void *) __THROW
Definition: xdr_sizeof.c:94