Implement support for octal constants, this closes #97.
authorDale Weiler <killfieldengine@gmail.com>
Thu, 17 Oct 2013 09:17:30 +0000 (05:17 -0400)
committerDale Weiler <killfieldengine@gmail.com>
Thu, 17 Oct 2013 09:17:30 +0000 (05:17 -0400)
lexer.c
tests/octal.qc [new file with mode: 0644]
tests/octal.tmpl [new file with mode: 0644]

diff --git a/lexer.c b/lexer.c
index 6c8ccd9db127c82c11996ccf82a08037e196c840..b6d5ceb6d3bd94aed4e4cc0bb0d2926d932b9b6a 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -766,6 +766,7 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote)
     int ch = 0;
     int nextch;
     bool hex;
+    bool oct;
     char u8buf[8]; /* way more than enough */
     int  u8len, uc;
 
@@ -851,17 +852,18 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote)
                 chr = 0;
                 nextch = lex_getch(lex);
                 hex = (nextch == 'x');
-                if (!hex)
+                oct = (nextch == '0');
+                if (!hex && !oct)
                     lex_ungetch(lex, nextch);
                 for (nextch = lex_getch(lex); nextch != '}'; nextch = lex_getch(lex)) {
-                    if (!hex) {
+                    if (!hex && !oct) {
                         if (nextch >= '0' && nextch <= '9')
                             chr = chr * 10 + nextch - '0';
                         else {
                             lexerror(lex, "bad character code");
                             return (lex->tok.ttype = TOKEN_ERROR);
                         }
-                    } else {
+                    } else if (!oct) {
                         if (nextch >= '0' && nextch <= '9')
                             chr = chr * 0x10 + nextch - '0';
                         else if (nextch >= 'a' && nextch <= 'f')
@@ -872,6 +874,13 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote)
                             lexerror(lex, "bad character code");
                             return (lex->tok.ttype = TOKEN_ERROR);
                         }
+                    } else {
+                        if (nextch >= '0' && nextch <= '9')
+                            chr = chr * 8 + chr - '0';
+                        else {
+                            lexerror(lex, "bad character code");
+                            return (lex->tok.ttype = TOKEN_ERROR);
+                        }
                     }
                     if (chr > 0x10FFFF || (!OPTS_FLAG(UTF8) && chr > 255))
                     {
diff --git a/tests/octal.qc b/tests/octal.qc
new file mode 100644 (file)
index 0000000..bddb882
--- /dev/null
@@ -0,0 +1,11 @@
+void main() {
+    float a = 012;
+    float b = 0204;
+    float c = 076663;
+    float d = 0777;
+
+    print(ftos(a), "\n");
+    print(ftos(b), "\n");
+    print(ftos(c), "\n");
+    print(ftos(d), "\n");
+}
diff --git a/tests/octal.tmpl b/tests/octal.tmpl
new file mode 100644 (file)
index 0000000..45c7332
--- /dev/null
@@ -0,0 +1,8 @@
+I: octal.qc
+D: test octal constants
+T: -execute
+C: -std=gmqcc
+M: 10
+M: 132
+M: 32179
+M: 511