]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - lexer.c
Dump old tests, test suite will take over .. It isn't activly used, just killing...
[xonotic/gmqcc.git] / lexer.c
diff --git a/lexer.c b/lexer.c
index 4d184d083d67afdfa1527173d237ba3059590e7b..0526b52cc4a44a0afec49926a0000ea58928b655 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -381,21 +381,21 @@ static int lex_skipwhite(lex_file *lex)
             if (ch == '/')
             {
                 /* one line comment */
-                haswhite = true;
                 ch = lex_getch(lex);
 
                 if (lex->flags.preprocessing) {
-                    if (!lex_tokench(lex, ' ') ||
-                        !lex_tokench(lex, ' '))
+                    haswhite = true;
+                    if (!lex_tokench(lex, '/') ||
+                        !lex_tokench(lex, '/'))
                     {
                         return TOKEN_FATAL;
                     }
                 }
 
                 while (ch != EOF && ch != '\n') {
-                    ch = lex_getch(lex);
-                    if (lex->flags.preprocessing && !lex_tokench(lex, ' '))
+                    if (lex->flags.preprocessing && !lex_tokench(lex, ch))
                         return TOKEN_FATAL;
+                    ch = lex_getch(lex);
                 }
                 if (lex->flags.preprocessing) {
                     lex_ungetch(lex, '\n');
@@ -408,10 +408,10 @@ static int lex_skipwhite(lex_file *lex)
             if (ch == '*')
             {
                 /* multiline comment */
-                haswhite = true;
                 if (lex->flags.preprocessing) {
-                    if (!lex_tokench(lex, ' ') ||
-                        !lex_tokench(lex, ' '))
+                    haswhite = true;
+                    if (!lex_tokench(lex, '/') ||
+                        !lex_tokench(lex, '*'))
                     {
                         return TOKEN_FATAL;
                     }
@@ -424,8 +424,8 @@ static int lex_skipwhite(lex_file *lex)
                         ch = lex_getch(lex);
                         if (ch == '/') {
                             if (lex->flags.preprocessing) {
-                                if (!lex_tokench(lex, ' ') ||
-                                    !lex_tokench(lex, ' '))
+                                if (!lex_tokench(lex, '*') ||
+                                    !lex_tokench(lex, '/'))
                                 {
                                     return TOKEN_FATAL;
                                 }
@@ -434,8 +434,6 @@ static int lex_skipwhite(lex_file *lex)
                         }
                     }
                     if (lex->flags.preprocessing) {
-                        if (ch != '\n')
-                            ch = ' ';
                         if (!lex_tokench(lex, ch))
                             return TOKEN_FATAL;
                     }
@@ -552,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");
@@ -1068,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);
@@ -1093,23 +1095,28 @@ 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;
-         }
 
-         return lex->tok.ttype;
+        {
+             lex->tok.ttype = TOKEN_VECTORCONST;
+        }
+
+        return lex->tok.ttype;
     }
 
     if (isdigit(ch))