2 * Licensed under a two-clause BSD-style license.
3 * See LICENSE for details.
9 #define _POSIX_C_SOURCE 200809L
10 #define _XOPEN_SOURCE 700
11 #include <sys/types.h>
18 #define error(...) (fprintf(stderr, "error: " __VA_ARGS__), -1)
19 #define warning(...) (fprintf(stderr, "warning: " __VA_ARGS__), -1)
22 fprintf(stderr, "fatal: " __VA_ARGS__); \
25 #define die_errno(...) \
28 fprintf(stderr, __VA_ARGS__); \
29 fprintf(stderr, ": %s", strerror(_err)); \
33 #define maximum_signed_value_of_type(a) \
34 (INTMAX_MAX >> (8 * (sizeof(intmax_t) - sizeof(a))))
35 #define signed_add_overflows(a, b) \
36 ((b) > maximum_signed_value_of_type(a) - (a))
37 #define unsigned_add_overflows(a, b) ((a) + (b) < (a))
39 /* rate of growth taken from git. */
40 static inline void alloc_grow(void **array
, size_t nmemb
,
41 size_t *alloc
, size_t elemsize
)
43 const size_t newalloc
= (*alloc
+ 16) * 3 / 2;
47 *alloc
= newalloc
< nmemb
? nmemb
: newalloc
;
48 *array
= realloc(*array
, *alloc
* elemsize
);
51 #define ALLOC_GROW(array, sz, alloc) \
52 alloc_grow((void **) &array, sz, &alloc, sizeof(*array))