33 #define P00_ENUM_CASE(X) case X: return P99_STRINGIFY(X)
35 #define P00_ENUM_PARSE(C) \
36 if (!memcmp(P99_STRINGIFY(C), p00_s, p00_len)) { \
48 #define P99_DECLARE_ENUM_GETNAME(T, ...) \
50 inline char const* P99_PASTE2(T, _getname)(T p00_x)
55 #define P99_DECLARE_ENUM_PARSE(T, ...) \
57 inline T P99_PASTE2(T, _parse)(char const* p00_s)
63 #define P99_DECLARE_ENUM_GETNAME(T, ...) \
66 char const* P99_PASTE2(T, _getname)(T p00_x) { \
67 switch ((uintmax_t)p00_x) { \
68 P99_SEP(P00_ENUM_CASE, __VA_ARGS__); \
69 default: return "((" #T ")unknown value)"; \
72 P99_MACRO_END(declare_enum_getname, T)
78 #define P99_DECLARE_ENUM_PARSE(T, ...) \
81 T P99_PASTE2(T, _parse)(char const p00_s[]) { \
82 T p00_ret = P99_PASTE2(T, _amount); \
85 size_t const p00_len = strlen(p00_s); \
86 P99_SEP(P00_ENUM_PARSE, __VA_ARGS__); \
87 if (p00_c > 1) p00_ret = P99_PASTE2(T, _amount); \
91 P99_MACRO_END(declare_enum_parse, T)
139 #define P99_DECLARE_ENUM(T, ...) \
141 enum T { __VA_ARGS__ , \
143 P99_PASTE2(T, _amount), \
145 P99_PASTE2(T, _max) = ((size_t)(P99_PASTE2(T, _amount)) - 1u), \
147 P99_PASTE2(T, _min) = 0 \
152 P99_DECLARE_ENUM_GETNAME(T, __VA_ARGS__); \
153 P99_DECLARE_ENUM_PARSE(T, __VA_ARGS__)
159 #define P99_DECLARE_ENUM(T, ...) \
160 typedef enum T { __VA_ARGS__ , \
162 P99_PASTE2(T, _amount), \
164 P99_PASTE2(T, _max) = ((size_t)(P99_PASTE2(T, _amount)) - 1u), \
166 P99_PASTE2(T, _min) = 0 \
168 P99_DECLARE_ENUM_GETNAME(T, __VA_ARGS__); \
169 P99_DECLARE_ENUM_PARSE(T, __VA_ARGS__)
178 #define P99_DEFINE_ENUM(T) \
179 P99_INSTANTIATE(char const*, P99_PASTE2(T, _getname), T); \
180 P99_INSTANTIATE(T, P99_PASTE2(T, _parse), char const*)
186 case 0:
return "false";
187 case 1:
return "true";
188 default:
return "((bool)unknown value)";
215 #define P99_UNUSED(...) P99_SEP(P00_UNUSED, __VA_ARGS__)
217 #define P00_CONSTANT_STATIC_3(T, NAME, ...) static T const NAME = __VA_ARGS__; P99_UNUSED(NAME)
218 #define P00_CONSTANT_ENUM_1(NAME) enum { NAME }
219 #define P00_CONSTANT_ENUM_2(NAME, ...) enum { NAME = (__VA_ARGS__) }
221 #define P00_CONSTANT_2(T, NAME) \
223 (P00_CONSTANT_ENUM_1(NAME)) \
224 (P00_CONSTANT_STATIC_3(T, NAME, P99_INIT))
226 #define P00_CONSTANT_3(T, NAME, ...) \
228 (P00_CONSTANT_ENUM_2(NAME, __VA_ARGS__)) \
229 (P00_CONSTANT_STATIC_3(T, NAME, __VA_ARGS__))
258 #define P99_CONSTANT(T, NAME, INIT) register T const NAME = INIT
261 #define P99_CONSTANT(...) \
262 P99_IF_LT(P99_NARG(__VA_ARGS__), 3) \
263 (P00_CONSTANT_2(__VA_ARGS__)) \
264 (P00_CONSTANT_3(__VA_ARGS__))
297 #define P99_ENDIANNESS ((p99_endianness)P99_HTON(4, UINT32_C(0x01020304)))