X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=lexer.c;h=8a339aa110058836c6f208ad7eb15f9eaa34232f;hb=6f8db408325831c25558eaa99b1d291562f7f65a;hp=3e9494cf35a411c943f7d31a46fe914725893c5f;hpb=351bf3a339f32c5dba6ef10b21a28ea7b94ad004;p=cparser diff --git a/lexer.c b/lexer.c index 3e9494c..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" @@ -323,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); } @@ -883,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. */ @@ -928,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(); @@ -1032,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; } } @@ -1356,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); }