char* lexname(int);
long getr(void);
int getnsc(void);
-int escchar(int, vlong*);
+int escchar(int, int*, vlong*);
int getc(void);
void ungetc(int);
void mkpackage(char*);
vlong v;
char *cp;
Rune rune;
+ int escflag;
Sym *s;
l0:
caseq:
for(;;) {
- if(escchar('"', &v))
+ if(escchar('"', &escflag, &v))
break;
- if(v >= Runeself) {
+ if(escflag || v < Runeself) {
+ cp = remal(cp, c1, 1);
+ cp[c1++] = v;
+ } else {
// botch - this limits size of runes
rune = v;
c = runelen(rune);
cp = remal(cp, c1, c);
runetochar(cp+c1, &rune);
c1 += c;
- continue;
}
- cp = remal(cp, c1, 1);
- cp[c1++] = v;
}
goto catem;
case '\'':
/* '.' */
- if(escchar('\'', &v))
+ if(escchar('\'', &escflag, &v))
v = '\''; // allow '''
- if(!escchar('\'', &v)) {
+ if(!escchar('\'', &escflag, &v)) {
yyerror("missing '");
ungetc(v);
}
int
-escchar(int e, vlong *val)
+escchar(int e, int *escflg, vlong *val)
{
- int i;
- long c;
+ int i, c;
vlong l;
+ *escflg = 0;
+
loop:
c = getr();
if(c == '\n') {
goto loop;
case 'x':
+ *escflg = 1; // it's a byte
i = 2;
goto hex;
case '5':
case '6':
case '7':
+ *escflg = 1; // it's a byte
goto oct;
case 'a': c = '\a'; break;
}
if(l > 255)
warn("oct escape value > 255: %d", l);
+
*val = l;
return 0;
}