summaryrefslogtreecommitdiff
path: root/src/lib/aplwc_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/aplwc_internal.h')
-rw-r--r--src/lib/aplwc_internal.h23
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);