#include "aplwc_internal.h" static int read_keyword_decl(struct aplwc_module *module, size_t offset) { int len; 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 aplwc_module *module, size_t offset) { int len; 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 aplwc_module *module, size_t offset) { switch(module->tokens->tokens[offset].tag){ case TOKEN_TAG_NEWLINE: return 0; case TOKEN_TAG_KEYWORD: return read_keyword_decl(module, offset); case TOKEN_TAG_DEL: return read_function_decl(module, offset); default: return -1; } } static enum aplwc_rc read_decls(struct aplwc_module *module) { size_t offset; int skip; for(offset = 0; offset < module->tokens->length; offset++){ skip = read_decl(module, offset); if(skip == -1) return APLWC_INVALID_SYNTAX; offset += skip; } return APLWC_OK; } enum aplwc_rc load_module(struct aplwc *aplwc, struct string *name, struct token_list *tokens) { enum aplwc_rc rc; struct aplwc_module *module; module = memory_alloc_aplwc_module(aplwc); 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; rc = read_decls(module); if(rc == APLWC_OK){ module->link = aplwc->modules; aplwc->modules = module; }else{ memory_free_aplwc_module(aplwc, 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; }