28 # if __STDC_VERSION__ < 201100L
38 #if defined(P99_DECLARE_ATOMIC) || P00_DOXYGEN
42 # define P99_LIFO(T) P99_TP(T)
45 # define P99_LIFO_DECLARE(T) P99_TP_DECLARE(T)
46 # define P99_LIFO_INITIALIZER(VAL) P99_TP_INITIALIZER(VAL)
48 # define p99_lifo_init(EL, VAL) p99_tp_init((EL), (VAL))
57 #define P99_LIFO_TOP(L) P99_TP_GET(L)
68 #define P99_LIFO_PUSH(L, EL) \
71 register const P99_MACRO_VAR(p00_l, (L)); \
72 register P99_TP_TYPE(p00_l)*const p00_rr = (EL); \
73 P99_TP_TYPE_STATE(p00_l) p00_state = P99_TP_STATE_INITIALIZER(p00_l, p00_rr); \
75 p00_rr->p99_lifo = P99_TP_STATE_GET(&p00_state); \
76 } while (!P99_TP_STATE_COMMIT(&p00_state)); \
120 #define P99_LIFO_POP(L) \
123 register const P99_MACRO_VAR(p00_l, (L)); \
124 P99_TP_TYPE_STATE(p00_l) p00_state = P99_TP_STATE_INITIALIZER(p00_l, 0); \
126 register P99_TP_TYPE(p00_l)* p00_r = P99_TP_STATE_GET(&p00_state); \
127 for (; p00_r; p00_r = P99_TP_STATE_GET(&p00_state)) { \
128 P99_TP_STATE_SET(&p00_state, p00_r->p99_lifo); \
129 if (P99_TP_STATE_COMMIT(&p00_state)) \
132 if (p00_r) p00_r->p99_lifo = 0; \
136 #define P00_LIFO_REVERT(L) \
139 register P99_MACRO_VAR(p00_h, (L)); \
140 register P99_MACRO_VAR(p00_t, P99_PROMOTE_0(p00_h)); \
142 register P99_MACRO_VAR(p00_n, p00_h->p99_lifo); \
143 p00_h->p99_lifo = p00_t; \
147 register const __typeof__(p00_t = p00_t) p00_r = p00_t; \
161 #define P99_LIFO_CLEAR(L) \
164 register const P99_MACRO_VAR(p00_l, (L)); \
165 P99_TP_TYPE_STATE(p00_l) p00_state = P99_TP_STATE_INITIALIZER(p00_l, 0); \
167 register P99_TP_TYPE(p00_l)* p00_r = P99_TP_STATE_GET(&p00_state); \
168 for (; p00_r; p00_r = P99_TP_STATE_GET(&p00_state)) { \
169 if (P99_TP_STATE_COMMIT(&p00_state)) \
180 # define P99_LIFO(T) P99_PASTE2(p00_lifo_, T)
181 # define P99_LIFO_DECLARE(T) typedef T P99_LIFO(T)
182 # define P99_LIFO_INITIALIZER(VAL) ((void*)VAL)
184 #define P99_LIFO_TOP(L) (*(L))
186 #define P99_LIFO_PUSH(L, EL) \
189 P99_MACRO_VAR(p00_l, (L)); \
190 P99_MACRO_VAR(p00_el, (EL)); \
191 p00_el->p99_lifo = *p00_l; \
195 #define P99_LIFO_POP(L) \
198 P99_MACRO_VAR(p00_l, (L)); \
199 P99_MACRO_VAR(p00_el, *p00_l); \
200 *p00_l = p00_el->p99_lifo; \
201 if (p00_el) p00_el->p99_lifo = 0; \
203 register __typeof__(p00_el = p00_el) p00_r = p00_el; \
216 #define P99_LIFO_CLEAR(L) \
218 P99_MACRO_VAR(p00_l, (L)); \
219 register P99_MACRO_VAR(p00_ret, *p00_l); \
229 #define P99_LIFO_TABULATE(TYPE, TAB, L) P00_LIFO_TABULATE(TYPE, TAB, P99_UNIQ(TAB), L)
231 #define P00_LIFO_TABULATE(TYPE, TAB, ID, L) \
232 size_t P99_PASTE2(ID, _cnt) = 0; \
233 TYPE * P99_PASTE2(ID, _head) = P99_LIFO_CLEAR(L); \
234 for (TYPE * p00_e = P99_PASTE2(ID, _head); \
236 p00_e = p00_e->p99_lifo) \
237 ++P99_PASTE2(ID, _cnt); \
238 TYPE * TAB[P99_PASTE2(ID, _cnt)]; \
239 for (TYPE ** p00_t = &(TAB[0]), \
240 * p00_e = P99_PASTE2(ID, _head); \
242 p00_e = p00_e->p99_lifo, \