long
yylex(void)
{
- ulong c, c1;
+ int c, c1;
+ vlong v;
char *cp;
Rune rune;
int escflag;
caseq:
for(;;) {
- c = escchar('"', &escflag);
- if(c == EOF)
+ if(escchar('"', &escflag, &v))
break;
if(escflag) {
cp = remal(cp, c1, 1);
- cp[c1++] = c;
+ cp[c1++] = v;
} else {
- rune = c;
+ // botch - this limits size of runes
+ rune = v;
c = runelen(rune);
cp = remal(cp, c1, c);
runetochar(cp+c1, &rune);
case '\'':
/* '.' */
- c = escchar('\'', &escflag);
- if(c == EOF)
- c = '\'';
- c1 = escchar('\'', &escflag);
- if(c1 != EOF) {
+ if(escchar('\'', &escflag, &v))
+ v = '\''; // allow '''
+ if(!escchar('\'', &escflag, &v)) {
yyerror("missing '");
- ungetc(c1);
+ ungetc(v);
}
- yylval.val.vval = c;
+ yylval.val.vval = v;
yylval.val.ctype = CTINT;
DBG("lex: codepoint literal\n");
return LLITERAL;
}
-ulong
-escchar(int e, int *escflg)
+int
+escchar(int e, int *escflg, vlong *val)
{
- ulong c, l;
- int i;
+ int i, c;
+ vlong l;
*escflg = 0;
c = getr();
if(c == '\n') {
yyerror("newline in string");
- return EOF;
+ return 1;
}
if(c != '\\') {
if(c == e)
- c = EOF;
- return c;
+ return 1;
+ *val = c;
+ return 0;
}
+
c = getr();
switch(c) {
case '\n':
case '7':
goto oct;
- case 'a': return '\a';
- case 'b': return '\b';
- case 'f': return '\f';
- case 'n': return '\n';
- case 'r': return '\r';
- case 't': return '\t';
- case 'v': return '\v';
- case '\\': return '\\';
+ case 'a': c = '\a'; break;
+ case 'b': c = '\b'; break;
+ case 'f': c = '\f'; break;
+ case 'n': c = '\n'; break;
+ case 'r': c = '\r'; break;
+ case 't': c = '\t'; break;
+ case 'v': c = '\v'; break;
+ case '\\': c = '\\'; break;
default:
if(c != e)
warn("unknown escape sequence: %c", c);
}
- return c;
+ *val = c;
+ return 0;
hex:
l = 0;
break;
}
*escflg = 1;
- return l;
+ *val = l;
+ return 0;
oct:
l = c - '0';
if(l > 255)
warn("oct escape value > 255: %d", l);
*escflg = 1;
- return l;
+ *val = l;
+ return 0;
}
static struct