summaryrefslogtreecommitdiff
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