00001 #ifndef __TOOLS_H_
00002 #define __TOOLS_H_
00003
00004 typedef struct _elmpool elmpool_t;
00005
00006 extern elmpool_t *elmpool_new(int elm_sz, int inc_num);
00007 extern void *elmpool_elm_alloc(elmpool_t *pool);
00008 extern void elmpool_elm_free(elmpool_t *pool, void *elm);
00009 extern void elmpool_free(elmpool_t *pool);
00010
00011
00012 #define STAILQ(type) \
00013 struct { \
00014 type *head; \
00015 type *tail; \
00016 }
00017 #define STAILQ_INIT(q) \
00018 do { \
00019 (q).head = (q).tail = NULL; \
00020 } while(0)
00021 #define STAILQ_CLEAN(q) STAILQ_INIT(q)
00022 #define STAILQ_HEAD(q) ((q).head)
00023 #define STAILQ_TAIL(q) ((q).tail)
00024 #define STAILQ_NEXT(type, field, elm) ((elm)->field)
00025 #define STAILQ_INS(q, type, field, elm) \
00026 do { \
00027 (elm)->field = (q).head; \
00028 (q).head = elm; \
00029 if((q).tail == NULL) \
00030 (q).tail = elm; \
00031 } while(0)
00032 #define STAILQ_INS_TAIL(q, type, field, elm) \
00033 do { \
00034 (elm)->field = NULL; \
00035 if((q).tail != NULL) \
00036 (q).tail->field = elm; \
00037 (q).tail = elm; \
00038 if((q).head == NULL) \
00039 (q).head = elm; \
00040 } while(0)
00041 #define STAILQ_INS_AFTER(type, field, follow, elm) \
00042 do { \
00043 (follow)->field = (elm)->field; \
00044 (elm)->field = follow; \
00045 } while(0)
00046 #define STAILQ_REMOVE(q, type, field, elm) \
00047 do { \
00048 if((elm) == (q).head) { \
00049 (q).head = (elm)->field; \
00050 if((q).head == NULL) \
00051 (q).tail = NULL; \
00052 } else { \
00053 type *_stailq_cur = (q).head; \
00054 while(_stailq_cur != NULL && \
00055 _stailq_cur->field != (elm)) \
00056 _stailq_cur = _stailq_cur->field; \
00057 if(_stailq_cur != NULL) { \
00058 _stailq_cur->field = (elm)->field; \
00059 if((q).tail == (elm)) \
00060 (q).tail = _stailq_cur; \
00061 } \
00062 } \
00063 } while(0)
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 #define DARRAY(name, type) \
00103 struct _ ## name { \
00104 int max, num; \
00105 type *ds; \
00106 }; \
00107 typedef struct _ ## name name ## _t
00108 #define DARRAY_DEFINE(name, type) \
00109 static int name ## _add(name ## _t *da, type v) { \
00110 type *new_ds; \
00111 int max; \
00112 if(da->num >= (da)->max) { \
00113 max = (da)->max + 32; \
00114 new_ds = realloc(da->ds, \
00115 max * sizeof(type)); \
00116 if(new_ds == NULL) return -1; \
00117 da->ds = new_ds; \
00118 da->max = max; \
00119 } \
00120 da->ds[da->num++] = v; \
00121 return 0; \
00122 }
00123 #define DARRAY_CLEAN(da) do { (da)->num = 0; } while(0)
00124 #define DARRAY_INIT(da) do { (da)->num = (da)->max = 0; (da)->ds = NULL; }
00125 #define DARRAY_DESTROY(da) do { if((da)->ds) free((da)->ds); } while(0)
00126
00127
00128 #include <stdlib.h>
00129
00130 #define O_ALLOC(type) ((type *)malloc(sizeof(type)))
00131
00132 #define OFFSET(type, mem) (((void *)&((type *)NULL)->mem) - NULL)
00133 #define MEM2OBJ(var, type, mem) ((type *)((void *)var - OFFSET(type, mem)))
00134 #define OFF2TYPE(obj, off, type) (*(type *)((void *)(obj) + (off)))
00135
00136 #endif