Merge jrn/db/vcs-svn-housekeeping:vcs-svn into master
[svn-fe.git] / vcs-svn / compat-util.h
blob87993921ea024532c717ed8b1c496d95e27f6253
1 /*
2 * Licensed under a two-clause BSD-style license.
3 * See LICENSE for details.
4 */
6 #ifndef COMPAT_UTIL_H
7 #define COMPAT_UTIL_H
9 #define _POSIX_C_SOURCE 200809L
10 #define _XOPEN_SOURCE 700
11 #include <sys/types.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <inttypes.h>
16 #include <errno.h>
18 #define error(...) (fprintf(stderr, "error: " __VA_ARGS__), -1)
19 #define warning(...) (fprintf(stderr, "warning: " __VA_ARGS__), -1)
20 #define die(...) \
21 do { \
22 fprintf(stderr, "fatal: " __VA_ARGS__); \
23 exit(128); \
24 } while (0)
25 #define die_errno(...) \
26 do { \
27 int _err = errno; \
28 fprintf(stderr, __VA_ARGS__); \
29 fprintf(stderr, ": %s", strerror(_err)); \
30 exit(128); \
31 } while (0)
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;
45 if (nmemb <= *alloc)
46 return;
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))
54 #endif