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.h66
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);