aboutsummaryrefslogtreecommitdiff
path: root/util.h
diff options
context:
space:
mode:
Diffstat (limited to 'util.h')
-rw-r--r--util.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/util.h b/util.h
index 416c0b3e..90ac8b3d 100644
--- a/util.h
+++ b/util.h
@@ -26,4 +26,29 @@ char *heap_str(const char *str);
char *heap_strf(const char *fmt, ...);
CORD CORD_asprintf(const char *fmt, ...);
+#define REVERSE_LIST(list) do { \
+ __typeof(list) _prev = NULL; \
+ __typeof(list) _next = NULL; \
+ auto _current = list; \
+ while (_current != NULL) { \
+ _next = _current->next; \
+ _current->next = _prev; \
+ _prev = _current; \
+ _current = _next; \
+ } \
+ list = _prev; \
+} while(0)
+
+#define LIST_MAP(src, var, ...) ({\
+ __typeof(src) __mapped = NULL; \
+ __typeof(src) *__next = &__mapped; \
+ for (__typeof(src) var = src; var; var = var->next) { \
+ *__next = GC_MALLOC(sizeof(__typeof(*(src)))); \
+ **__next = *var; \
+ **__next = (__typeof(*(src))){__VA_ARGS__}; \
+ __next = &((*__next)->next); \
+ } \
+ __mapped; })
+
+
// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0