diff options
Diffstat (limited to 'src/lib/module.c')
| -rw-r--r-- | src/lib/module.c | 65 |
1 files changed, 46 insertions, 19 deletions
diff --git a/src/lib/module.c b/src/lib/module.c index 4ce9f8c..9a202f9 100644 --- a/src/lib/module.c +++ b/src/lib/module.c @@ -1,53 +1,50 @@ #include "aplwc_internal.h" static int -read_keyword_decl(struct token_list *tokens, size_t offset) +read_keyword_decl(struct aplwc_module *module, size_t offset) { int len; - for(len = 1; (offset + len) < tokens->length; len++) - if(tokens->tokens[offset+len].tag == TOKEN_TAG_NEWLINE) + for(len = 1; (offset + len) < module->tokens->length; len++) + if(module->tokens->tokens[offset+len].tag == TOKEN_TAG_NEWLINE) break; return len; } static int -read_function_decl(struct token_list *tokens, size_t offset) +read_function_decl(struct aplwc_module *module, size_t offset) { int len; - for(len = 1; (offset + len) < tokens->length; len++) - if(tokens->tokens[offset+len].tag == TOKEN_TAG_DEL) + for(len = 1; (offset + len) < module->tokens->length; len++) + if(module->tokens->tokens[offset+len].tag == TOKEN_TAG_DEL) break; return len; } static int -read_decl(struct token_list *tokens, size_t offset) +read_decl(struct aplwc_module *module, size_t offset) { - UNUSED_PARAMETER(tokens); - UNUSED_PARAMETER(offset); - - switch(tokens->tokens[offset].tag){ + switch(module->tokens->tokens[offset].tag){ case TOKEN_TAG_NEWLINE: return 0; case TOKEN_TAG_KEYWORD: - return read_keyword_decl(tokens, offset); + return read_keyword_decl(module, offset); case TOKEN_TAG_DEL: - return read_function_decl(tokens, offset); + return read_function_decl(module, offset); default: return -1; } } static enum aplwc_rc -read_decls(struct token_list *tokens) +read_decls(struct aplwc_module *module) { size_t offset; int skip; - for(offset = 0; offset < tokens->length; offset++){ - skip = read_decl(tokens, offset); + for(offset = 0; offset < module->tokens->length; offset++){ + skip = read_decl(module, offset); if(skip == -1) return APLWC_INVALID_SYNTAX; offset += skip; @@ -58,8 +55,38 @@ read_decls(struct token_list *tokens) enum aplwc_rc load_module(struct aplwc *aplwc, struct string *name, struct token_list *tokens) { - UNUSED_PARAMETER(aplwc); - UNUSED_PARAMETER(name); + enum aplwc_rc rc; + struct aplwc_module *module; + + module = memory_alloc_aplwc_module(&aplwc->memory); + if(module == NULL){ + aplwc->last_error = APLWC_OUT_OF_MEMORY; + return aplwc->last_error; + } + module->aplwc = aplwc; + module->name = name; + module->tokens = tokens; + module->link = NULL; - return read_decls(tokens); + rc = read_decls(module); + if(rc == APLWC_OK){ + module->link = aplwc->modules; + aplwc->modules = module; + }else{ + memory_free_aplwc_module(&aplwc->memory, module); + } + + return rc; +} + +struct aplwc_module * +module_lookup(struct aplwc *aplwc, struct string *name) +{ + struct aplwc_module *m; + + for(m = aplwc->modules; m; m = m->link){ + if(string_compare(m->name, name) == 0) + break; + } + return m; } |