module.h 2.2 KiB raw
1
#ifndef MODULE_H
2
#define MODULE_H
3
4
#include "ast.h"
5
#include "limits.h"
6
#include "parser.h"
7
#include "symtab.h"
8
9
/* Extension for source files */
10
#define SOURCE_EXT ".rad"
11
12
/* Error codes for module loading */
13
enum {
14
    MODULE_OK           = 0,
15
    MODULE_NOT_FOUND    = 1,
16
    MODULE_PARSE_ERROR  = 2,
17
    MODULE_TYPE_ERROR   = 3,
18
    MODULE_CIRCULAR_DEP = 4
19
};
20
21
/* State of a module in the dependency graph */
22
typedef enum {
23
    MODULE_STATE_UNVISITED = 0,
24
    MODULE_STATE_VISITING  = 1,
25
    MODULE_STATE_VISITED   = 2
26
} module_state_t;
27
28
typedef struct module_t module_t;
29
30
struct module_t {
31
    char           path[MAX_PATH_LEN];
32
    char           name[MAX_PATH_LEN];
33
    char           qualified[MAX_PATH_LEN];
34
    attrib_t       attribs;
35
    node_t        *ast;
36
    char          *source;
37
    parser_t       parser;
38
    module_state_t state;
39
    scope_t       *scope;
40
    symbol_t      *default_fn;
41
    bool           declared;
42
    bool           checked;
43
    bool           compiled;
44
    module_t      *parent;
45
    module_t      *children[MAX_MODULES];
46
    u8             nchildren;
47
};
48
49
typedef struct {
50
    module_t *root;
51
    module_t  modules[MAX_MODULES];
52
    u8        nmodules;
53
    char      rootdir[MAX_PATH_LEN];
54
} module_manager_t;
55
56
void      module_manager_init(module_manager_t *mm, const char *entryfile);
57
bool      module_manager_parse(module_manager_t *mm, int *err);
58
module_t *module_manager_register(module_manager_t *mm, const char *path);
59
module_t *module_manager_register_qualified(
60
    module_manager_t *mm, const char *path, const char *qualified
61
);
62
module_t *module_manager_lookup(module_manager_t *mm, const char *path);
63
module_t *module_manager_lookup_by_name(
64
    module_manager_t *mm, const char *name, u16 length
65
);
66
module_t *module_manager_lookup_by_qualified_name(
67
    module_manager_t *mm, const char *name
68
);
69
module_t *module_manager_find_relative(
70
    module_manager_t *mm, const char *base_path, const char *import_path
71
);
72
bool module_parse(module_t *module, int *err);
73
void module_qualify(char dest[MAX_QUALIFIED_NAME], node_t *ident);
74
void module_qualify_str(
75
    char dest[MAX_QUALIFIED_NAME], const char *child, u16 len
76
);
77
void module_path(char dest[MAX_QUALIFIED_NAME], const char *name);
78
void module_register_test(module_t *mod, node_t *test);
79
80
#endif