diff options
Diffstat (limited to 'src/preprocess.c')
| -rw-r--r-- | src/preprocess.c | 110 |
1 files changed, 55 insertions, 55 deletions
diff --git a/src/preprocess.c b/src/preprocess.c index 8c4d096..85f7320 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -1,5 +1,6 @@ #include "preprocess.h" #include "common.h" +#include "parse.h" #include "sys.h" const char* token_kind_stringify(TokenKind k) { @@ -345,7 +346,7 @@ struct Macro { }; typedef struct Macro Macro; -int macro_find_param(Macro* macro, Token* tok) { +static int macro_find_param(Macro* macro, Token* tok) { if (tok->kind != TokenKind_ident) return -1; @@ -364,7 +365,7 @@ struct MacroArray { }; typedef struct MacroArray MacroArray; -MacroArray* macros_new() { +static MacroArray* macros_new() { MacroArray* macros = calloc(1, sizeof(MacroArray)); macros->len = 0; macros->capacity = 8; @@ -372,7 +373,7 @@ MacroArray* macros_new() { return macros; } -void macros_reserve(MacroArray* macros, size_t size) { +static void macros_reserve(MacroArray* macros, size_t size) { if (size <= macros->capacity) return; while (macros->capacity < size) { @@ -382,12 +383,12 @@ void macros_reserve(MacroArray* macros, size_t size) { memset(macros->data + macros->len, 0, (macros->capacity - macros->len) * sizeof(Macro)); } -Macro* macros_push_new(MacroArray* macros) { +static Macro* macros_push_new(MacroArray* macros) { macros_reserve(macros, macros->len + 1); return ¯os->data[macros->len++]; } -void macros_dump(MacroArray* macros) { +static void macros_dump(MacroArray* macros) { fprintf(stderr, "MacroArray {\n"); fprintf(stderr, " len = %zu\n", macros->len); fprintf(stderr, " data = [\n"); @@ -403,7 +404,7 @@ void macros_dump(MacroArray* macros) { fprintf(stderr, "}\n"); } -void add_predefined_macros(MacroArray* macros) { +static void add_predefined_macros(MacroArray* macros) { Macro* m; m = macros_push_new(macros); @@ -435,7 +436,7 @@ struct MacroArgArray { }; typedef struct MacroArgArray MacroArgArray; -MacroArgArray* macroargs_new() { +static MacroArgArray* macroargs_new() { MacroArgArray* macroargs = calloc(1, sizeof(MacroArgArray)); macroargs->len = 0; macroargs->capacity = 2; @@ -443,7 +444,7 @@ MacroArgArray* macroargs_new() { return macroargs; } -void macroargs_reserve(MacroArgArray* macroargs, size_t size) { +static void macroargs_reserve(MacroArgArray* macroargs, size_t size) { if (size <= macroargs->capacity) return; while (macroargs->capacity < size) { @@ -453,7 +454,7 @@ void macroargs_reserve(MacroArgArray* macroargs, size_t size) { memset(macroargs->data + macroargs->len, 0, (macroargs->capacity - macroargs->len) * sizeof(MacroArg)); } -MacroArg* macroargs_push_new(MacroArgArray* macroargs) { +static MacroArg* macroargs_push_new(MacroArgArray* macroargs) { macroargs_reserve(macroargs, macroargs->len + 1); return ¯oargs->data[macroargs->len++]; } @@ -466,7 +467,7 @@ struct PpLexer { }; typedef struct PpLexer PpLexer; -PpLexer* pplexer_new(InFile* src) { +static PpLexer* pplexer_new(InFile* src) { PpLexer* ppl = calloc(1, sizeof(PpLexer)); ppl->src = src; @@ -478,7 +479,7 @@ PpLexer* pplexer_new(InFile* src) { return ppl; } -TokenKind pplexer_tokenize_pp_directive(PpLexer* ppl) { +static TokenKind pplexer_tokenize_pp_directive(PpLexer* ppl) { // Skip whitespaces after '#'. char c; while (isspace((c = infile_peek_char(ppl->src)))) { @@ -538,7 +539,7 @@ TokenKind pplexer_tokenize_pp_directive(PpLexer* ppl) { } } -void pplexer_tokenize_all(PpLexer* ppl) { +static void pplexer_tokenize_all(PpLexer* ppl) { while (!infile_eof(ppl->src)) { Token* tok = tokens_push_new(ppl->pp_tokens); tok->loc = ppl->src->loc; @@ -836,7 +837,7 @@ void pplexer_tokenize_all(PpLexer* ppl) { eof_tok->kind = TokenKind_eof; } -TokenArray* pp_tokenize(InFile* src) { +static TokenArray* pp_tokenize(InFile* src) { PpLexer* ppl = pplexer_new(src); pplexer_tokenize_all(ppl); return ppl->pp_tokens; @@ -853,9 +854,9 @@ struct Preprocessor { }; typedef struct Preprocessor Preprocessor; -TokenArray* do_preprocess(InFile* src, int depth, MacroArray* macros); +static TokenArray* do_preprocess(InFile* src, int depth, MacroArray* macros); -Preprocessor* preprocessor_new(TokenArray* pp_tokens, int include_depth, MacroArray* macros) { +static Preprocessor* preprocessor_new(TokenArray* pp_tokens, int include_depth, MacroArray* macros) { if (include_depth >= 32) { fatal_error("include depth limit exceeded"); } @@ -869,23 +870,23 @@ Preprocessor* preprocessor_new(TokenArray* pp_tokens, int include_depth, MacroAr return pp; } -Token* pp_token_at(Preprocessor* pp, int i) { +static Token* pp_token_at(Preprocessor* pp, int i) { return &pp->pp_tokens->data[i]; } -Token* peek_pp_token(Preprocessor* pp) { +static Token* peek_pp_token(Preprocessor* pp) { return pp_token_at(pp, pp->pos); } -Token* next_pp_token(Preprocessor* pp) { +static Token* next_pp_token(Preprocessor* pp) { return pp_token_at(pp, pp->pos++); } -BOOL pp_eof(Preprocessor* pp) { +static BOOL pp_eof(Preprocessor* pp) { return peek_pp_token(pp)->kind == TokenKind_eof; } -int find_macro(Preprocessor* pp, const char* name) { +static int find_macro(Preprocessor* pp, const char* name) { for (int i = 0; i < pp->macros->len; ++i) { if (pp->macros->data[i].kind == MacroKind_undef) continue; @@ -896,28 +897,28 @@ int find_macro(Preprocessor* pp, const char* name) { return -1; } -void undef_macro(Preprocessor* pp, int idx) { +static void undef_macro(Preprocessor* pp, int idx) { pp->macros->data[idx].kind = MacroKind_undef; // TODO: Can predefined macro like __FILE__ be undefined? } -void add_include_path(Preprocessor* pp, char* include_path) { +static void add_include_path(Preprocessor* pp, char* include_path) { pp->include_paths[pp->n_include_paths] = include_path; ++pp->n_include_paths; } -BOOL skip_pp_tokens(Preprocessor* pp) { +static BOOL skip_pp_tokens(Preprocessor* pp) { // TODO: support nested #if return pp->skip_pp_tokens; } -void skip_whitespaces(Preprocessor* pp) { +static void skip_whitespaces(Preprocessor* pp) { while (!pp_eof(pp) && peek_pp_token(pp)->kind == TokenKind_whitespace) { next_pp_token(pp); } } -void seek_to_next_newline(Preprocessor* pp) { +static void seek_to_next_newline(Preprocessor* pp) { while (!pp_eof(pp)) { Token* tok = peek_pp_token(pp); if (tok->kind == TokenKind_newline) { @@ -927,38 +928,37 @@ void seek_to_next_newline(Preprocessor* pp) { } } -void make_token_whitespace(Token* tok) { +static void make_token_whitespace(Token* tok) { tok->kind = TokenKind_whitespace; tok->value.string = NULL; } -void remove_directive_tokens(Preprocessor* pp, int start, int end) { +static void remove_directive_tokens(Preprocessor* pp, int start, int end) { for (int i = start; i < end; ++i) { make_token_whitespace(pp_token_at(pp, i)); } } -void process_endif_directive(Preprocessor* pp, int directive_token_pos) { +static void process_endif_directive(Preprocessor* pp, int directive_token_pos) { next_pp_token(pp); pp->skip_pp_tokens = FALSE; remove_directive_tokens(pp, directive_token_pos, pp->pos); } -void process_else_directive(Preprocessor* pp, int directive_token_pos) { +static void process_else_directive(Preprocessor* pp, int directive_token_pos) { next_pp_token(pp); pp->skip_pp_tokens = !pp->skip_pp_tokens; remove_directive_tokens(pp, directive_token_pos, pp->pos); } -void process_elif_directive(Preprocessor* pp, int directive_token_pos) { +static void process_elif_directive(Preprocessor* pp, int directive_token_pos) { unimplemented(); } -BOOL pp_eval_constant_expression(TokenArray*); -int replace_pp_tokens(Preprocessor*, int, int, TokenArray*); -BOOL expand_macro(Preprocessor*); +static int replace_pp_tokens(Preprocessor*, int, int, TokenArray*); +static BOOL expand_macro(Preprocessor*); -void process_if_directive(Preprocessor* pp, int directive_token_pos) { +static void process_if_directive(Preprocessor* pp, int directive_token_pos) { next_pp_token(pp); int condition_expression_start_pos = pp->pos; @@ -1041,7 +1041,7 @@ void process_if_directive(Preprocessor* pp, int directive_token_pos) { remove_directive_tokens(pp, directive_token_pos, pp->pos); } -void process_ifdef_directive(Preprocessor* pp, int directive_token_pos) { +static void process_ifdef_directive(Preprocessor* pp, int directive_token_pos) { next_pp_token(pp); skip_whitespaces(pp); Token* macro_name = peek_pp_token(pp); @@ -1052,7 +1052,7 @@ void process_ifdef_directive(Preprocessor* pp, int directive_token_pos) { remove_directive_tokens(pp, directive_token_pos, pp->pos); } -void process_ifndef_directive(Preprocessor* pp, int directive_token_pos) { +static void process_ifndef_directive(Preprocessor* pp, int directive_token_pos) { next_pp_token(pp); skip_whitespaces(pp); Token* macro_name = peek_pp_token(pp); @@ -1063,7 +1063,7 @@ void process_ifndef_directive(Preprocessor* pp, int directive_token_pos) { remove_directive_tokens(pp, directive_token_pos, pp->pos); } -Token* read_include_header_name(Preprocessor* pp) { +static Token* read_include_header_name(Preprocessor* pp) { Token* tok = next_pp_token(pp); if (tok->kind != TokenKind_header_name) { fatal_error("%s:%d: invalid #include", tok->loc.filename, tok->loc.line); @@ -1071,7 +1071,7 @@ Token* read_include_header_name(Preprocessor* pp) { return tok; } -const char* resolve_include_name(Preprocessor* pp, const Token* include_name_token) { +static const char* resolve_include_name(Preprocessor* pp, const Token* include_name_token) { const char* include_name = include_name_token->value.string; if (include_name[0] == '"') { char* current_filename = strdup(include_name_token->loc.filename); @@ -1091,7 +1091,7 @@ const char* resolve_include_name(Preprocessor* pp, const Token* include_name_tok } } -int replace_pp_tokens(Preprocessor* pp, int dest_start, int dest_end, TokenArray* source_tokens) { +static int replace_pp_tokens(Preprocessor* pp, int dest_start, int dest_end, TokenArray* source_tokens) { int n_tokens_to_remove = dest_end - dest_start; int n_tokens_after_dest = pp->pp_tokens->len - dest_end; int shift_amount; @@ -1117,14 +1117,14 @@ int replace_pp_tokens(Preprocessor* pp, int dest_start, int dest_end, TokenArray return dest_start + source_tokens->len; } -int replace_single_pp_token(Preprocessor* pp, int dest, Token* source_tok) { +static int replace_single_pp_token(Preprocessor* pp, int dest, Token* source_tok) { TokenArray tokens; tokens_init(&tokens, 1); *tokens_push_new(&tokens) = *source_tok; replace_pp_tokens(pp, dest, dest + 1, &tokens); } -void expand_include_directive(Preprocessor* pp, int directive_token_pos, const char* include_name) { +static void expand_include_directive(Preprocessor* pp, int directive_token_pos, const char* include_name) { InFile* include_source = infile_open(include_name); if (!include_source) { fatal_error("cannot open include file: %s", include_name); @@ -1135,7 +1135,7 @@ void expand_include_directive(Preprocessor* pp, int directive_token_pos, const c pp->pos = replace_pp_tokens(pp, directive_token_pos, pp->pos, include_pp_tokens); } -void process_include_directive(Preprocessor* pp, int directive_token_pos) { +static void process_include_directive(Preprocessor* pp, int directive_token_pos) { next_pp_token(pp); skip_whitespaces(pp); Token* include_name = read_include_header_name(pp); @@ -1148,7 +1148,7 @@ void process_include_directive(Preprocessor* pp, int directive_token_pos) { // ws ::= many0(<whitespace>) // macro-parameters ::= '(' <ws> opt(<identifier> <ws> many0(',' <ws> <identifier> <ws>)) ')' -TokenArray* pp_parse_macro_parameters(Preprocessor* pp) { +static TokenArray* pp_parse_macro_parameters(Preprocessor* pp) { TokenArray* parameters = calloc(1, sizeof(TokenArray)); tokens_init(parameters, 2); @@ -1176,7 +1176,7 @@ TokenArray* pp_parse_macro_parameters(Preprocessor* pp) { return parameters; } -void process_define_directive(Preprocessor* pp, int directive_token_pos) { +static void process_define_directive(Preprocessor* pp, int directive_token_pos) { next_pp_token(pp); skip_whitespaces(pp); Token* macro_name = next_pp_token(pp); @@ -1220,7 +1220,7 @@ void process_define_directive(Preprocessor* pp, int directive_token_pos) { remove_directive_tokens(pp, directive_token_pos, pp->pos); } -void process_undef_directive(Preprocessor* pp, int directive_token_pos) { +static void process_undef_directive(Preprocessor* pp, int directive_token_pos) { next_pp_token(pp); skip_whitespaces(pp); Token* macro_name = peek_pp_token(pp); @@ -1234,21 +1234,21 @@ void process_undef_directive(Preprocessor* pp, int directive_token_pos) { remove_directive_tokens(pp, directive_token_pos, pp->pos); } -void process_line_directive(Preprocessor* pp, int directive_token_pos) { +static void process_line_directive(Preprocessor* pp, int directive_token_pos) { unimplemented(); } -void process_error_directive(Preprocessor* pp, int directive_token_pos) { +static void process_error_directive(Preprocessor* pp, int directive_token_pos) { unimplemented(); } -void process_pragma_directive(Preprocessor* pp, int directive_token_pos) { +static void process_pragma_directive(Preprocessor* pp, int directive_token_pos) { unimplemented(); } // ws ::= many0(<Whitespace>) // macro-arguments ::= '(' <ws> opt(<any-token> <ws> many0(',' <ws> <any-token> <ws>)) ')' -MacroArgArray* pp_parse_macro_arguments(Preprocessor* pp) { +static MacroArgArray* pp_parse_macro_arguments(Preprocessor* pp) { MacroArgArray* args = macroargs_new(); Token* tok = next_pp_token(pp); @@ -1279,7 +1279,7 @@ MacroArgArray* pp_parse_macro_arguments(Preprocessor* pp) { return args; } -BOOL expand_macro(Preprocessor* pp) { +static BOOL expand_macro(Preprocessor* pp) { int macro_name_pos = pp->pos; Token* macro_name = next_pp_token(pp); int macro_idx = find_macro(pp, macro_name->value.string); @@ -1329,7 +1329,7 @@ BOOL expand_macro(Preprocessor* pp) { return TRUE; } -void process_pp_directive(Preprocessor* pp) { +static void process_pp_directive(Preprocessor* pp) { int first_token_pos = pp->pos; Token* tok = peek_pp_token(pp); if (tok->kind == TokenKind_pp_directive_endif) { @@ -1371,13 +1371,13 @@ void process_pp_directive(Preprocessor* pp) { } } -void process_pp_directives(Preprocessor* pp) { +static void process_pp_directives(Preprocessor* pp) { while (!pp_eof(pp)) { process_pp_directive(pp); } } -void pp_dump(Token* t, BOOL include_whitespace) { +static void pp_dump(Token* t, BOOL include_whitespace) { for (; t->kind != TokenKind_eof; ++t) { if (t->kind == TokenKind_whitespace && !include_whitespace) { continue; @@ -1386,14 +1386,14 @@ void pp_dump(Token* t, BOOL include_whitespace) { } } -char* get_ducc_include_path() { +static char* get_ducc_include_path() { const char* self_dir = get_self_dir(); char* buf = calloc(strlen(self_dir) + strlen("/../include") + 1, sizeof(char)); sprintf(buf, "%s/../include", self_dir); return buf; } -TokenArray* do_preprocess(InFile* src, int depth, MacroArray* macros) { +static TokenArray* do_preprocess(InFile* src, int depth, MacroArray* macros) { TokenArray* pp_tokens = pp_tokenize(src); Preprocessor* pp = preprocessor_new(pp_tokens, depth, macros); add_include_path(pp, get_ducc_include_path()); |
