#ifndef MODULE_H #define MODULE_H #include "ast.h" #include "limits.h" #include "parser.h" #include "symtab.h" /* Extension for source files */ #define SOURCE_EXT ".rad" /* Error codes for module loading */ enum { MODULE_OK = 0, MODULE_NOT_FOUND = 1, MODULE_PARSE_ERROR = 2, MODULE_TYPE_ERROR = 3, MODULE_CIRCULAR_DEP = 4 }; /* State of a module in the dependency graph */ typedef enum { MODULE_STATE_UNVISITED = 0, MODULE_STATE_VISITING = 1, MODULE_STATE_VISITED = 2 } module_state_t; typedef struct module_t module_t; struct module_t { char path[MAX_PATH_LEN]; char name[MAX_PATH_LEN]; char qualified[MAX_PATH_LEN]; attrib_t attribs; node_t *ast; char *source; parser_t parser; module_state_t state; scope_t *scope; symbol_t *default_fn; bool declared; bool checked; bool compiled; module_t *parent; module_t *children[MAX_MODULES]; u8 nchildren; }; typedef struct { module_t *root; module_t modules[MAX_MODULES]; u8 nmodules; char rootdir[MAX_PATH_LEN]; } module_manager_t; void module_manager_init(module_manager_t *mm, const char *entryfile); bool module_manager_parse(module_manager_t *mm, int *err); module_t *module_manager_register(module_manager_t *mm, const char *path); module_t *module_manager_register_qualified( module_manager_t *mm, const char *path, const char *qualified ); module_t *module_manager_lookup(module_manager_t *mm, const char *path); module_t *module_manager_lookup_by_name( module_manager_t *mm, const char *name, u16 length ); module_t *module_manager_lookup_by_qualified_name( module_manager_t *mm, const char *name ); module_t *module_manager_find_relative( module_manager_t *mm, const char *base_path, const char *import_path ); bool module_parse(module_t *module, int *err); void module_qualify(char dest[MAX_QUALIFIED_NAME], node_t *ident); void module_qualify_str( char dest[MAX_QUALIFIED_NAME], const char *child, u16 len ); void module_path(char dest[MAX_QUALIFIED_NAME], const char *name); void module_register_test(module_t *mod, node_t *test); #endif