#ifndef APLWC_INTERNAL_H #define APLWC_INTERNAL_H #include #include #include #include #include #include struct aplwc { enum aplwc_rc last_error; struct aplwc_module *modules; /* Memory management */ uint8_t *data; size_t size; size_t offset; }; struct aplwc_line { struct aplwc *aplwc; struct string *text; struct token_list *tokens; }; struct string { size_t bytes; size_t chars; uint8_t utf8[1]; }; enum token_tag { TOKEN_TAG_IDENTIFIER, TOKEN_TAG_NEWLINE, TOKEN_TAG_NUMBER, TOKEN_TAG_LEFT_ARROW, TOKEN_TAG_DIAMOND, TOKEN_TAG_KEYWORD, TOKEN_TAG_TEXT, TOKEN_TAG_DEL, TOKEN_TAG_LEFT_PAREN, TOKEN_TAG_RIGHT_PAREN, TOKEN_TAG_IBEAM, TOKEN_TAG_QUAD, TOKEN_TAG_UNKNOWN_SYM }; struct token { enum token_tag tag; size_t start; size_t end; }; struct token_list { struct string *text; size_t length; struct token tokens[1]; }; enum value_tag { VALUE_NULL, VALUE_NUMBER }; struct aplwc_value { struct aplwc *aplwc; enum value_tag tag; }; struct aplwc_module { struct aplwc *aplwc; struct string *name; struct token_list *tokens; struct aplwc_module *link; }; /* eval.c */ struct aplwc_value *eval_line(struct aplwc_line *); /* memory.c */ void memory_init(struct aplwc *, uint8_t *, size_t); struct aplwc *memory_alloc_aplwc(struct aplwc *); struct aplwc_line *memory_alloc_aplwc_line(struct aplwc *); struct string *memory_alloc_string(struct aplwc *, size_t); struct token_list *memory_alloc_token_list(struct aplwc *, size_t); struct aplwc_value *memory_alloc_aplwc_value(struct aplwc *); struct aplwc_module *memory_alloc_aplwc_module(struct aplwc *); struct module_imports *memory_alloc_module_imports(struct aplwc *, size_t); void memory_free_root(struct aplwc *, void *); /* string.c */ struct string *chars_to_string(struct aplwc *, const char *, int len); uint32_t string_char(struct string *, size_t); size_t char_length(struct string *, size_t); int string_compare(struct string *, struct string *); /* syntax.c */ struct token_list *scan_string(struct aplwc *, struct string *, int); enum aplwc_rc check_tokens(struct token_list *); /* module.c */ enum aplwc_rc load_module(struct aplwc *, struct string *, struct token_list *); struct aplwc_module *module_lookup(struct aplwc *, struct string *); struct string *module_imports_syms(struct module_imports *); #endif /* APLWC_INTERNAL_H */