X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/4f09fcd75bb0057d90c7431f7db57ca2c5a6c028..5cfe51ee2287165feb0cf006901bbbc2b961f3b8:/src/lexer.l diff --git a/src/lexer.l b/src/lexer.l index 95cbf52..37ec65a 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -23,6 +23,7 @@ #include "config.h" #include #include +#include #include "treefuncs.h" #include "parse.h" @@ -46,6 +47,8 @@ GList *include_files = NULL; static int look_for_includes = 0; int line_no = 1; +/* last filename parsed from a #line directive */ +char *hline_filename = NULL; static void clear_cbuf(void) @@ -126,6 +129,44 @@ REJECT; } \/\/.*$ { ; /*comment, ignore*/ } + +<*>^#[ \t]*line[ \t]+[0-9]+([ \t]\"[^\n\r\f\"]*\")? { + char *p; + char *number; + char *filename; + char *str=g_strdup(yytext); + + /* find first digit of line number */ + p=str; + while(*p&&!isdigit(*p)) p++; + number=p; + + /* find end of line number */ + while(*p&&isdigit(*p)) p++; + if(*p) *p++=0; + + /* find beginning of filename */ + p=strchr(p,'"'); + if(p) p++; + filename=p; + + /* find end of filename */ + if(p) p=strchr(p,'"'); + if(p) *p=0; + + /* stash number (minus one because we don't count this line) */ + if(number) line_no=atoi(number)-1; + + /* stash filename */ + if(filename) { + if(hline_filename) g_free(hline_filename); + hline_filename=g_strdup(filename); + } + + /* clean up */ + g_free(str); +} + ^#[ \t]*include[ \t][<"][^\n">]*[>"] { if(look_for_includes==1) { char *p; @@ -459,7 +500,7 @@ class { return '}'; } -[\t ] ; /*ignore*/ +[\f\t ] ; /*ignore*/ <*>. { yylval.line = line_no;