summaryrefslogtreecommitdiff
path: root/lib/buffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/buffer.h')
-rw-r--r--lib/buffer.h35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/buffer.h b/lib/buffer.h
new file mode 100644
index 00000000..cf073e88
--- /dev/null
+++ b/lib/buffer.h
@@ -0,0 +1,35 @@
+
+#define BUFFER(type) struct { type *data; uint used, size; }
+
+#define BUFFER_SIZE(v) ((v).size * sizeof(* (v).data))
+
+#define BUFFER_INIT(v,pool,isize) \
+ ({ \
+ (v).used = 0; \
+ (v).size = (isize); \
+ (v).data = mb_alloc(pool, BUFFER_SIZE(v)); \
+ })
+
+#define BUFFER_SET(v,nsize) \
+ ({ \
+ (v).used = (nsize); \
+ if ((v).used > (v).size) \
+ buffer_realloc((void **) &((v).data), &((v).size), (v).used, sizeof(* (v).data)); \
+ })
+
+#define BUFFER_INC(v,step) \
+ ({ \
+ uint _o = (v).used; \
+ BUFFER_SET(v, (v).used + (step)); \
+ (v).data + _o; \
+ })
+
+#define BUFFER_DEC(v,step) ({ (v).used -= (step); })
+
+#define BUFFER_PUSH(v) (*BUFFER_INC(v,1))
+
+#define BUFFER_POP(v) BUFFER_DEC(v,1)
+
+#define BUFFER_FLUSH(v) ({ (v).used = 0; })
+
+