63 P00_DOCUMENT_PERMITTED_ARGUMENT(
P99_PZERO, 0)
64 #define P99_PZERO(X, N) (memset((X), 0, sizeof(X[0]) * N))
77 P00_DOCUMENT_PERMITTED_ARGUMENT(
P99_TZERO, 0)
78 #define P99_TZERO(X) (memset(&(X), 0, sizeof(X)))
82 (*p00_memcpy(
size_t p00_len,
unsigned char (*p00_tar)[p00_len],
unsigned char const (*p00_src)[p00_len]))[] {
83 memcpy(&(*p00_tar)[0], &(*p00_src)[0], p00_len);
87 P00_DOCUMENT_TYPE_ARGUMENT(
P99_ASUB, 1)
88 #define P99_ASUB(X, T, N, L) \
93 (P99_LVAL(T*, &((*X)[N]))) \
98 (*p00_initialize(
size_t p00_len,
unsigned char (*p00_base)[p00_len],
size_t p00_init))[] {
99 for (; (p00_init * 2u) <= p00_len; p00_init *= 2u) {
101 P99_ASUB(p00_base,
unsigned char, p00_init, p00_init),
102 P99_ASUB(p00_base,
unsigned char const, 0, p00_init));
104 if (p00_len > p00_init) {
107 P99_ASUB(p00_base,
unsigned char, p00_init, p00_len),
108 P99_ASUB(p00_base,
unsigned char const, 0, p00_len));
113 #if ((P99_COMPILER & P99_COMPILER_GNU) && (P99_GCC_VERSION < 40704UL))
114 # define P00_ABLESS_BUG 1
117 #if defined(P99_TYPEOF) && !P00_ABLESS_BUG
118 # define P00_ABLESS(X, ...) ((P99_TYPEOF(__VA_ARGS__)*restrict)(unsigned char(*)[sizeof(__VA_ARGS__)]){ X })
120 # define P00_ABLESS(X, ...) ((void*restrict)(unsigned char(*)[sizeof(__VA_ARGS__)]){ X })
123 #define P00_APLAIN(X, N) ((unsigned char(*)[N])(X))
124 #define P99_APLAIN(...) \
125 (P99_IF_LT_2(P99_NARG(__VA_ARGS__)) \
126 (P00_APLAIN(__VA_ARGS__, sizeof(*__VA_ARGS__))) \
127 (P00_APLAIN(__VA_ARGS__)) \
131 void* p00_memset(
void* p00_tar,
void const* p00_src,
size_t p00_size,
size_t p00_nb) {
132 p00_initialize(p00_nb * p00_size,
133 P00_APLAIN(memcpy(p00_tar, p00_src, p00_size), p00_size),
152 #define P99_MEMSET(TA, SO, N) p00_memset((TA), (void const*)&(SO), sizeof(SO), N)
165 #define P99_MEMZERO(T, TA, N) p00_memset((TA), (void const*)&P99_LVAL(const T), sizeof(T), N)
191 #define P99_MALLOC(X) malloc(sizeof(X))
194 #define P00_VMALLOC(X) P00_ABLESS(P99_MALLOC(X), X)
196 #define P00_INITIALIZE(X, L) \
197 p00_initialize(sizeof(*X), \
198 P00_APLAIN(memcpy((X), (L), sizeof(*L)), sizeof(*X)), \
203 #define P99_INITIALIZE(X, L) P00_ABLESS(P00_INITIALIZE((X), (L)), *(X))
205 #define P00_ALLOC(X, L) \
206 P00_ABLESS(p00_initialize(sizeof(X), \
207 P00_APLAIN(memcpy(P99_MALLOC(X), (&L), sizeof(L)), sizeof(X)), \
211 #define P99_ALLOC(...) P99_IF_GT(P99_NARG(__VA_ARGS__), 1)(P00_ALLOC(__VA_ARGS__))(P00_VMALLOC(__VA_ARGS__))
229 #define P99_REALLOC(X, T) realloc((X), sizeof(T))
232 void* p00_calloc(
void const* p00_src,
size_t p00_size,
size_t p00_nb) {
233 return p00_memset(malloc(p00_size*p00_nb), p00_src, p00_size, p00_nb);
236 #define P00_CALLOC0(T, N) p00_calloc((void const*)&P99_LVAL(const T), sizeof(T), N)
237 #define P00_CALLOC(...) P00_CALLOC0(__VA_ARGS__)
269 #define P99_CALLOC(T, N)
272 #define P99_CALLOC(...) P00_CALLOC(P99_CALL_DEFARG_LIST(P00_CALLOC, 2, __VA_ARGS__))
275 #define P00_CALLOC_defarg_1() 1
277 #define P00_NEW(T) P99_PASTE2(T, _init)(P99_MALLOC(T))
279 #define P00_NEW_ARGS(T, ...) P99_PASTE2(T, _init)(P99_MALLOC(T), __VA_ARGS__)
315 #define P99_NEW(...) P99_IF_LT(P99_NARG(__VA_ARGS__), 2)(P00_NEW(__VA_ARGS__))(P00_NEW_ARGS(__VA_ARGS__))
329 #define P99_DECLARE_DELETE(T) \
335 void P99_PASTE2(T, _delete)(T const*p00_el) { }
337 #define P99_DEFINE_DELETE(T) P99_INSTANTIATE(void, P99_PASTE2(T, _delete), T const*)
340 #define P99_DECLARE_DELETE(...) \
341 P99_IF_LT(P99_NARG(__VA_ARGS__), 2) \
342 (P00_DECLARE_DELETE(__VA_ARGS__, p99_inline)) \
343 (P00_DECLARE_DELETE(__VA_ARGS__)) \
344 P99_MACRO_END(P99_DECLARE_DELETE)
345 #define P99_DEFINE_DELETE(...) P00_DEFINE_DELETE(__VA_ARGS__,)
348 #define P00_DECLARE_DELETE(T, ...) \
350 void P99_PASTE2(T, _delete)(T const*p00_el) { \
352 T* p00_e = (T*)p00_el; \
353 P99_PASTE2(T, _destroy)(p00_e); \
354 free((void*)p00_e); \
358 #define P00_DEFINE_DELETE(T, ...) P99_INSTANTIATE(void, P99_PASTE2(T, _delete), T const*)
362 size_t p99_maxof(
size_t p00_m,
size_t p00_n) {
363 return p00_m < p00_n ? p00_n : p00_m;
366 P00_DOCUMENT_MULTIPLE_ARGUMENT(
P99_MINOF, 0)
368 #define P99_MAXOF(A, B) ((A) < (B) ? (B) : (A))
370 P00_DOCUMENT_MULTIPLE_ARGUMENT(
P99_MAXOF, 0)
372 #define P99_MINOF(A, B) ((A) < (B) ? (A) : (B))
374 #define P00_SIZEOF2(T, ...) sizeof(P99_TOKJOIN(., P99_LVAL(const T), __VA_ARGS__))
382 #define P99_SIZEOF(T, F, ...) P99_IF_EQ(P99_NARG(__VA_ARGS__), 1)(sizeof(__VA_ARGS__))(P00_SIZEOF2(__VA_ARGS__))
384 #define P99_SIZEOF(...) P99_IF_EQ(P99_NARG(__VA_ARGS__), 1)(sizeof(__VA_ARGS__))(P00_SIZEOF2(__VA_ARGS__))
447 #define P99_FHEAD(T, F, P) ((T*)(((char*)P) - offsetof(T, F)))
457 #define P99_FSIZEOF(T, F, N) P99_MAXOF(sizeof(T), offsetof(T, F) + P99_SIZEOF(T, F[0]) * N)
458 #define P00_FSIZEOF(T, F, M) p99_maxof(sizeof(T), offsetof(T, F) + M)
460 #define P00_FREALLOC(P, T, F, M) realloc(P, P00_FSIZEOF(T, F, M))
475 #define P99_FREALLOC(P, T, F, N) realloc(P, P99_FSIZEOF(T, F, N))
487 #define P99_FMALLOC(T, F, N) malloc(P99_FSIZEOF(T, F, N))
488 #define P00_FMALLOC(T, F, M) malloc(P00_FSIZEOF(T, F, M))
499 #define P99_FCALLOC(T, F, N) calloc(P99_FSIZEOF(T, F, N),1)
500 #define P00_FCALLOC(T, F, M) calloc(P00_FSIZEOF(T, F, M),1)