aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ast.c24
-rw-r--r--io.c15
-rw-r--r--parse.c12
-rw-r--r--preprocess.c29
-rw-r--r--std.h1
5 files changed, 56 insertions, 25 deletions
diff --git a/ast.c b/ast.c
index a6fb722..8562088 100644
--- a/ast.c
+++ b/ast.c
@@ -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;
}
diff --git a/io.c b/io.c
index 6c92b20..ae02a0d 100644
--- a/io.c
+++ b/io.c
@@ -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;
}
diff --git a/parse.c b/parse.c
index 820d3e2..c0d60dc 100644
--- a/parse.c
+++ b/parse.c
@@ -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;
diff --git a/std.h b/std.h
index c625e18..7f6d663 100644
--- a/std.h
+++ b/std.h
@@ -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*);