diff --git a/lib/modules/Parser.pmod/C.pmod b/lib/modules/Parser.pmod/C.pmod index 9d8cc7f16f47c189e9ca14831ed23bc695894377..afbd72d335198db3ad4c5f5f5fbcc0ae1a3de992 100644 --- a/lib/modules/Parser.pmod/C.pmod +++ b/lib/modules/Parser.pmod/C.pmod @@ -49,7 +49,7 @@ array(string) split(string data) case '.': if(data[start..start+2]=="...") { - pos+=2; + pos+=3; break; } @@ -85,7 +85,7 @@ array(string) split(string data) break; default: - werror("Unknown token %s\n",data[pos..pos+5]); + werror("Unknown token %O\n",data[pos..pos+5]); exit(1); case '`': @@ -136,6 +136,7 @@ array(string) split(string data) case '\n': case '\r': case '\t': + case '\14': while(1) { switch(data[pos]) @@ -144,6 +145,7 @@ array(string) split(string data) case '\n': case '\r': case '\t': + case '\14': pos++; continue; } @@ -233,7 +235,6 @@ class Token } /* FIXME: - * Check for #line statements */ array(Token) tokenize(array(string) s, void|string file) { @@ -242,19 +243,25 @@ array(Token) tokenize(array(string) s, void|string file) for(int e=0;e<sizeof(s);e++) { ret[e]=Token(s[e],line,file); + if(s[e][0]=='#') + { + sscanf(s[e],"#%*[ \t\14]%d%*[ \t\14]\"%s\"", line,file); + sscanf(s[e],"#%*[ \t\14]line%*[ \t\14]%d%*[ \t\14]\"%s\"", line,file); + line--; + } line+=sizeof(s[e]/"\n")-1; } return ret; } -array group(array(Token) tokens, void|mapping groupings) +array group(array(string|Token) tokens, void|mapping groupings) { array(Token) ret=({}); if(!groupings) groupings=global_groupings; foreach(tokens, Token token) { ret+=({ token }); - if(string rev=groupings [ token->text ]) + if(string rev=groupings [ (string)token ]) { for(int q=sizeof(ret)-1;q>=0;q--) { @@ -269,6 +276,26 @@ array group(array(Token) tokens, void|mapping groupings) return ret; } +/* FIXME: + * This actually strips all preprocessing tokens + */ +array strip_line_statements(array tokens) +{ + array(Token) ret=({}); + foreach(tokens, array|object(Token) t) + { + if(arrayp(t)) + { + ret+=({ strip_line_statements(t) }); + }else{ + if( ((string)t) [0] != '#') + ret+=({t}); + } + } + return ret; + +} + array hide_whitespaces(array tokens) { array(Token) ret=({tokens[0]}); @@ -282,6 +309,7 @@ array hide_whitespaces(array tokens) { case ' ': case '\t': + case '\14': case '\n': mixed tmp=ret[-1]; while(arrayp(tmp)) tmp=tmp[-1];