diff options
Diffstat (limited to 'src/lib/aplwc_internal.h')
| -rw-r--r-- | src/lib/aplwc_internal.h | 66 |
1 files changed, 42 insertions, 24 deletions
diff --git a/src/lib/aplwc_internal.h b/src/lib/aplwc_internal.h index e394bd8..b87cfad 100644 --- a/src/lib/aplwc_internal.h +++ b/src/lib/aplwc_internal.h @@ -8,20 +8,32 @@ #include <stdbool.h> #include <string.h> -struct memory { +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 root_ptr *rootptrs; }; -struct aplwc { - enum aplwc_rc last_error; - struct memory memory; - struct aplwc_module *modules; +struct memory_ptr_frame { + struct memory_ptr_frame *link; + void ***ptrs; + size_t count; +}; + +struct root_ptr { + int id; + void *ptr; + struct root_ptr *link; }; struct aplwc_line { - struct aplwc *aplwc; struct string *text; struct token_list *tokens; }; @@ -66,35 +78,41 @@ enum value_tag { }; struct aplwc_value { - struct aplwc *aplwc; enum value_tag tag; }; struct aplwc_module { - struct aplwc *aplwc; struct string *name; struct token_list *tokens; struct aplwc_module *link; }; /* eval.c */ -struct aplwc_value *eval_line(struct aplwc_line *); +struct aplwc_value *eval_line(struct aplwc *, struct aplwc_line *); /* memory.c */ -struct memory memory_init(uint8_t *, size_t); -struct aplwc *memory_alloc_aplwc(struct memory *); -struct aplwc_line *memory_alloc_aplwc_line(struct memory *); -struct string *memory_alloc_string(struct memory *, size_t); -struct token_list *memory_alloc_token_list(struct memory *, size_t); -struct aplwc_value *memory_alloc_aplwc_value(struct memory *); -struct aplwc_module *memory_alloc_aplwc_module(struct memory *); -struct module_imports *memory_alloc_module_imports(struct memory *, size_t); -void memory_free_aplwc(struct memory *, struct aplwc *); -void memory_free_aplwc_line(struct memory *, struct aplwc_line *); -void memory_free_string(struct memory *, struct string *); -void memory_free_token_list(struct memory *, struct token_list *); -void memory_free_aplwc_value(struct memory *, struct aplwc_value *); -void memory_free_aplwc_module(struct memory *, struct aplwc_module *); +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); +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); +struct aplwc_ref memory_root_new(struct aplwc *, void *); +void *memory_root_get(struct aplwc_ref); +void memory_root_free(struct aplwc_ref); +void memptrs_add(struct aplwc *, struct memory_ptr_frame *, void ***, size_t); +void memptrs_remove(struct aplwc *, struct memory_ptr_frame *); +void clear_ref(struct aplwc_ref *); +int valid_ref(struct aplwc_ref); + +#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); |