summaryrefslogtreecommitdiff
path: root/src/lib/aplwc_internal.h
diff options
context:
space:
mode:
authorpeter <peter@pmikkelsen.com>2026-09-10 21:10:18 +0000
committerpeter <peter@pmikkelsen.com>2026-09-10 21:10:18 +0000
commit9075e91263f6cd74d33d0e078ba9ab77a95f1083 (patch)
tree0c7c66d92a4d26642b4687a7a5db7d2e63a5188f /src/lib/aplwc_internal.h
parentd2cfbd1dcc42f2b5e5f1cb04c20691a20039ad6e (diff)
Work in progress changes for the module system. I am only committing to save my work somewhere, but it doesn't work yet.
FossilOrigin-Name: 45400ea0e451183f360a3d0cbb14f262cbec2e62167bad732fd396ed0ce4acaf
Diffstat (limited to 'src/lib/aplwc_internal.h')
-rw-r--r--src/lib/aplwc_internal.h42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/lib/aplwc_internal.h b/src/lib/aplwc_internal.h
index d97cbf7..0bdd5b5 100644
--- a/src/lib/aplwc_internal.h
+++ b/src/lib/aplwc_internal.h
@@ -27,10 +27,22 @@
#include <stdbool.h>
#include <string.h>
+typedef int symbol_t;
+
+enum keyword {
+ KW_MODULE,
+ KW_SYMBOL,
+ KW_EXPORT,
+
+ N_KWDS
+};
+
struct aplwc {
struct aplwc_fns fns;
enum aplwc_rc last_error;
struct aplwc_module *modules;
+ struct symbol *symtab;
+ symbol_t keyword_symbols[N_KWDS];
/* Memory management */
uint8_t *data;
@@ -79,6 +91,10 @@ struct token {
enum token_tag tag;
size_t start;
size_t end;
+ union {
+ symbol_t symbol;
+ enum keyword keyword;
+ } data;
};
struct token_list {
@@ -99,9 +115,25 @@ struct aplwc_value {
struct aplwc_module {
struct string *name;
struct token_list *tokens;
+ struct module_member *imports;
+ struct module_member *members;
struct aplwc_module *link;
};
+struct module_member {
+ int exported;
+ struct aplwc_module *module;
+ symbol_t name;
+ struct module_member *real_member; /* a symbol points to its identifier member. An imported symbol points to the defining member */
+ struct module_member *link;
+};
+
+struct symbol {
+ symbol_t id;
+ struct string *text;
+ struct symbol *link;
+};
+
/* eval.c */
struct aplwc_value *eval_line(struct aplwc *, struct aplwc_line *);
@@ -113,7 +145,8 @@ 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 module_member *memory_alloc_module_member(struct aplwc *);
+struct symbol *memory_alloc_symbol(struct aplwc *);
void memory_root_new(struct aplwc *, void *, struct aplwc_ref *);
void *memory_root_get(struct aplwc_ref *);
void memory_root_free(struct aplwc_ref *);
@@ -134,10 +167,15 @@ struct string *chars_to_string(struct aplwc *, const char *, int len);
uint32_t string_char(struct string *, size_t);
size_t char_length(struct string *, size_t);
int string_compare(struct string *, struct string *);
+struct string *substring(struct aplwc *, struct string *, size_t, size_t);
/* syntax.c */
struct token_list *scan_string(struct aplwc *, struct string *, int);
-enum aplwc_rc check_tokens(struct token_list *);
+enum aplwc_rc check_tokens(struct aplwc_module *, struct token_list *);
+enum aplwc_rc keyword_init(struct aplwc *);
+
+/* symtab.c */
+enum aplwc_rc getsym(struct aplwc *, struct string *, symbol_t *);
/* module.c */
enum aplwc_rc load_module(struct aplwc *, struct string *, struct token_list *);