]> de.git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - lexer.c
moving -Olocal-temps to -O4 until the issues are solved
[xonotic/gmqcc.git] / lexer.c
diff --git a/lexer.c b/lexer.c
index ee8fd4a4f82552d9520fd4d44085ac1b8d218043..64cdb3d3cff06b7212c7caf4cc44472ebe700d1e 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012
+ * Copyright (C) 2012, 2013
  *     Wolfgang Bumiller
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy of
@@ -485,7 +485,7 @@ unroll:
     if (command) {
         vec_pop(command);
         while (vec_size(command)) {
-            lex_ungetch(lex, vec_last(command));
+            lex_ungetch(lex, (unsigned char)vec_last(command));
             vec_pop(command);
         }
         vec_free(command);
@@ -494,7 +494,7 @@ unroll:
     if (command) {
         vec_pop(command);
         while (vec_size(command)) {
-            lex_ungetch(lex, vec_last(command));
+            lex_ungetch(lex, (unsigned char)vec_last(command));
             vec_pop(command);
         }
         vec_free(command);
@@ -503,7 +503,7 @@ unroll:
     if (pragma) {
         vec_pop(pragma);
         while (vec_size(pragma)) {
-            lex_ungetch(lex, vec_last(pragma));
+            lex_ungetch(lex, (unsigned char)vec_last(pragma));
             vec_pop(pragma);
         }
         vec_free(pragma);
@@ -736,10 +736,13 @@ static bool lex_finish_frames(lex_file *lex)
         vec_shrinkto(lex->tok.value, 0);
         vec_push(lex->frames, m);
     } while (true);
+
+    return false;
 }
 
 static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote)
 {
+    uchar_t chr;
     int ch = 0;
     int nextch;
     bool hex;
@@ -825,7 +828,7 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote)
             case '[':  ch = 16; break;
             case ']':  ch = 17; break;
             case '{':
-                ch = 0;
+                chr = 0;
                 nextch = lex_getch(lex);
                 hex = (nextch == 'x');
                 if (!hex)
@@ -833,32 +836,31 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote)
                 for (nextch = lex_getch(lex); nextch != '}'; nextch = lex_getch(lex)) {
                     if (!hex) {
                         if (nextch >= '0' && nextch <= '9')
-                            ch = ch * 10 + nextch - '0';
+                            chr = chr * 10 + nextch - '0';
                         else {
                             lexerror(lex, "bad character code");
                             return (lex->tok.ttype = TOKEN_ERROR);
                         }
                     } else {
-                        if (nextch >= '0' || nextch <= '9')
-                            ch = ch * 16 + nextch - '0';
+                        if (nextch >= '0' && nextch <= '9')
+                            chr = chr * 0x10 + nextch - '0';
                         else if (nextch >= 'a' && nextch <= 'f')
-                            ch = ch * 16 + nextch - 'a' + 10;
+                            chr = chr * 0x10 + nextch - 'a' + 10;
                         else if (nextch >= 'A' && nextch <= 'F')
-                            ch = ch * 16 + nextch - 'A' + 10;
+                            chr = chr * 0x10 + nextch - 'A' + 10;
                         else {
                             lexerror(lex, "bad character code");
                             return (lex->tok.ttype = TOKEN_ERROR);
                         }
                     }
-                    if ( (!OPTS_FLAG(UTF8) && ch > 255) ||
-                         ( OPTS_FLAG(UTF8) && ch > 0x10FFFF) )
+                    if (chr > 0x10FFFF || (!OPTS_FLAG(UTF8) && chr > 255))
                     {
                         lexerror(lex, "character code out of range");
                         return (lex->tok.ttype = TOKEN_ERROR);
                     }
                 }
-                if (OPTS_FLAG(UTF8) && ch >= 128) {
-                    u8len = u8_fromchar((Uchar)ch, u8buf, sizeof(u8buf));
+                if (OPTS_FLAG(UTF8) && chr >= 128) {
+                    u8len = u8_fromchar(chr, u8buf, sizeof(u8buf));
                     if (!u8len)
                         ch = 0;
                     else {
@@ -871,6 +873,8 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote)
                         ch = u8buf[uc];
                     }
                 }
+                else
+                    ch = chr;
                 break;
             case '\n':  ch = '\n'; break;
 
@@ -1295,6 +1299,17 @@ int lex_do(lex_file *lex)
                 lex_tokench(lex, nextch);
                 lex_tokench(lex, thirdch);
             }
+        }
+        else if (lex->flags.preprocessing &&
+                 ch == '-' && isdigit(nextch))
+        {
+            lex->tok.ttype = lex_finish_digit(lex, nextch);
+            if (lex->tok.ttype == TOKEN_INTCONST)
+                lex->tok.constval.i = -lex->tok.constval.i;
+            else
+                lex->tok.constval.f = -lex->tok.constval.f;
+            lex_endtoken(lex);
+            return lex->tok.ttype;
         } else
             lex_ungetch(lex, nextch);
 
@@ -1427,10 +1442,13 @@ int lex_do(lex_file *lex)
         else
         {
             if (!lex->flags.preprocessing && strlen(lex->tok.value) > 1) {
-                Uchar u8char;
+                uchar_t u8char;
                 /* check for a valid utf8 character */
                 if (!OPTS_FLAG(UTF8) || !u8_analyze(lex->tok.value, NULL, NULL, &u8char, 8)) {
-                    if (lexwarn(lex, WARN_MULTIBYTE_CHARACTER, "multibyte character: `%s`", lex->tok.value))
+                    if (lexwarn(lex, WARN_MULTIBYTE_CHARACTER,
+                                ( OPTS_FLAG(UTF8) ? "invalid multibyte character sequence `%s`"
+                                                  : "multibyte character: `%s`" ),
+                                lex->tok.value))
                         return (lex->tok.ttype = TOKEN_ERROR);
                 }
                 else