diff options
| -rw-r--r-- | ast.c | 24 | ||||
| -rw-r--r-- | io.c | 15 | ||||
| -rw-r--r-- | parse.c | 12 | ||||
| -rw-r--r-- | preprocess.c | 29 | ||||
| -rw-r--r-- | std.h | 1 |
5 files changed, 56 insertions, 25 deletions
@@ -198,7 +198,8 @@ enum AstNodeKind { typedef enum AstNodeKind AstNodeKind; #define node_items __n1 -#define node_len __i +#define node_len __i1 +#define node_cap __i2 #define node_expr __n1 #define node_lhs __n1 #define node_rhs __n2 @@ -212,10 +213,10 @@ typedef enum AstNodeKind AstNodeKind; #define node_members __n1 #define node_params __n1 #define node_args __n1 -#define node_int_value __i -#define node_idx __i -#define node_op __i -#define node_stack_offset __i +#define node_int_value __i1 +#define node_idx __i1 +#define node_op __i1 +#define node_stack_offset __i1 struct AstNode { AstNodeKind kind; @@ -225,7 +226,8 @@ struct AstNode { struct AstNode* __n2; struct AstNode* __n3; struct AstNode* __n4; - int __i; + int __i1; + int __i2; }; typedef struct AstNode AstNode; @@ -243,9 +245,12 @@ AstNode* ast_new(AstNodeKind kind) { } AstNode* ast_new_list(int capacity) { + if (capacity == 0) + unreachable(); AstNode* list = ast_new(AstNodeKind_list); - list->node_items = calloc(capacity, sizeof(AstNode)); + list->node_cap = capacity; list->node_len = 0; + list->node_items = calloc(list->node_cap, sizeof(AstNode)); return list; } @@ -256,6 +261,11 @@ void ast_append(AstNode* list, AstNode* item) { if (!item) { return; } + if (list->node_cap <= list->node_len) { + list->node_cap *= 2; + list->node_items = realloc(list->node_items, sizeof(AstNode) * list->node_cap); + memset(list->node_items + list->node_len, 0, sizeof(AstNode) * (list->node_cap - list->node_len)); + } memcpy(list->node_items + list->node_len, item, sizeof(AstNode)); ++list->node_len; } @@ -14,11 +14,24 @@ InFile* read_all(const char* filename) { if (!in) { return NULL; } - char* buf = calloc(1024 * 1024, sizeof(char)); + + size_t buf_size = 1024 * 10; + char* buf = calloc(buf_size, sizeof(char)); char* cur = buf; char* tmp = calloc(1024, sizeof(char)); + while (fgets(tmp, 1024, in)) { size_t len = strlen(tmp); + size_t used_size = cur - buf; + + if (buf_size <= used_size + len) { + size_t old_size = buf_size; + buf_size *= 2; + buf = realloc(buf, buf_size); + memset(buf + old_size, 0, buf_size - old_size); + cur = buf + used_size; + } + memcpy(cur, tmp, len); cur += len; } @@ -841,7 +841,7 @@ AstNode* parse_expr_stmt(Parser* p) { } AstNode* parse_block_stmt(Parser* p) { - AstNode* list = ast_new_list(1024); + AstNode* list = ast_new_list(4); expect(p, TokenKind_brace_l); while (peek_token(p)->kind != TokenKind_brace_r) { AstNode* stmt = parse_stmt(p); @@ -1015,7 +1015,7 @@ AstNode* parse_struct_member(Parser* p) { } AstNode* parse_struct_members(Parser* p) { - AstNode* list = ast_new_list(32); + AstNode* list = ast_new_list(4); while (peek_token(p)->kind != TokenKind_brace_r) { AstNode* member = parse_struct_member(p); ast_append(list, member); @@ -1065,7 +1065,7 @@ AstNode* parse_union_member(Parser* p) { } AstNode* parse_union_members(Parser* p) { - AstNode* list = ast_new_list(16); + AstNode* list = ast_new_list(4); while (peek_token(p)->kind != TokenKind_brace_r) { AstNode* member = parse_union_member(p); ast_append(list, member); @@ -1113,7 +1113,7 @@ AstNode* parse_enum_member(Parser* p) { AstNode* parse_enum_members(Parser* p) { int next_value = 0; - AstNode* list = ast_new_list(256); + AstNode* list = ast_new_list(16); while (peek_token(p)->kind != TokenKind_brace_r) { AstNode* member = parse_enum_member(p); member->node_int_value = next_value; @@ -1205,8 +1205,8 @@ AstNode* parse_toplevel(Parser* p) { Program* parse(Token* tokens) { Parser* p = parser_new(tokens); - AstNode* funcs = ast_new_list(1024); - AstNode* vars = ast_new_list(1024); + AstNode* funcs = ast_new_list(32); + AstNode* vars = ast_new_list(16); while (eof(p)) { AstNode* n = parse_toplevel(p); if (n->kind == AstNodeKind_func_def) { diff --git a/preprocess.c b/preprocess.c index c4b1c16..b097bfb 100644 --- a/preprocess.c +++ b/preprocess.c @@ -317,6 +317,7 @@ typedef struct PpMacro PpMacro; struct PpMacros { size_t len; + size_t cap; PpMacro* data; }; typedef struct PpMacros PpMacros; @@ -340,10 +341,21 @@ Token* do_preprocess(InFile* src, int depth, PpMacros* pp_macros); PpMacros* pp_macros_new() { PpMacros* pp_macros = calloc(1, sizeof(PpMacros)); - pp_macros->data = calloc(1024, sizeof(PpMacro)); + pp_macros->len = 0; + pp_macros->cap = 8; + pp_macros->data = calloc(pp_macros->cap, sizeof(PpMacro)); return pp_macros; } +PpMacro* pp_macros_push_new(PpMacros* pp_macros) { + if (pp_macros->cap <= pp_macros->len) { + pp_macros->cap *= 2; + pp_macros->data = realloc(pp_macros->data, pp_macros->cap * sizeof(PpMacro)); + memset(pp_macros->data + pp_macros->len, 0, (pp_macros->cap - pp_macros->len) * sizeof(PpMacro)); + } + return &pp_macros->data[pp_macros->len++]; +} + void pp_macros_dump(PpMacros* pp_macros) { fprintf(stderr, "PpMacros {\n"); fprintf(stderr, " len = %zu\n", pp_macros->len); @@ -364,7 +376,7 @@ void pp_macros_dump(PpMacros* pp_macros) { void add_predefined_macros(PpMacros* pp_macros) { PpMacro* m; - m = pp_macros->data + pp_macros->len; + m = pp_macros_push_new(pp_macros); m->kind = PpMacroKind_obj; m->name.len = strlen("__ducc__"); m->name.data = "__ducc__"; @@ -373,19 +385,16 @@ void add_predefined_macros(PpMacros* pp_macros) { m->replacements[0].kind = TokenKind_literal_int; m->replacements[0].raw.len = strlen("1"); m->replacements[0].raw.data = "1"; - pp_macros->len += 1; - m = pp_macros->data + pp_macros->len; + m = pp_macros_push_new(pp_macros); m->kind = PpMacroKind_builtin_file; m->name.len = strlen("__FILE__"); m->name.data = "__FILE__"; - pp_macros->len += 1; - m = pp_macros->data + pp_macros->len; + m = pp_macros_push_new(pp_macros); m->kind = PpMacroKind_builtin_line; m->name.len = strlen("__LINE__"); m->name.data = "__LINE__"; - pp_macros->len += 1; } int count_pp_tokens(Token* pp_tokens) { @@ -934,7 +943,7 @@ Token* process_define_directive(Preprocessor* pp, Token* tok, Token* tok2) { if (!tok3) { fatal_error("%s:%s: invalid #define syntax", tok3->loc.filename, tok3->loc.line); } - pp_macro = pp->pp_macros->data + pp->pp_macros->len; + pp_macro = pp_macros_push_new(pp->pp_macros); pp_macro->kind = PpMacroKind_func; pp_macro->name = macro_name->raw; pp_macro->n_replacements = tok3 - tok2; @@ -942,13 +951,12 @@ Token* process_define_directive(Preprocessor* pp, Token* tok, Token* tok2) { for (i = 0; i < pp_macro->n_replacements; ++i) { pp_macro->replacements[i] = tok2[i]; } - ++pp->pp_macros->len; } else { tok3 = find_next_newline(tok2); if (!tok3) { fatal_error("%s:%s: invalid #define syntax", tok3->loc.filename, tok3->loc.line); } - pp_macro = pp->pp_macros->data + pp->pp_macros->len; + pp_macro = pp_macros_push_new(pp->pp_macros); pp_macro->kind = PpMacroKind_obj; pp_macro->name = macro_name->raw; pp_macro->n_replacements = tok3 - tok2; @@ -956,7 +964,6 @@ Token* process_define_directive(Preprocessor* pp, Token* tok, Token* tok2) { for (i = 0; i < pp_macro->n_replacements; ++i) { pp_macro->replacements[i] = tok2[i]; } - ++pp->pp_macros->len; } remove_directive_tokens(tok, tok3); return tok3; @@ -23,6 +23,7 @@ void* memcpy(void*, void*, size_t); void* memmove(void*, void*, size_t); void* memset(void*, int, size_t); int printf(const char*, ...); +void* realloc(void*, size_t); int sprintf(char*, const char*, ...); int strcmp(const char*, const char*); size_t strlen(const char*); |
