Implement support for octal constants, this closes #97.

This commit is contained in:
Dale Weiler 2013-10-17 05:17:30 -04:00
parent 02a1d9f4a1
commit 9f54610fbd
3 changed files with 31 additions and 3 deletions

15
lexer.c
View file

@ -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))
{

11
tests/octal.qc Normal file
View file

@ -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");
}

8
tests/octal.tmpl Normal file
View file

@ -0,0 +1,8 @@
I: octal.qc
D: test octal constants
T: -execute
C: -std=gmqcc
M: 10
M: 132
M: 32179
M: 511