|
@@ -509,19 +509,15 @@ token_t *tokenize_string(char *source, size_t *pos) {
|
|
|
if (!source[*pos] || !strchr("0123456789abcdefABCDEF", source[*pos]))
|
|
|
break;
|
|
|
|
|
|
- buffer[k++] = source[(*pos)++];
|
|
|
+ buf[k++] = source[(*pos)++];
|
|
|
}
|
|
|
|
|
|
if (k != 2)
|
|
|
LEX_ERROR("malformed \\x escape sequence");
|
|
|
|
|
|
- buffer[k] = 0;
|
|
|
+ buf[k] = 0;
|
|
|
|
|
|
- unsigned char c = strtol(buf, NULL, 16)
|
|
|
- if (!c)
|
|
|
- LEX_ERROR("malformed \\x escape sequence");
|
|
|
-
|
|
|
- buffer_append(text, c);
|
|
|
+ buffer_fmt(text, "\\x%s", buf);
|
|
|
} break;
|
|
|
|
|
|
case 'n':
|
|
@@ -536,12 +532,16 @@ token_t *tokenize_string(char *source, size_t *pos) {
|
|
|
buffer_appends(text, "\\r");
|
|
|
break;
|
|
|
|
|
|
+ case 'a':
|
|
|
+ buffer_appends(text, "\\a");
|
|
|
+ break;
|
|
|
+
|
|
|
case 'b':
|
|
|
buffer_appends(text, "\\b");
|
|
|
break;
|
|
|
|
|
|
case 'e':
|
|
|
- buffer_appends(text, "\\e");
|
|
|
+ buffer_appends(text, "\\x1b");
|
|
|
break;
|
|
|
|
|
|
case 's':
|
|
@@ -552,6 +552,10 @@ token_t *tokenize_string(char *source, size_t *pos) {
|
|
|
buffer_appends(text, "\\\"");
|
|
|
break;
|
|
|
|
|
|
+ case '?':
|
|
|
+ buffer_appends(text, "\\\?");
|
|
|
+ break;
|
|
|
+
|
|
|
case '\\':
|
|
|
buffer_appends(text, "\\\\");
|
|
|
break;
|
|
@@ -568,7 +572,7 @@ token_t *tokenize_string(char *source, size_t *pos) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if (c == '"' || c == '\\')
|
|
|
+ if (c == '"' || c == '\\' || c == '?')
|
|
|
buffer_append(text, '\\');
|
|
|
else if (c == '\n')
|
|
|
buffer_appends(text, "\\n");
|