lj_lex_error(ls, TK_string, LJ_ERR_XSTR);
continue;
case '\\': {
- int c;
- next(ls); /* Skip the '\\'. */
- switch (ls->current) {
+ int c = next(ls); /* Skip the '\\'. */
+ switch (c) {
case 'a': c = '\a'; break;
case 'b': c = '\b'; break;
case 'f': c = '\f'; break;
c += 9;
}
break;
- case '*': /* Skip whitespace. */
+ case 'z': /* Skip whitespace. */
next(ls);
while (lj_char_isspace(ls->current))
if (currIsNewline(ls)) inclinenumber(ls); else next(ls);
continue;
case '\n': case '\r': save(ls, '\n'); inclinenumber(ls); continue;
+ case '\\': case '\"': case '\'': break;
case END_OF_STREAM: continue;
default:
- if (!lj_char_isdigit(ls->current)) {
- save_and_next(ls); /* Handles '\\', '\"' and "\'". */
- } else { /* Decimal escape '\ddd'. */
- c = (ls->current - '0');
+ if (!lj_char_isdigit(c))
+ goto err_xesc;
+ c -= '0'; /* Decimal escape '\ddd'. */
+ if (lj_char_isdigit(next(ls))) {
+ c = c*10 + (ls->current - '0');
if (lj_char_isdigit(next(ls))) {
c = c*10 + (ls->current - '0');
- if (lj_char_isdigit(next(ls))) {
- c = c*10 + (ls->current - '0');
- if (c > 255) {
- err_xesc:
- lj_lex_error(ls, TK_string, LJ_ERR_XESC);
- }
- next(ls);
+ if (c > 255) {
+ err_xesc:
+ lj_lex_error(ls, TK_string, LJ_ERR_XESC);
}
+ next(ls);
}
- save(ls, c);
}
+ save(ls, c);
continue;
}
save(ls, c);