Mercurial > MadButterfly
annotate include/mb_tools.h @ 509:3e0d63d7c7ae Android_Skia
Remove absolute pathes from config.cache.
Absolute pathes in config.cache would be the source of problems when
the source tree of Android is different from what is in config.cache.
So, these cached values are removed and re-computed when running
configure.
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Tue, 01 Dec 2009 22:55:27 +0800 |
parents | c6c0d017dc8e |
children | 586e50f82c1f |
rev | line source |
---|---|
12 | 1 #ifndef __TOOLS_H_ |
2 #define __TOOLS_H_ | |
3 | |
4 typedef struct _elmpool elmpool_t; | |
5 | |
6 extern elmpool_t *elmpool_new(int elm_sz, int inc_num); | |
7 extern void *elmpool_elm_alloc(elmpool_t *pool); | |
8 extern void elmpool_elm_free(elmpool_t *pool, void *elm); | |
9 extern void elmpool_free(elmpool_t *pool); | |
10 | |
11 | |
12 #define STAILQ(type) \ | |
13 struct { \ | |
14 type *head; \ | |
15 type *tail; \ | |
16 } | |
17 #define STAILQ_INIT(q) \ | |
18 do { \ | |
19 (q).head = (q).tail = NULL; \ | |
20 } while(0) | |
13 | 21 #define STAILQ_CLEAN(q) STAILQ_INIT(q) |
12 | 22 #define STAILQ_HEAD(q) ((q).head) |
23 #define STAILQ_TAIL(q) ((q).tail) | |
24 #define STAILQ_NEXT(type, field, elm) ((elm)->field) | |
25 #define STAILQ_INS(q, type, field, elm) \ | |
26 do { \ | |
27 (elm)->field = (q).head; \ | |
28 (q).head = elm; \ | |
29 if((q).tail == NULL) \ | |
30 (q).tail = elm; \ | |
31 } while(0) | |
32 #define STAILQ_INS_TAIL(q, type, field, elm) \ | |
33 do { \ | |
34 (elm)->field = NULL; \ | |
35 if((q).tail != NULL) \ | |
36 (q).tail->field = elm; \ | |
37 (q).tail = elm; \ | |
38 if((q).head == NULL) \ | |
39 (q).head = elm; \ | |
40 } while(0) | |
39 | 41 #define STAILQ_INS_AFTER(type, field, follow, elm) \ |
42 do { \ | |
43 (follow)->field = (elm)->field; \ | |
44 (elm)->field = follow; \ | |
45 } while(0) | |
12 | 46 #define STAILQ_REMOVE(q, type, field, elm) \ |
96 | 47 do { \ |
12 | 48 if((elm) == (q).head) { \ |
49 (q).head = (elm)->field; \ | |
50 if((q).head == NULL) \ | |
51 (q).tail = NULL; \ | |
52 } else { \ | |
53 type *_stailq_cur = (q).head; \ | |
54 while(_stailq_cur != NULL && \ | |
55 _stailq_cur->field != (elm)) \ | |
56 _stailq_cur = _stailq_cur->field; \ | |
57 if(_stailq_cur != NULL) { \ | |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
58 _stailq_cur->field = (elm)->field; \ |
12 | 59 if((q).tail == (elm)) \ |
60 (q).tail = _stailq_cur; \ | |
61 } \ | |
62 } \ | |
63 } while(0) | |
250
bd8ea44b421e
Fix bug and finish unit test for collision testing in event.c.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
64 #define STAILQ_FOR_EACH(q, type, field, elm) \ |
bd8ea44b421e
Fix bug and finish unit test for collision testing in event.c.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
65 for((elm) = (q).head; \ |
bd8ea44b421e
Fix bug and finish unit test for collision testing in event.c.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
66 (elm) != NULL; \ |
bd8ea44b421e
Fix bug and finish unit test for collision testing in event.c.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
67 (elm) = (elm)->field) |
12 | 68 |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
69 /*! \defgroup darray Dynamic Array |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
70 * |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
71 * DARRAY is a dynamic sized array/list, it's length is a variable. |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
72 * It is extended, automatically, if it is full and more elemnts are |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
73 * putted in. |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
74 * |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
75 * Users of DARRAY must declare a new type to store data. The way to |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
76 * declear a new type is to invoke DARRAY() with paramters of name of |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
77 * type and type of data to be stored in. The new storage type is named |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
78 * with foo_t where foo is the name you pass in. |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
79 * |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
80 * DARRAY_DEFINE() is inovked to define foo_add() function; foo is name |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
81 * of storage type. You can call foo_add() to add a data element |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
82 * into a storage object. |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
83 * |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
84 * Get ith element in a storage object, use |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
85 * \code |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
86 * obj->ds[i] |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
87 * \endcode |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
88 * |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
89 * To loop over elements in a storage object, us |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
90 * \code |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
91 * for(i = 0; i < obj->num; i++) { |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
92 * v = obj->ds[i]; |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
93 * ...... |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
94 * } |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
95 * \endcode |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
96 * @{ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
97 */ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
98 /*! \brief Declare a DARRAY storage type. |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
99 * |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
100 * \param name is name of storage type. |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
101 * \param type is type of data elements that will be stored in. |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
102 * |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
103 * Type of <name>_t is defined by the macro. It is used to define a |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
104 * storage object to contain data elements. |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
105 */ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
106 #define DARRAY(name, type) \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
107 struct _ ## name { \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
108 int max, num; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
109 type *ds; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
110 }; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
111 typedef struct _ ## name name ## _t |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
112 #define DARRAY_DEFINE(name, type) \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
113 static int name ## _add(name ## _t *da, type v) { \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
114 type *new_ds; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
115 int max; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
116 if(da->num >= (da)->max) { \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
117 max = (da)->max + 32; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
118 new_ds = realloc(da->ds, \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
119 max * sizeof(type)); \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
120 if(new_ds == NULL) return -1; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
121 da->ds = new_ds; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
122 da->max = max; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
123 } \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
124 da->ds[da->num++] = v; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
125 return 0; \ |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
126 } |
422
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
127 #define DARRAY_DEFINE_ADV(name, type) \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
128 static int name ## _adv(name ## _t *da, int n) { \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
129 type *new_ds; \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
130 int max; \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
131 if((da->num + n) > (da)->max) { \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
132 max = ((da)->num + n + 31) & ~0x1f; \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
133 new_ds = realloc(da->ds, \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
134 max * sizeof(type)); \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
135 if(new_ds == NULL) return -1; \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
136 da->ds = new_ds; \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
137 da->max = max; \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
138 } \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
139 da->num += n; \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
140 return 0; \ |
c6c0d017dc8e
Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents:
375
diff
changeset
|
141 } |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
142 #define DARRAY_CLEAN(da) do { (da)->num = 0; } while(0) |
235 | 143 #define DARRAY_INIT(da) \ |
144 do { (da)->num = (da)->max = 0; (da)->ds = NULL; } while(0) | |
158
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
145 #define DARRAY_DESTROY(da) do { if((da)->ds) free((da)->ds); } while(0) |
c1cdd3fcd28f
Postponing rdman_coord_free() and rdman_remove_shape().
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
146 /* @} */ |
55 | 147 |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
148 #include <stdlib.h> |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
96
diff
changeset
|
149 |
55 | 150 #define O_ALLOC(type) ((type *)malloc(sizeof(type))) |
151 | |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
55
diff
changeset
|
152 #define OFFSET(type, mem) (((void *)&((type *)NULL)->mem) - NULL) |
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
55
diff
changeset
|
153 #define MEM2OBJ(var, type, mem) ((type *)((void *)var - OFFSET(type, mem))) |
93 | 154 #define OFF2TYPE(obj, off, type) (*(type *)((void *)(obj) + (off))) |
73
9ab15ebc9061
Observer for mouse events
Thinker K.F. Li <thinker@branda.to>
parents:
55
diff
changeset
|
155 |
375
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
250
diff
changeset
|
156 #define MB_MAX(a, b) ((a) > (b)? (a): (b)) |
44b8223f307c
Rename MIN/MAX to MB_MIN/MB_MAX.
Thinker K.F. Li <thinker@branda.to>
parents:
250
diff
changeset
|
157 #define MB_MIN(a, b) ((a) < (b)? (a): (b)) |
250
bd8ea44b421e
Fix bug and finish unit test for collision testing in event.c.
Thinker K.F. Li <thinker@branda.to>
parents:
235
diff
changeset
|
158 |
12 | 159 #endif /* __TOOLS_H_ */ |