summary refs log tree commit diff
diff options
context:
space:
mode:
authorWormHeamer2025-03-05 04:54:37 -0500
committerWormHeamer2025-03-05 04:54:37 -0500
commit823bd5441ba7a8f69d56a775dbc8d36446032113 (patch)
treed6d905db5d08a22b9a5d35135bcdca89f8dd4c1c
parent362d66c4caf89a76ec87bb601791c651efddceb7 (diff)
add zn_begin and zn_end
-rw-r--r--zone.h34
1 files changed, 27 insertions, 7 deletions
diff --git a/zone.h b/zone.h
index 7849ce6..59ffe2b 100644
--- a/zone.h
+++ b/zone.h
@@ -21,17 +21,24 @@ struct ZoneFrame {
 	uint8_t data[];
 };
 
-typedef struct {
-	ZoneFrame *cur, *tail;
-} Zone;
+typedef struct ZoneState ZoneState;
 
-typedef struct {
+struct ZoneState {
 	ZoneFrame *zf;
+	ZoneState *last;
 	uint8_t *beg;
-} ZoneState;
+};
+
+typedef struct {
+	ZoneFrame *cur, *tail;
+	ZoneState *last;
+} Zone;
 
 void zn_free(Zone *z);
 void zn_reset(Zone *z);
+
+void zn_begin(Zone *z);
+void zn_end(Zone *z);
 void zn_save(Zone *z, ZoneState *m);
 void zn_load(Zone *z, ZoneState *m);
 
@@ -43,6 +50,7 @@ void *zn_realloc_align(Zone *z, void *ptr, ptrdiff_t oldsz, ptrdiff_t newsz, siz
 char *zn_strdup(Zone *z, const char *s);
 void *zn_zeroed(void *, size_t);
 
+#define alignof _Alignof
 #define zn_new(z, t) (t*)zn_zeroed(zn_alloc_align(z, sizeof(t), alignof(t)), sizeof(t))
 
 #ifdef ZONE_IMPL
@@ -51,8 +59,6 @@ void *zn_zeroed(void *, size_t);
 #include <stdlib.h>
 #include <string.h>
 
-#include "zone.h"
-
 #ifndef ZONE_PAGE_MULT
 #define ZONE_PAGE_MULT 2
 #endif
@@ -182,6 +188,7 @@ void zn_reset(Zone *z) {
 void zn_save(Zone *z, ZoneState *m) {
 	m->zf = z->cur;
 	m->beg = z->cur ? z->cur->beg : 0;
+	m->last = z->last;
 }
 
 void zn_load(Zone *z, ZoneState *m) {
@@ -194,6 +201,7 @@ void zn_load(Zone *z, ZoneState *m) {
 	} else {
 		zn_reset(z);
 	}
+	z->last = m->last;
 }
 
 /* utils */
@@ -210,5 +218,17 @@ void *zn_zeroed(void *ptr, size_t n) {
 	return ptr;
 }
 
+void zn_begin(Zone *z) {
+	ZoneState m = { 0 };
+	zn_save(z, &m);
+	ZoneState *p = zn_new(z, ZoneState);
+	*p = m;
+	z->last = p;
+}
+
+void zn_end(Zone *z) {
+	zn_load(z, z->last);
+}
+
 #endif
 #endif