diff options
Diffstat (limited to 'macro.h')
| -rw-r--r-- | macro.h | 43 |
1 files changed, 42 insertions, 1 deletions
@@ -4,7 +4,7 @@ #include <stdlib.h> #include <string.h> -#define _new(t) memset(malloc(sizeof(t)), 0, sizeof(t)) +#define _new(T, ...) ({ T __v = { __VA_ARGS__ }; _copy(&__v); }) #define _copy(p, ...) _copy_(p, ## __VA_ARGS__, sizeof(*p)) #define _copy_(p, n, ...) memcpy(malloc(n), p, n) @@ -22,4 +22,45 @@ int UNIQ(defer_var) __cleanup(UNIQ(defer_func)); \ void UNIQ(defer_func)(int *p __unused) +static __unused void __let_nothing(void) +{ +} + +#define let(p, e, ...) let_(p, e, ## __VA_ARGS__, __let_nothing) +#define let_(p, e, f, ...) \ + for (int step = 1; step; ) \ + for (typeof(e) p = e; step; f(p), step = 0) + +static inline int lenv(void **pp) +{ + int count = 0; + + if (pp) { + for (; *pp; pp++) + count++; + } + + return count; +} + +#define lenv(v) lenv((void **) v) + +static inline void **addv(void ***v, void *p) +{ + if (! v) { + *v = calloc(2, sizeof(*v)); + **v = p; + } else { + int len = lenv(*v); + + *v = realloc(*v, sizeof(*v) * (len + 2)); + (*v)[len] = p; + (*v)[len + 1] = NULL; + } + + return *v; +} + +#define addv(v, p) addv((void ***) v, p) + #endif |
