59 #define P99_DECLARE_STRUCT(NAME) \
60 typedef struct NAME NAME
74 #define P99_DECLARE_UNION(NAME) \
75 typedef union NAME NAME
101 #if __STDC_VERSION__ < 201101L
106 #define P99_DEFINE_UNION(NAME, ...) \
109 uint8_t p00_allbytes[sizeof(union { __VA_ARGS__ })]; \
117 #define P99_DEFINE_UNION(NAME, ...) \
119 union NAME { __VA_ARGS__ }
123 #define P00_ONE_TOK(T, NAME) \
132 #define P99_POINTER_TYPE(T) \
134 typedef T *P99_PASTE2(T, _ptr); \
136 typedef T const*P99_PASTE2(T, _cptr)
142 #define P99_PLAIN_TYPE(T) \
144 p99_inline T* P99_PASTE2(T, _init)(T *p00_id) { \
145 if (p00_id) *p00_id = 0; \
149 p99_inline void P99_PASTE2(T, _destroy)(T* p00_id) { \
153 P99_MACRO_END(P99_PLAIN_TYPE, T)
160 #define P99_DERIVED_TYPES(T) \
162 P99_PLAIN_TYPE(P99_PASTE2(T, _cptr)); \
163 P99_PLAIN_TYPE(P99_PASTE2(T, _ptr))
178 #define P99_ENC_DECLARE(T, NAME) \
184 P99_DECLARE_STRUCT(NAME)
190 #define P99_ENC(OBJ) ((OBJ).p00_val)
196 #define P99_ENCP(OBJP) ((OBJP)->p00_val)
206 #define P99_ENC_INIT(V) { .p00_val = (V), }
208 #if CHAR_MAX == UCHAR_MAX
209 # define P99_STD_UNSIGNED_TYPES \
217 # define P99_STD_UNSIGNED_EXTS b, c, uhh, uh, u, ul, ull
218 # define P99_STD_SIGNED_TYPES \
224 # define P99_STD_SIGNED_EXTS hh, h, i, l, ll
225 # define P99_STD_REAL_FLOATING_TYPES \
230 # define P99_STD_UNSIGNED_TYPES \
237 # define P99_STD_UNSIGNED_EXTS b, uhh, uh, u, ul, ull
238 # define P99_STD_SIGNED_TYPES \
245 # define P99_STD_SIGNED_EXTS c, hh, h, i, l, ll
246 # define P99_STD_REAL_FLOATING_TYPES \
252 #define P99_STD_REAL_FLOATING_EXTS f, d, ld
254 #ifndef __STDC_NO_COMPLEX__
255 # define P99_STD_COMPLEX_TYPES \
259 # define P99_STD_COMPLEX_EXTS fc, dc, ldc
260 # define P99_STD_FLOATING_TYPES P99_STD_REAL_FLOATING_TYPES, P99_STD_COMPLEX_TYPES
261 # define P99_STD_FLOATING_EXTS P99_STD_REAL_FLOATING_EXTS, P99_STD_COMPLEX_EXTS
263 # define P99_STD_FLOATING_TYPES P99_STD_REAL_FLOATING_TYPES
264 # define P99_STD_FLOATING_EXTS P99_STD_REAL_FLOATING_EXTS
267 #define P99_STD_BASIC_TYPES \
268 P99_STD_INTEGER_TYPES, \
269 P99_STD_FLOATING_TYPES
271 #define P99_STD_BASIC_EXTS \
272 P99_STD_INTEGER_EXTS, \
273 P99_STD_FLOATING_EXTS
275 #define P99_STD_CHARACTER_TYPES \
280 #define P99_STD_CHARACTER_EXTS c, hh, uhh
282 #define P99_STD_INTEGER_TYPES \
283 P99_STD_SIGNED_TYPES, \
284 P99_STD_UNSIGNED_TYPES
286 #define P99_STD_INTEGER_EXTS \
287 P99_STD_SIGNED_EXTS, \
288 P99_STD_UNSIGNED_EXTS
290 #define P99_STD_REAL_TYPES \
291 P99_STD_INTEGER_TYPES, \
292 P99_STD_REAL_FLOATING_TYPES
294 #define P99_STD_REAL_EXTS \
295 P99_STD_INTEGER_EXTS, \
296 P99_STD_REAL_FLOATING_EXTS
298 #define P99_STD_ARITHMETIC_TYPES \
299 P99_STD_INTEGER_TYPES, \
300 P99_STD_FLOATING_TYPES
302 #define P99_STD_ARITHMETIC_EXTS \
303 P99_STD_INTEGER_EXTS, \
304 P99_STD_FLOATING_EXTS
307 # define P99_EXT_INTEGER_TYPES p99x_uintmax, p99x_intmax
308 # define P99_EXT_ARITHMETIC_TYPES P99_STD_ARITHMETIC_TYPES, P99_EXT_INTEGER_TYPES
309 # define P99_EXT_REAL_TYPES P99_STD_REAL_TYPES, P99_EXT_INTEGER_TYPES
311 # define P99_EXT_INTEGER_TYPES
312 # define P99_EXT_ARITHMETIC_TYPES P99_STD_ARITHMETIC_TYPES
313 # define P99_EXT_REAL_TYPES P99_STD_REAL_TYPES