X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=lexer.c;h=8a339aa110058836c6f208ad7eb15f9eaa34232f;hb=3ebfcac30456a053d3eba3fb1a2df7b1e73668b8;hp=e85895e83fd1884c67ac3da803e388b963f64443;hpb=6025937d4911b04456148671a111c364556dcd10;p=cparser diff --git a/lexer.c b/lexer.c index e85895e..8a339aa 100644 --- a/lexer.c +++ b/lexer.c @@ -19,6 +19,7 @@ */ #include +#include "adt/strutil.h" #include "input.h" #include "diagnostic.h" #include "lexer.h" @@ -57,7 +58,6 @@ static source_position_t lexer_pos; token_t lexer_token; static symbol_t *symbol_L; static strset_t stringset; -static char *encoding; bool allow_dollar_in_symbol = true; /** @@ -324,8 +324,8 @@ finish_suffix: } obstack_1grow(&symbol_obstack, '\0'); - size_t size = obstack_object_size(&symbol_obstack); - char *string = obstack_finish(&symbol_obstack); + size_t size = obstack_object_size(&symbol_obstack) - 1; + char *string = obstack_finish(&symbol_obstack); lexer_token.number.suffix = identify_string(string, size); } @@ -884,37 +884,6 @@ static void eat_until_newline(void) } } -/** - * Handle the define directive. - */ -static void define_directive(void) -{ - lexer_next_preprocessing_token(); - if (lexer_token.kind != T_IDENTIFIER) { - parse_error("expected identifier after #define\n"); - eat_until_newline(); - } -} - -/** - * Handle the ifdef directive. - */ -static void ifdef_directive(int is_ifndef) -{ - (void) is_ifndef; - lexer_next_preprocessing_token(); - //expect_identifier(); - //extect_newline(); -} - -/** - * Handle the endif directive. - */ -static void endif_directive(void) -{ - //expect_newline(); -} - /** * Parse the line directive. */ @@ -929,7 +898,24 @@ static void parse_line_directive(void) } if (pp_token.kind == T_STRING_LITERAL) { lexer_pos.input_name = pp_token.string.string.begin; + lexer_pos.is_system_header = false; next_pp_token(); + + /* attempt to parse numeric flags as outputted by gcc preprocessor */ + while (pp_token.kind == T_INTEGER) { + /* flags: + * 1 - indicates start of a new file + * 2 - indicates return from a file + * 3 - indicates system header + * 4 - indicates implicit extern "C" in C++ mode + * + * currently we're only interested in "3" + */ + if (streq(pp_token.number.number.begin, "3")) { + lexer_pos.is_system_header = true; + } + next_pp_token(); + } } eat_until_newline(); @@ -1033,36 +1019,17 @@ static void parse_preprocessor_identifier(void) symbol_t *symbol = pp_token.identifier.symbol; switch (symbol->pp_ID) { - case TP_include: - printf("include - enable header name parsing!\n"); - break; - case TP_define: - define_directive(); - break; - case TP_ifdef: - ifdef_directive(0); - break; - case TP_ifndef: - ifdef_directive(1); - break; - case TP_endif: - endif_directive(); - break; case TP_line: next_pp_token(); parse_line_directive(); break; - case TP_if: - case TP_else: - case TP_elif: - case TP_undef: - case TP_error: - /* TODO; output the rest of the line */ - parse_error("#error directive: "); - break; case TP_pragma: parse_pragma(); break; + case TP_error: + /* TODO; output the rest of the line */ + parse_error("#error directive"); + break; } } @@ -1332,26 +1299,14 @@ static void input_error(unsigned delta_lines, unsigned delta_cols, errorf(&lexer_pos, "%s", message); } -void select_input_encoding(char const* new_encoding) -{ - if (encoding != NULL) - xfree(encoding); - encoding = xstrdup(new_encoding); -} - -void lexer_open_stream(FILE *stream, const char *input_name) +void lexer_switch_input(input_t *new_input, const char *input_name) { - if (input != NULL) { - input_free(input); - input = NULL; - } - lexer_pos.lineno = 0; lexer_pos.colno = 0; lexer_pos.input_name = input_name; set_input_error_callback(input_error); - input = input_from_stream(stream, encoding); + input = new_input; bufpos = NULL; bufend = NULL; @@ -1362,10 +1317,6 @@ void lexer_open_stream(FILE *stream, const char *input_name) void exit_lexer(void) { - if (input != NULL) { - input_free(input); - input = NULL; - } strset_destroy(&stringset); } @@ -1373,6 +1324,6 @@ static __attribute__((unused)) void dbg_pos(const source_position_t source_position) { fprintf(stdout, "%s:%u:%u\n", source_position.input_name, - source_position.lineno, source_position.colno); + source_position.lineno, (unsigned)source_position.colno); fflush(stdout); }