2 次代碼提交 863bc0b6dd ... 485ca64dce

作者 SHA1 備註 提交日期
  txlyre 485ca64dce upd 2 天之前
  txlyre b5dc78540f upd 2 天之前
共有 1 個文件被更改,包括 29 次插入2 次删除
  1. 29 2
      qic.c

+ 29 - 2
qic.c

@@ -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");