summaryrefslogtreecommitdiff
path: root/src/lib/module.c
diff options
context:
space:
mode:
authorpeter <peter@pmikkelsen.com>2026-09-26 21:37:39 +0000
committerpeter <peter@pmikkelsen.com>2026-09-26 21:37:39 +0000
commit5004ca2b03dab15b21631a923ee66e3a45f87c7a (patch)
treeb9c9b30b37785ae3ce21fc8919a512c68db7ed4c /src/lib/module.c
parent1b9a3117c6d37ca9e31629a9f7014860ffb23d8c (diff)
Fix the tests, and delete those which were too hard to deal with for now.
FossilOrigin-Name: 6e677a34a2eb9e4391570f031c8c7055846b1477f40a020beb102358ee97c75a
Diffstat (limited to 'src/lib/module.c')
-rw-r--r--src/lib/module.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/src/lib/module.c b/src/lib/module.c
index aaa9634..9c2cbc2 100644
--- a/src/lib/module.c
+++ b/src/lib/module.c
@@ -72,20 +72,20 @@ read_keyword_decl(struct aplwc *aplwc, struct aplwc_module *module, size_t offse
switch(t(0).data.keyword){
case KW_MODULE:
if((max < 1) || (t(1).tag != TOKEN_TAG_IDENTIFIER))
- goto fail;
+ goto fail_syntax;
len = 1;
break;
case KW_SYMBOL:
if((max < 1) || (t(1).tag != TOKEN_TAG_IDENTIFIER))
- goto fail;
+ goto fail_syntax;
if((max < 2) || (t(2).tag != TOKEN_TAG_UNKNOWN_SYM))
- goto fail;
+ goto fail_syntax;
len = 2;
if((m = add_member(aplwc, module, t(1).data.symbol, NULL, 0)) == NULL)
- goto fail;
+ goto fail_other;
if(add_member(aplwc, module, t(2).data.symbol, m, 0) == NULL)
- goto fail;
+ goto fail_other;
break;
case KW_EXPORT:
for(len = 1; (size_t)len < max; len++){
@@ -93,12 +93,14 @@ read_keyword_decl(struct aplwc *aplwc, struct aplwc_module *module, size_t offse
case TOKEN_TAG_UNKNOWN_SYM:
case TOKEN_TAG_IDENTIFIER:
if(add_member(aplwc, module, t(len).data.symbol, NULL, 1) == NULL)
- goto fail;
+ goto fail_other;
break;
case TOKEN_TAG_NEWLINE:
goto end;
default:
-fail:
+fail_syntax:
+ aplwc->last_error = APLWC_INVALID_SYNTAX;
+fail_other:
len = -1;
goto end;
}
@@ -108,7 +110,7 @@ fail:
if(ALWAYS(len >= 0) && (max > (size_t)len))
if(t(len+1).tag != TOKEN_TAG_NEWLINE)
- goto fail;
+ goto fail_syntax;
len++; /* For the keyword itself */
end:
MEMPTRS_EXIT(aplwc);
@@ -117,7 +119,7 @@ end:
}
static int
-read_function_decl(struct aplwc_module *module, size_t offset)
+read_function_decl(struct aplwc *aplwc, struct aplwc_module *module, size_t offset)
{
int len, ok;
@@ -128,7 +130,11 @@ read_function_decl(struct aplwc_module *module, size_t offset)
break;
}
}
- return ok ? len : -1;
+ if(!ok){
+ len = -1;
+ aplwc->last_error = APLWC_INVALID_SYNTAX;
+ }
+ return len;
}
static int
@@ -141,8 +147,9 @@ read_decl(struct aplwc *aplwc, struct aplwc_module *module, size_t offset)
case TOKEN_TAG_KEYWORD:
return read_keyword_decl(aplwc, module, offset);
case TOKEN_TAG_DEL:
- return read_function_decl(module, offset);
+ return read_function_decl(aplwc, module, offset);
default:
+ aplwc->last_error = APLWC_INVALID_SYNTAX;
return -1;
}
}
@@ -152,27 +159,23 @@ read_decls(struct aplwc *aplwc, struct aplwc_module *module)
{
size_t offset;
int skip;
- enum aplwc_rc rc;
MEMPTRS(aplwc, 1);
MEMPTR(0, module);
- rc = APLWC_OK;
for(offset = 0; offset < module->tokens->length; offset++){
skip = read_decl(aplwc, module, offset);
- if(skip == -1){
- rc = APLWC_INVALID_SYNTAX;
+ if(skip == -1)
goto end;
- }
offset += skip;
}
end:
MEMPTRS_EXIT(aplwc);
- return rc;
+ return aplwc->last_error;
}
-static struct aplwc_module *
+struct aplwc_module *
module_lookup(struct aplwc *aplwc, struct string *name)
{
struct aplwc_module *m;
@@ -193,7 +196,7 @@ resolve_imports(struct aplwc *aplwc, struct aplwc_module *module)
struct module_member *m;
enum aplwc_rc rc;
- MEMPTRS(aplwc, 1);
+ MEMPTRS(aplwc, 3);
MEMPTR(0, module);
rc = APLWC_OK;
@@ -204,6 +207,9 @@ resolve_imports(struct aplwc *aplwc, struct aplwc_module *module)
if((imported = module_lookup(aplwc, name)) == NULL)
goto end; /* only because it is Boot for now... */
+ MEMPTR(1, imported);
+ m = NULL;
+ MEMPTR(2, m);
for(m = imported->members; m; m = m->link){
if(m->exported == 0)
@@ -244,7 +250,7 @@ load_module(struct aplwc *aplwc, struct string *name, struct token_list *tokens)
if((aplwc->last_error = resolve_imports(aplwc, module)) != APLWC_OK)
goto end;
- if((aplwc->last_error = check_tokens(module, tokens)) != APLWC_OK)
+ if((aplwc->last_error = check_tokens(aplwc, module, tokens)) != APLWC_OK)
goto end;
module->link = aplwc->modules;