|
@@ -501,6 +501,25 @@ token_t *tokenize_string(char *source, size_t *pos) {
|
|
|
continue;
|
|
|
|
|
|
switch (nc) {
|
|
|
+ case 'x': {
|
|
|
+ char buf[3];
|
|
|
+ int k = 0;
|
|
|
+
|
|
|
+ while (k < 2) {
|
|
|
+ if (!source[*pos] || !strchr("0123456789abcdefABCDEF", source[*pos]))
|
|
|
+ break;
|
|
|
+
|
|
|
+ buf[k++] = source[(*pos)++];
|
|
|
+ }
|
|
|
+
|
|
|
+ if (k != 2)
|
|
|
+ LEX_ERROR("malformed \\x escape sequence");
|
|
|
+
|
|
|
+ buf[k] = 0;
|
|
|
+
|
|
|
+ buffer_fmt(text, "\\x%s", buf);
|
|
|
+ } break;
|
|
|
+
|
|
|
case 'n':
|
|
|
buffer_appends(text, "\\n");
|
|
|
break;
|
|
@@ -513,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':
|
|
@@ -529,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;
|
|
@@ -545,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");
|