diff options
author | WormHeamer | 2025-03-05 04:54:37 -0500 |
---|---|---|
committer | WormHeamer | 2025-03-05 04:54:37 -0500 |
commit | 823bd5441ba7a8f69d56a775dbc8d36446032113 (patch) | |
tree | d6d905db5d08a22b9a5d35135bcdca89f8dd4c1c | |
parent | 362d66c4caf89a76ec87bb601791c651efddceb7 (diff) |
add zn_begin and zn_end
-rw-r--r-- | zone.h | 34 |
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 |