txlyre 1 天之前
父節點
當前提交
8072761eee
共有 1 個文件被更改,包括 36 次插入36 次删除
  1. 36 36
      qic.c

+ 36 - 36
qic.c

@@ -3558,22 +3558,21 @@ void compile_block(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
 
 const char *STD[][2] = {
     {"json",
-    "require \"string\"\n"
+        "require \"string\"\n"
     "class JSONError(Error)\n"
     "func json_tokenize(s) {\n"
     "  let toks = []\n"
     "  for var i = 0; i < len(s); i++ {\n"
-    "    if isws(s[i]) {\n"
+    "    if isws(s[i])\n"
     "      continue\n"
-    "    }\n"
     "    if s[i] in \"[]{}:,\"\n"
     "      toks.push((s[i], nil))\n"
     "    elif isalpha(s[i]) {\n"
     "      var text = \"\"\n"
     "      for i < len(s) && isalpha(s[i])\n"
     "        text += s[i++]\n"
-    "      toks.push((\"name\", text))\n"
     "      i--\n"
+    "      toks.push((\"name\", text))\n"
     "    } elif s[i] == '-' || isdigit(s[i]) {\n"
     "      var text = \"\"\n"
     "      if s[i] == '-'\n"
@@ -3590,8 +3589,26 @@ const char *STD[][2] = {
     "    } elif s[i] == '\"' {\n"
     "      var text = \"\"\n"
     "      i++\n"
-    "      for i < len(s) && s[i] != '\"'\n"
-    "        text += s[i++]\n"
+    "      for i < len(s) && s[i] != '\"' {\n"
+    "        var c = s[i++]\n"
+    "        if c == `\\` {\n"
+    "          if i >= len(s)\n"
+    "            throw JSONError(f\"#${i}: unterminated string literal\")\n"
+    "          switch s[i] {\n"
+    "            case \"n\":\n"
+    "              c = \"\\n\"\n"
+    "              break\n"
+    "            case \"r\":\n"
+    "              c = \"\\r\"\n"
+    "              break\n"
+    "            case \"t\":\n"
+    "              c = \"\\t\"\n"
+    "              break\n"
+    "          }\n"
+    "          i++\n"
+    "        }\n"
+    "        text += c\n"
+    "      }\n"
     "      if i >= len(s) || s[i] != '\"'\n"
     "        throw JSONError(f\"#${i}: unterminated string literal\")\n"
     "      toks.push((\"string\", text))\n"
@@ -3678,43 +3695,26 @@ const char *STD[][2] = {
     "func json_dump(d) {\n"
     "  func escape(s) {\n"
     "    var r = \"\"\n"
-    "    var skip = false\n"
+    "    \n"
     "    for var c of s {\n"
-    "      if skip {\n"
-    "        switch c {\n"
-    "          case \"n\":\n"
-    "            r += \"\\n\"\n"
-    "            break\n"
-    "          case \"r\":\n"
-    "            r += \"\\r\"\n"
-    "            break\n"
-    "          case \"t\":\n"
-    "            r += \"\\t\"\n"
-    "            break\n"
-    "          case '\"':\n"
-    "            r += `\\\"`\n"
-    "            break\n"
-    "          case `\\`:\n"
-    "            r += `\\\\`\n"
-    "            break\n"
-    "          default:\n"
-    "            r += c\n"
-    "        }\n"
-    "        skip = false\n"
-    "        continue\n"
-    "      }\n"
-    "      if c == `\\` {\n"
-    "        skip = true\n"
-    "        continue\n"
-    "      }\n"
-    "      r += c\n"
+    "      if c == `\\`\n"
+    "        r += `\\\\`\n"
+    "      elif c == '\"'\n"
+    "        r += `\\\"`\n"
+    "      elif c == \"\\n\"\n"
+    "        r += `\\n`\n"
+    "      elif c == \"\\r\"\n"
+    "        r += `\\r`\n"
+    "      elif c == \"\\t\"\n"
+    "        r += `\\t`\n"
+    "      else r += c\n"
     "    }\n"
     "    return r\n"
     "  }\n"
     "  switch type(d) {\n"
     "    case \"nil\":\n"
     "      return \"null\"\n"
-    "    case \"boolean\":\n"
+    "    case \"bool\":\n"
     "      return d? \"true\": \"false\"\n"
     "    case \"number\":\n"
     "      return str(d)\n"