summaryrefslogtreecommitdiff
path: root/macro.h
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2019-10-18 20:46:58 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2019-10-18 21:14:24 +0300
commit8142854950bc510b8c21a210538d14a301dbcf63 (patch)
treedb4ecc964090218f50f1e9c4a8797544f9d45879 /macro.h
parent3b00c7be0e8834402ed93eb42b3a93302076c5ff (diff)
skel update
Diffstat (limited to 'macro.h')
-rw-r--r--macro.h43
1 files changed, 42 insertions, 1 deletions
diff --git a/macro.h b/macro.h
index c91b8cf..5a55e10 100644
--- a/macro.h
+++ b/macro.h
@@ -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