43 #define P00_ACCESSOR(NAME, X, I) P99_IF_EMPTY(NAME)([I])((NAME)[I])
44 #define P00_VASSIGN(NAME, X, I) X = P00_ACCESSOR(NAME, X, I)
45 #define P00_STRLEN(NAME, X, I) strlen(X)
46 #define P00_SIZEOF(NAME, X, I) sizeof(X)
47 #define P00_TYPD(NAME, X, I) typedef X P99_PASTE2(NAME, I)
48 #define P00_DESIGNATE(NAME, X, I) X = (NAME)X
49 #define P00_ADD(NAME, I, REC, RES) P99_ADD(RES, REC)
51 #define P00_STRLENS(N, ...) P99_FOR(,N, P00_SUM, P00_STRLEN, __VA_ARGS__)
52 #define P00_SIZEOFS(N, ...) P99_FOR(,N, P00_SUM, P00_SIZEOF, __VA_ARGS__)
53 #define P00_ADDS(N, ...) P99_FOR(, N, P00_ADD, P00_IDT, __VA_ARGS__)
55 #define P00_POW0(X, _1, _2) (X)
56 #define P00_POW(X, _1, REC, _3) (X) * REC
65 P00_DOCUMENT_NUMBER_ARGUMENT(
P99_IPOW, 0)
66 P00_DOCUMENT_MULTIPLE_ARGUMENT(
P99_IPOW, 1)
67 #define P99_IPOW(N, X) P99_IF_EQ(N,0)(P99_SIGN_PROMOTE(1, X))((P99_FOR(X, N, P00_POW, P00_POW0, P99_REP(N,))))
73 #define P99_STRLENS(...) P00_STRLENS(P99_NARG(__VA_ARGS__),__VA_ARGS__)
79 #define P99_SIZEOFS(...) P00_SIZEOFS(P99_NARG(__VA_ARGS__),__VA_ARGS__)
84 #define P99_ADDS(...) P00_ADDS(P99_NARG(__VA_ARGS__),__VA_ARGS__)
90 struct p00_strcat_state {
91 char*restrict p00_buf;
92 char*restrict p00_pos;
95 #if _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
97 char *p00_stpcpy(
char *restrict p00_des,
const char *restrict p00_src) {
98 return stpcpy(p00_des, p00_src);
102 char *p00_stpcpy(
char *restrict p00_des,
const char *restrict p00_src) {
105 if (!*p00_src)
break;
106 ++p00_des; ++p00_src;
114 p00_strcat_state* p00_strcat(p00_strcat_state *restrict p00_des,
char const*restrict p00_src) {
115 if (!p00_des->p00_pos) p00_des->p00_pos = strchr(p00_des->p00_buf, 0);
116 p00_des->p00_pos = p00_stpcpy(p00_des->p00_pos, p00_src);
121 char* p00_strcat_terminate(p00_strcat_state *restrict p00_des) {
122 return p00_des->p00_buf;
143 #define P99_STRCATS(TARG, ...) \
144 p00_strcat_terminate \
147 P99_NARG(TARG, __VA_ARGS__), \
148 (&(p00_strcat_state){ .p00_buf = (TARG), .p00_pos = 0 }), \
163 P00_DOCUMENT_PERMITTED_ARGUMENT(
P99_JOIN, 0)
164 P00_DOCUMENT_PERMITTED_ARGUMENT(
P99_JOIN, 1)
165 P00_DOCUMENT_PERMITTED_ARGUMENT(
P99_JOIN, 2)
166 #define P99_JOIN(...) P99_STRCATS((char[P99_SIZEOFS(__VA_ARGS__) + 1]){ 0 }, __VA_ARGS__)
180 #define P99_STRDUP(...) P99_STRCATS(calloc(P99_STRLENS(__VA_ARGS__) + 16, 1), __VA_ARGS__)
186 P00_DOCUMENT_NUMBER_ARGUMENT(
P99_POSS, 0)
187 #define P99_POSS(N) P99_FOR(,N, P00_SEQ, P00_POS,)
190 #define P00_ACCESSORS(X, ...) P99_FOR(X, __VA_ARGS__, P00_SEQ, P00_ACCESSOR, )
199 #define P99_ACCESSORS(X, N) P00_ACCESSORS(X, N)
210 #define P99_VASSIGNS(NAME, ...) \
211 P99_IF_LT(P99_NARG(__VA_ARGS__),2) \
212 (P99_IF_VOID(__VA_ARGS__)((void)0)(__VA_ARGS__ = (NAME)[0])) \
213 (P99_FOR(NAME, P00_NARG(__VA_ARGS__),P00_SEP, P00_VASSIGN, __VA_ARGS__))
215 #define P00_TYPEDEFS(NAME, N, ...) \
216 P99_IF_VOID(__VA_ARGS__) \
217 (P99_MACRO_END(NAME, _eat_the_semicolon_, N)) \
218 (P99_FOR(NAME, N, P00_SEP, P00_TYPD, __VA_ARGS__))
227 #define P99_TYPEDEFS(NAME, ...) \
228 P00_TYPEDEFS(NAME, P99_NARG(__VA_ARGS__), __VA_ARGS__)
230 #define P00_DESIGNATED(VAR, N, ...) P99_FOR(VAR, N, P00_SEQ, P00_DESIGNATE, __VA_ARGS__)
253 #define P99_DESIGNATED(VAR, ...) { P00_DESIGNATED(VAR, P99_NARG(__VA_ARGS__), __VA_ARGS__) }
267 #define P99_ADESIGNATED(VAR, N) P99_DESIGNATED(VAR, P99_ACCESSORS(, N))
294 P00_DOCUMENT_MULTIPLE_ARGUMENT(
P99_LCOPY, 1)
296 P00_DOCUMENT_DESIGNATOR_ARGUMENT(
P99_LCOPY, 2)
297 P00_DOCUMENT_DESIGNATOR_ARGUMENT(
P99_LCOPY, 3)
298 P00_DOCUMENT_DESIGNATOR_ARGUMENT(
P99_LCOPY, 4)
299 #define P99_LCOPY(TYPE, VAR, ...) ((TYPE)P99_DESIGNATED(VAR, __VA_ARGS__))
302 #define P00_ACOPY4(TYPE, N, VAR, ...) ((TYPE[N])P99_DESIGNATED(VAR, P00_ACCESSORS(, __VA_ARGS__)))
304 #define P00_ACOPY3(TYPE, N, VAR) P00_ACOPY4(TYPE, N, VAR, N)
321 #define P99_ACOPY(TYPE, N, VAR, M)
323 P00_DOCUMENT_MULTIPLE_ARGUMENT(
P99_ACOPY, 2)
324 P00_DOCUMENT_DECLARATION_ARGUMENT(
P99_ACOPY, 4)
325 #define P99_ACOPY(TYPE, N, ...) \
326 P99_IF_LT(P99_NARG(__VA_ARGS__), 2) \
327 (P00_ACOPY3(TYPE, N, __VA_ARGS__)) \
328 (P00_ACOPY4(TYPE, N, __VA_ARGS__))
355 #define P99_AASSIGN(TARGET, SOURCE, N)
359 #define P99_AASSIGN(TARGET, SOURCE, N) P99_BLOCK(P99_VASSIGNS(SOURCE, P99_ACCESSORS(TARGET, N));)