]> git.rm.cloudns.org Git - xonotic/gmqcc.git/commitdiff
Properly handle string and char constants when preprocessing: don't unescape and...
authorWolfgang (Blub) Bumiller <blub@speed.at>
Fri, 2 Nov 2012 17:48:32 +0000 (18:48 +0100)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Fri, 2 Nov 2012 17:48:32 +0000 (18:48 +0100)
lexer.c
preprocess.c

diff --git a/lexer.c b/lexer.c
index 08a63d624bb7cfc258c9e654aadae2cefb95ed05..7e6f40f44d4151aa24ea376127e8aed4fe054fe2 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -381,10 +381,10 @@ static int lex_skipwhite(lex_file *lex)
             if (ch == '/')
             {
                 /* one line comment */
-                haswhite = true;
                 ch = lex_getch(lex);
 
                 if (lex->flags.preprocessing) {
+                    haswhite = true;
                     if (!lex_tokench(lex, '/') ||
                         !lex_tokench(lex, '/'))
                     {
@@ -408,8 +408,8 @@ static int lex_skipwhite(lex_file *lex)
             if (ch == '*')
             {
                 /* multiline comment */
-                haswhite = true;
                 if (lex->flags.preprocessing) {
+                    haswhite = true;
                     if (!lex_tokench(lex, '/') ||
                         !lex_tokench(lex, '*'))
                     {
@@ -550,7 +550,7 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote)
         if (ch == quote)
             return TOKEN_STRINGCONST;
 
-        if (ch == '\\') {
+        if (!lex->flags.preprocessing && ch == '\\') {
             ch = lex_getch(lex);
             if (ch == EOF) {
                 lexerror(lex, "unexpected end of file");
@@ -1066,8 +1066,12 @@ int lex_do(lex_file *lex)
     if (ch == '"')
     {
         lex->flags.nodigraphs = true;
+        if (lex->flags.preprocessing && !lex_tokench(lex, ch))
+            return TOKEN_FATAL;
         lex->tok.ttype = lex_finish_string(lex, '"');
-        while (lex->tok.ttype == TOKEN_STRINGCONST)
+        if (lex->flags.preprocessing && !lex_tokench(lex, ch))
+            return TOKEN_FATAL;
+        while (!lex->flags.preprocessing && lex->tok.ttype == TOKEN_STRINGCONST)
         {
             /* Allow c style "string" "continuation" */
             ch = lex_skipwhite(lex);
@@ -1091,23 +1095,27 @@ int lex_do(lex_file *lex)
          * Likewise actual unescaping has to be done by the parser.
          * The difference is we don't allow 'char' 'continuation'.
          */
-         lex->tok.ttype = lex_finish_string(lex, '\'');
-         if (!lex_endtoken(lex))
-              return (lex->tok.ttype = TOKEN_FATAL);
+        if (lex->flags.preprocessing && !lex_tokench(lex, ch))
+            return TOKEN_FATAL;
+        lex->tok.ttype = lex_finish_string(lex, '\'');
+        if (lex->flags.preprocessing && !lex_tokench(lex, ch))
+            return TOKEN_FATAL;
+        if (!lex_endtoken(lex))
+            return (lex->tok.ttype = TOKEN_FATAL);
 
          /* It's a vector if we can successfully scan 3 floats */
 #ifdef WIN32
-         if (sscanf_s(lex->tok.value, " %f %f %f ",
-                    &lex->tok.constval.v.x, &lex->tok.constval.v.y, &lex->tok.constval.v.z) == 3)
+        if (sscanf_s(lex->tok.value, " %f %f %f ",
+                   &lex->tok.constval.v.x, &lex->tok.constval.v.y, &lex->tok.constval.v.z) == 3)
 #else
-         if (sscanf(lex->tok.value, " %f %f %f ",
-                    &lex->tok.constval.v.x, &lex->tok.constval.v.y, &lex->tok.constval.v.z) == 3)
+        if (sscanf(lex->tok.value, " %f %f %f ",
+                   &lex->tok.constval.v.x, &lex->tok.constval.v.y, &lex->tok.constval.v.z) == 3)
 #endif
-         {
-              lex->tok.ttype = TOKEN_VECTORCONST;
-         }
+        {
+             lex->tok.ttype = TOKEN_VECTORCONST;
+        }
 
-         return lex->tok.ttype;
+        return lex->tok.ttype;
     }
 
     if (isdigit(ch))
index 32f9c2828229d694ab599a5b068b307527731d47..bf1873da013f276b81017227ab44e881eeba7e71 100644 (file)
@@ -9,7 +9,7 @@ bool preprocess(const char *filename)
 
     do {
         tok = lex_do(lex);
-        /*
+#if 0
         if (tok == TOKEN_EOL)
             printf("EOL");
         else if (tok >= TOKEN_START && tok <= TOKEN_FATAL)
@@ -20,13 +20,14 @@ bool preprocess(const char *filename)
             printf(">>%s<<\n", lex->tok.value);
         else
             printf("\n");
-        */
+#else
         if (tok == TOKEN_EOL)
             printf("\n");
         else if (tok >= TOKEN_START && tok < TOKEN_EOF)
             printf("%s", lex->tok.value);
         else
             printf("%c", tok);
+#endif
     } while (tok < TOKEN_EOF);
 
     lex_close(lex);