|
@@ -501,6 +501,29 @@ 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;
|
|
|
+
|
|
|
+ buffer[k++] = source[(*pos)++];
|
|
|
+ }
|
|
|
+
|
|
|
+ if (k != 2)
|
|
|
+ LEX_ERROR("malformed \\x escape sequence");
|
|
|
+
|
|
|
+ buffer[k] = 0;
|
|
|
+
|
|
|
+ unsigned char c = strtol(buf, NULL, 16)
|
|
|
+ if (!c)
|
|
|
+ LEX_ERROR("malformed \\x escape sequence");
|
|
|
+
|
|
|
+ buffer_append(text, c);
|
|
|
+ } break;
|
|
|
+
|
|
|
case 'n':
|
|
|
buffer_appends(text, "\\n");
|
|
|
break;
|