From 8142854950bc510b8c21a210538d14a301dbcf63 Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Fri, 18 Oct 2019 20:46:58 +0300 Subject: skel update --- macro.h | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'macro.h') diff --git a/macro.h b/macro.h index c91b8cf..5a55e10 100644 --- a/macro.h +++ b/macro.h @@ -4,7 +4,7 @@ #include #include -#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 -- cgit v1.2.3-70-g09d2