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