diff options
Diffstat (limited to 'src/lib/aplwc_internal.h')
| -rw-r--r-- | src/lib/aplwc_internal.h | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/lib/aplwc_internal.h b/src/lib/aplwc_internal.h index 23b26f9..a7b7030 100644 --- a/src/lib/aplwc_internal.h +++ b/src/lib/aplwc_internal.h @@ -9,13 +9,21 @@ #include <string.h> struct aplwc { + struct aplwc_fns fns; enum aplwc_rc last_error; struct aplwc_module *modules; /* Memory management */ uint8_t *data; + uint8_t *unaligned_data; size_t size; - size_t offset; + struct memory_ptr_frame *memptrs; +}; + +struct memory_ptr_frame { + struct memory_ptr_frame *link; + void ***ptrs; + size_t count; }; struct aplwc_line { @@ -79,8 +87,8 @@ struct aplwc_module { struct aplwc_value *eval_line(struct aplwc_line *); /* memory.c */ -void memory_init(struct aplwc *, uint8_t *, size_t); -struct aplwc *memory_alloc_aplwc(struct aplwc *); +void memory_init(struct aplwc *); +void memory_destroy(struct aplwc *); struct aplwc_line *memory_alloc_aplwc_line(struct aplwc *); struct string *memory_alloc_string(struct aplwc *, size_t); struct token_list *memory_alloc_token_list(struct aplwc *, size_t); @@ -88,6 +96,15 @@ struct aplwc_value *memory_alloc_aplwc_value(struct aplwc *); struct aplwc_module *memory_alloc_aplwc_module(struct aplwc *); struct module_imports *memory_alloc_module_imports(struct aplwc *, size_t); void memory_free_root(struct aplwc *, void *); +void memptrs_add(struct aplwc *, struct memory_ptr_frame *, void ***, size_t); +void memptrs_remove(struct aplwc *, struct memory_ptr_frame *); + +#define MEMPTRS(aplwc, n) \ + void **memptrs[n]; \ + struct memory_ptr_frame memptrs_frame; \ + memptrs_add(aplwc, &memptrs_frame, memptrs, n); +#define MEMPTR(n, ptr) memptrs[n] = (void **)&ptr +#define MEMPTRS_EXIT(aplwc) memptrs_remove(aplwc, &memptrs_frame) /* string.c */ struct string *chars_to_string(struct aplwc *, const char *, int len); |