diff options
author | WormHeamer | 2025-02-28 20:05:25 -0500 |
---|---|---|
committer | WormHeamer | 2025-02-28 20:05:25 -0500 |
commit | d988ad94bb09da0476c18c308e4ae6abeaed24c7 (patch) | |
tree | 7fb3e80f07d45474ef200f1f5dbb8a778a8757f4 | |
parent | 7383a91d15bcc13b8363abd29e2cea5b78315987 (diff) |
add zn_save, zn_load
-rw-r--r-- | zone.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/zone.h b/zone.h index 8199bda..c2e033e 100644 --- a/zone.h +++ b/zone.h @@ -16,8 +16,15 @@ typedef struct { ZoneFrame *tail, *here; } Zone; +typedef struct { + ZoneFrame *zf; + size_t length; +} ZoneState; + void zn_free(Zone *z); void zn_clear(Zone *z); +void zn_save(Zone *z, ZoneState *m); +void zn_load(Zone *z, ZoneState *m); void *zn_alloc(Zone *z, size_t n); void *zn_zf_alloc(Zone *z, ZoneFrame **zf, size_t n); @@ -115,5 +122,22 @@ char *zn_strdup(Zone *z, const char *s) { return d; } +void zn_save(Zone *z, ZoneState *m) { + m->zf = z->here; + m->length = z->here ? z->tail->length : 0; +} + +void zn_load(Zone *z, ZoneState *m) { + if (m->zf) { + while (z->here != m->zf) { + z->here->length = 0; + z->here = z->here->prev; + } + m->zf->length = m->length; + } else { + zn_clear(z); + } +} + #endif #endif |