update to version 2.5 #2

Merged
ntavish merged 4 commits from master into master 2015-03-04 09:57:29 +00:00
6 changed files with 377 additions and 749 deletions
Showing only changes of commit 746c00a27f - Show all commits

View File

@ -1,63 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<base href="http://dkolf.de/src/dkjson-lua.fsl/artifact" />
<title>Artifact Content - dkjson</title>
<link rel="alternate" type="application/rss+xml" title="RSS Feed"
href="/src/dkjson-lua.fsl/timeline.rss" />
<link rel="stylesheet" href="/src/dkjson-lua.fsl/style.css?default" type="text/css"
media="screen" />
</head>
<body>
<h1>Artifact Content &mdash; dkjson</h1>
<div class="mainmenu">
<a href='/'>dkolf.de</a>
<a href='/src/dkjson-lua.fsl/home'>dkjson</a>
<a href='/src/dkjson-lua.fsl/timeline'>Timeline</a>
<a href='/src/dkjson-lua.fsl/brlist'>Branches</a>
<a href='/src/dkjson-lua.fsl/taglist'>Tags</a>
<a href='/src/dkjson-lua.fsl/wiki'>Wiki</a>
<a href='/src/dkjson-lua.fsl/login'>Login</a>
</div>
<div class="submenu">
<a class="label" href="/src/dkjson-lua.fsl/timeline?n=200&amp;uf=f1093c6b2e5a858b6100958c8c5e575ae439a0df">Checkins Using</a>
<a class="label" href="/src/dkjson-lua.fsl/raw/dkjson-2.5-2.rockspec?name=f1093c6b2e5a858b6100958c8c5e575ae439a0df">Download</a>
<a class="label" href="/src/dkjson-lua.fsl/hexdump?name=f1093c6b2e5a858b6100958c8c5e575ae439a0df">Hex</a>
</div>
<div class="content">
<script>
function gebi(x){
if(/^#/.test(x)) x = x.substr(1);
var e = document.getElementById(x);
if(!e) throw new Error("Expecting element with ID "+x);
else return e;}
</script>
<h2>Artifact f1093c6b2e5a858b6100958c8c5e575ae439a0df:</h2>
<ul>
<li>File
<a id='a1' href='/src/dkjson-lua.fsl/honeypot'>dkjson-2.5-2.rockspec</a>
<ul>
<li>
2015-03-02 20:42:23
- part of checkin
<span class="timelineHistDsp">[dbf5178674]</span>
on branch <a id='a2' href='/src/dkjson-lua.fsl/honeypot'>trunk</a>
- tested for Lua 5.3, updated rockspec
(user:
dhkolf
</ul>
</ul>
<hr />
<blockquote>
<pre>
package = &quot;dkjson&quot;
version = &quot;2.5-2&quot;
package = "dkjson"
version = "2.5-2"
source = {
url = &quot;http://dkolf.de/src/dkjson-lua.fsl/tarball/dkjson-2.5.tar.gz?uuid=release_2_5&quot;,
file = &quot;dkjson-2.5.tar.gz&quot;
url = "http://dkolf.de/src/dkjson-lua.fsl/tarball/dkjson-2.5.tar.gz?uuid=release_2_5",
file = "dkjson-2.5.tar.gz"
}
description = {
summary = &quot;David Kolf's JSON module for Lua&quot;,
summary = "David Kolf's JSON module for Lua",
detailed = [[
dkjson is a module for encoding and decoding JSON data. It supports UTF-8.
@ -67,26 +15,16 @@ on the syntax for JavaScript data structures.
dkjson is written in Lua without any dependencies, but
when LPeg is available dkjson uses it to speed up decoding.
]],
homepage = &quot;http://dkolf.de/src/dkjson-lua.fsl/&quot;,
license = &quot;MIT/X11&quot;
homepage = "http://dkolf.de/src/dkjson-lua.fsl/",
license = "MIT/X11"
}
dependencies = {
&quot;lua &gt;= 5.1, &lt; 5.4&quot;
"lua >= 5.1, < 5.4"
}
build = {
type = &quot;builtin&quot;,
type = "builtin",
modules = {
dkjson = &quot;dkjson.lua&quot;
dkjson = "dkjson.lua"
}
}
</pre>
</blockquote>
</div>
<div class="footer">
<a href="./">dkolf.de</a>
<a href="/contact">contact</a>
(This page was generated by <a class="extlink" href="http://www.fossil-scm.org/">Fossil</a>.)
</div>
</body></html>

View File

@ -1,55 +1,3 @@
<!DOCTYPE html>
<html>
<head>
<base href="http://dkolf.de/src/dkjson-lua.fsl/artifact" />
<title>Artifact Content - dkjson</title>
<link rel="alternate" type="application/rss+xml" title="RSS Feed"
href="/src/dkjson-lua.fsl/timeline.rss" />
<link rel="stylesheet" href="/src/dkjson-lua.fsl/style.css?default" type="text/css"
media="screen" />
</head>
<body>
<h1>Artifact Content &mdash; dkjson</h1>
<div class="mainmenu">
<a href='/'>dkolf.de</a>
<a href='/src/dkjson-lua.fsl/home'>dkjson</a>
<a href='/src/dkjson-lua.fsl/timeline'>Timeline</a>
<a href='/src/dkjson-lua.fsl/brlist'>Branches</a>
<a href='/src/dkjson-lua.fsl/taglist'>Tags</a>
<a href='/src/dkjson-lua.fsl/wiki'>Wiki</a>
<a href='/src/dkjson-lua.fsl/login'>Login</a>
</div>
<div class="submenu">
<a class="label" href="/src/dkjson-lua.fsl/timeline?n=200&amp;uf=19fd705cf41e4977b7fe04c79c0808b079836024">Checkins Using</a>
<a class="label" href="/src/dkjson-lua.fsl/raw/dkjson.lua?name=19fd705cf41e4977b7fe04c79c0808b079836024">Download</a>
<a class="label" href="/src/dkjson-lua.fsl/hexdump?name=19fd705cf41e4977b7fe04c79c0808b079836024">Hex</a>
</div>
<div class="content">
<script>
function gebi(x){
if(/^#/.test(x)) x = x.substr(1);
var e = document.getElementById(x);
if(!e) throw new Error("Expecting element with ID "+x);
else return e;}
</script>
<h2>Artifact 19fd705cf41e4977b7fe04c79c0808b079836024:</h2>
<ul>
<li>File
<a id='a1' href='/src/dkjson-lua.fsl/honeypot'>dkjson.lua</a>
<ul>
<li>
2014-04-28 21:16:16
- part of checkin
<span class="timelineHistDsp">[3d24a61dd0]</span>
on branch <a id='a2' href='/src/dkjson-lua.fsl/honeypot'>trunk</a>
- fix line breaks in readme.txt, fix release year
(user:
dhkolf
</ul>
</ul>
<hr />
<blockquote>
<pre>
-- Module options:
local always_try_using_lpeg = true
local register_global_module_table = false
@ -63,7 +11,7 @@ Version 2.5
For the documentation see the corresponding readme.txt or visit
&lt;http://dkolf.de/src/dkjson-lua.fsl/&gt;.
<http://dkolf.de/src/dkjson-lua.fsl/>.
You can contact the author by sending an e-mail to 'david' at the
domain 'dkolf.de'.
@ -73,7 +21,7 @@ Copyright (C) 2010-2014 David Heiko Kolf
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
&quot;Software&quot;), to deal in the Software without restriction, including
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
@ -82,7 +30,7 @@ the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
@ -104,7 +52,7 @@ local strrep, gsub, strsub, strbyte, strchar, strfind, strlen, strformat =
local strmatch = string.match
local concat = table.concat
local json = { version = &quot;dkjson 2.5&quot; }
local json = { version = "dkjson 2.5" }
if register_global_module_table then
_G[global_module_name] = json
@ -115,12 +63,12 @@ local _ENV = nil -- blocking globals in Lua 5.2
pcall (function()
-- Enable access to blocked metatables.
-- Don't worry, this module doesn't change anything in them.
local debmeta = require &quot;debug&quot;.getmetatable
local debmeta = require "debug".getmetatable
if debmeta then getmetatable = debmeta end
end)
json.null = setmetatable ({}, {
__tojson = function () return &quot;null&quot; end
__tojson = function () return "null" end
})
local function isarray (tbl)
@ -128,28 +76,28 @@ local function isarray (tbl)
for k,v in pairs (tbl) do
if k == 'n' and type(v) == 'number' then
arraylen = v
if v &gt; max then
if v > max then
max = v
end
else
if type(k) ~= 'number' or k &lt; 1 or floor(k) ~= k then
if type(k) ~= 'number' or k < 1 or floor(k) ~= k then
return false
end
if k &gt; max then
if k > max then
max = k
end
n = n + 1
end
end
if max &gt; 10 and max &gt; arraylen and max &gt; n * 2 then
if max > 10 and max > arraylen and max > n * 2 then
return false -- don't create an array with too many holes
end
return true, max
end
local escapecodes = {
[&quot;\&quot;&quot;] = &quot;\\\&quot;&quot;, [&quot;\\&quot;] = &quot;\\\\&quot;, [&quot;\b&quot;] = &quot;\\b&quot;, [&quot;\f&quot;] = &quot;\\f&quot;,
[&quot;\n&quot;] = &quot;\\n&quot;, [&quot;\r&quot;] = &quot;\\r&quot;, [&quot;\t&quot;] = &quot;\\t&quot;
["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f",
["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t"
}
local function escapeutf8 (uchar)
@ -159,26 +107,26 @@ local function escapeutf8 (uchar)
end
local a, b, c, d = strbyte (uchar, 1, 4)
a, b, c, d = a or 0, b or 0, c or 0, d or 0
if a &lt;= 0x7f then
if a <= 0x7f then
value = a
elseif 0xc0 &lt;= a and a &lt;= 0xdf and b &gt;= 0x80 then
elseif 0xc0 <= a and a <= 0xdf and b >= 0x80 then
value = (a - 0xc0) * 0x40 + b - 0x80
elseif 0xe0 &lt;= a and a &lt;= 0xef and b &gt;= 0x80 and c &gt;= 0x80 then
elseif 0xe0 <= a and a <= 0xef and b >= 0x80 and c >= 0x80 then
value = ((a - 0xe0) * 0x40 + b - 0x80) * 0x40 + c - 0x80
elseif 0xf0 &lt;= a and a &lt;= 0xf7 and b &gt;= 0x80 and c &gt;= 0x80 and d &gt;= 0x80 then
elseif 0xf0 <= a and a <= 0xf7 and b >= 0x80 and c >= 0x80 and d >= 0x80 then
value = (((a - 0xf0) * 0x40 + b - 0x80) * 0x40 + c - 0x80) * 0x40 + d - 0x80
else
return &quot;&quot;
return ""
end
if value &lt;= 0xffff then
return strformat (&quot;\\u%.4x&quot;, value)
elseif value &lt;= 0x10ffff then
if value <= 0xffff then
return strformat ("\\u%.4x", value)
elseif value <= 0x10ffff then
-- encode as UTF-16 surrogate pair
value = value - 0x10000
local highsur, lowsur = 0xD800 + floor (value/0x400), 0xDC00 + (value % 0x400)
return strformat (&quot;\\u%.4x\\u%.4x&quot;, highsur, lowsur)
return strformat ("\\u%.4x\\u%.4x", highsur, lowsur)
else
return &quot;&quot;
return ""
end
end
@ -194,19 +142,19 @@ local function fsub (str, pattern, repl)
end
local function quotestring (value)
-- based on the regexp &quot;escapable&quot; in https://github.com/douglascrockford/JSON-js
value = fsub (value, &quot;[%z\1-\31\&quot;\\\127]&quot;, escapeutf8)
if strfind (value, &quot;[\194\216\220\225\226\239]&quot;) then
value = fsub (value, &quot;\194[\128-\159\173]&quot;, escapeutf8)
value = fsub (value, &quot;\216[\128-\132]&quot;, escapeutf8)
value = fsub (value, &quot;\220\143&quot;, escapeutf8)
value = fsub (value, &quot;\225\158[\180\181]&quot;, escapeutf8)
value = fsub (value, &quot;\226\128[\140-\143\168-\175]&quot;, escapeutf8)
value = fsub (value, &quot;\226\129[\160-\175]&quot;, escapeutf8)
value = fsub (value, &quot;\239\187\191&quot;, escapeutf8)
value = fsub (value, &quot;\239\191[\176-\191]&quot;, escapeutf8)
-- based on the regexp "escapable" in https://github.com/douglascrockford/JSON-js
value = fsub (value, "[%z\1-\31\"\\\127]", escapeutf8)
if strfind (value, "[\194\216\220\225\226\239]") then
value = fsub (value, "\194[\128-\159\173]", escapeutf8)
value = fsub (value, "\216[\128-\132]", escapeutf8)
value = fsub (value, "\220\143", escapeutf8)
value = fsub (value, "\225\158[\180\181]", escapeutf8)
value = fsub (value, "\226\128[\140-\143\168-\175]", escapeutf8)
value = fsub (value, "\226\129[\160-\175]", escapeutf8)
value = fsub (value, "\239\187\191", escapeutf8)
value = fsub (value, "\239\191[\176-\191]", escapeutf8)
end
return &quot;\&quot;&quot; .. value .. &quot;\&quot;&quot;
return "\"" .. value .. "\""
end
json.quotestring = quotestring
@ -223,29 +171,29 @@ end
local decpoint, numfilter
local function updatedecpoint ()
decpoint = strmatch(tostring(0.5), &quot;([^05+])&quot;)
decpoint = strmatch(tostring(0.5), "([^05+])")
-- build a filter that can be used to remove group separators
numfilter = &quot;[^0-9%-%+eE&quot; .. gsub(decpoint, &quot;[%^%$%(%)%%%.%[%]%*%+%-%?]&quot;, &quot;%%%0&quot;) .. &quot;]+&quot;
numfilter = "[^0-9%-%+eE" .. gsub(decpoint, "[%^%$%(%)%%%.%[%]%*%+%-%?]", "%%%0") .. "]+"
end
updatedecpoint()
local function num2str (num)
return replace(fsub(tostring(num), numfilter, &quot;&quot;), decpoint, &quot;.&quot;)
return replace(fsub(tostring(num), numfilter, ""), decpoint, ".")
end
local function str2num (str)
local num = tonumber(replace(str, &quot;.&quot;, decpoint))
local num = tonumber(replace(str, ".", decpoint))
if not num then
updatedecpoint()
num = tonumber(replace(str, &quot;.&quot;, decpoint))
num = tonumber(replace(str, ".", decpoint))
end
return num
end
local function addnewline2 (level, buffer, buflen)
buffer[buflen+1] = &quot;\n&quot;
buffer[buflen+2] = strrep (&quot; &quot;, level)
buffer[buflen+1] = "\n"
buffer[buflen+2] = strrep (" ", level)
buflen = buflen + 2
return buflen
end
@ -262,17 +210,17 @@ local encode2 -- forward declaration
local function addpair (key, value, prev, indent, level, buffer, buflen, tables, globalorder, state)
local kt = type (key)
if kt ~= 'string' and kt ~= 'number' then
return nil, &quot;type '&quot; .. kt .. &quot;' is not supported as a key by JSON.&quot;
return nil, "type '" .. kt .. "' is not supported as a key by JSON."
end
if prev then
buflen = buflen + 1
buffer[buflen] = &quot;,&quot;
buffer[buflen] = ","
end
if indent then
buflen = addnewline2 (level, buffer, buflen)
end
buffer[buflen+1] = quotestring (key)
buffer[buflen+2] = &quot;:&quot;
buffer[buflen+2] = ":"
return encode2 (value, indent, level, buffer, buflen + 2, tables, globalorder, state)
end
@ -299,7 +247,7 @@ local function exception(reason, value, state, buffer, buflen, defaultmessage)
end
function json.encodeexception(reason, value, state, defaultmessage)
return quotestring(&quot;&lt;&quot; .. defaultmessage .. &quot;&gt;&quot;)
return quotestring("<" .. defaultmessage .. ">")
end
encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, state)
@ -319,12 +267,12 @@ encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, s
buflen = appendcustom(ret, buffer, state)
elseif value == nil then
buflen = buflen + 1
buffer[buflen] = &quot;null&quot;
buffer[buflen] = "null"
elseif valtype == 'number' then
local s
if value ~= value or value &gt;= huge or -value &gt;= huge then
if value ~= value or value >= huge or -value >= huge then
-- This is the behaviour of the original JSON implementation.
s = &quot;null&quot;
s = "null"
else
s = num2str (value)
end
@ -332,7 +280,7 @@ encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, s
buffer[buflen] = s
elseif valtype == 'boolean' then
buflen = buflen + 1
buffer[buflen] = value and &quot;true&quot; or &quot;false&quot;
buffer[buflen] = value and "true" or "false"
elseif valtype == 'string' then
buflen = buflen + 1
buffer[buflen] = quotestring (value)
@ -349,21 +297,21 @@ encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, s
local msg
if isa then -- JSON array
buflen = buflen + 1
buffer[buflen] = &quot;[&quot;
buffer[buflen] = "["
for i = 1, n do
buflen, msg = encode2 (value[i], indent, level, buffer, buflen, tables, globalorder, state)
if not buflen then return nil, msg end
if i &lt; n then
if i < n then
buflen = buflen + 1
buffer[buflen] = &quot;,&quot;
buffer[buflen] = ","
end
end
buflen = buflen + 1
buffer[buflen] = &quot;]&quot;
buffer[buflen] = "]"
else -- JSON object
local prev = false
buflen = buflen + 1
buffer[buflen] = &quot;{&quot;
buffer[buflen] = "{"
local order = valmeta and valmeta.__jsonorder or globalorder
if order then
local used = {}
@ -395,12 +343,12 @@ encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, s
buflen = addnewline2 (level - 1, buffer, buflen)
end
buflen = buflen + 1
buffer[buflen] = &quot;}&quot;
buffer[buflen] = "}"
end
tables[value] = nil
else
return exception ('unsupported type', value, state, buffer, buflen,
&quot;type '&quot; .. valtype .. &quot;' is not supported by JSON.&quot;)
"type '" .. valtype .. "' is not supported by JSON.")
end
return buflen
end
@ -428,8 +376,8 @@ end
local function loc (str, where)
local line, pos, linepos = 1, 1, 0
while true do
pos = strfind (str, &quot;\n&quot;, pos, true)
if pos and pos &lt; where then
pos = strfind (str, "\n", pos, true)
if pos and pos < where then
line = line + 1
linepos = pos
pos = pos + 1
@ -437,26 +385,26 @@ local function loc (str, where)
break
end
end
return &quot;line &quot; .. line .. &quot;, column &quot; .. (where - linepos)
return "line " .. line .. ", column " .. (where - linepos)
end
local function unterminated (str, what, where)
return nil, strlen (str) + 1, &quot;unterminated &quot; .. what .. &quot; at &quot; .. loc (str, where)
return nil, strlen (str) + 1, "unterminated " .. what .. " at " .. loc (str, where)
end
local function scanwhite (str, pos)
while true do
pos = strfind (str, &quot;%S&quot;, pos)
pos = strfind (str, "%S", pos)
if not pos then return nil end
local sub2 = strsub (str, pos, pos + 1)
if sub2 == &quot;\239\187&quot; and strsub (str, pos + 2, pos + 2) == &quot;\191&quot; then
if sub2 == "\239\187" and strsub (str, pos + 2, pos + 2) == "\191" then
-- UTF-8 Byte Order Mark
pos = pos + 3
elseif sub2 == &quot;//&quot; then
pos = strfind (str, &quot;[\n\r]&quot;, pos + 2)
elseif sub2 == "//" then
pos = strfind (str, "[\n\r]", pos + 2)
if not pos then return nil end
elseif sub2 == &quot;/*&quot; then
pos = strfind (str, &quot;*/&quot;, pos + 2)
elseif sub2 == "/*" then
pos = strfind (str, "*/", pos + 2)
if not pos then return nil end
pos = pos + 2
else
@ -466,23 +414,23 @@ local function scanwhite (str, pos)
end
local escapechars = {
[&quot;\&quot;&quot;] = &quot;\&quot;&quot;, [&quot;\\&quot;] = &quot;\\&quot;, [&quot;/&quot;] = &quot;/&quot;, [&quot;b&quot;] = &quot;\b&quot;, [&quot;f&quot;] = &quot;\f&quot;,
[&quot;n&quot;] = &quot;\n&quot;, [&quot;r&quot;] = &quot;\r&quot;, [&quot;t&quot;] = &quot;\t&quot;
["\""] = "\"", ["\\"] = "\\", ["/"] = "/", ["b"] = "\b", ["f"] = "\f",
["n"] = "\n", ["r"] = "\r", ["t"] = "\t"
}
local function unichar (value)
if value &lt; 0 then
if value < 0 then
return nil
elseif value &lt;= 0x007f then
elseif value <= 0x007f then
return strchar (value)
elseif value &lt;= 0x07ff then
elseif value <= 0x07ff then
return strchar (0xc0 + floor(value/0x40),
0x80 + (floor(value) % 0x40))
elseif value &lt;= 0xffff then
elseif value <= 0xffff then
return strchar (0xe0 + floor(value/0x1000),
0x80 + (floor(value/0x40) % 0x40),
0x80 + (floor(value) % 0x40))
elseif value &lt;= 0x10ffff then
elseif value <= 0x10ffff then
return strchar (0xf0 + floor(value/0x40000),
0x80 + (floor(value/0x1000) % 0x40),
0x80 + (floor(value/0x40) % 0x40),
@ -496,30 +444,30 @@ local function scanstring (str, pos)
local lastpos = pos + 1
local buffer, n = {}, 0
while true do
local nextpos = strfind (str, &quot;[\&quot;\\]&quot;, lastpos)
local nextpos = strfind (str, "[\"\\]", lastpos)
if not nextpos then
return unterminated (str, &quot;string&quot;, pos)
return unterminated (str, "string", pos)
end
if nextpos &gt; lastpos then
if nextpos > lastpos then
n = n + 1
buffer[n] = strsub (str, lastpos, nextpos - 1)
end
if strsub (str, nextpos, nextpos) == &quot;\&quot;&quot; then
if strsub (str, nextpos, nextpos) == "\"" then
lastpos = nextpos + 1
break
else
local escchar = strsub (str, nextpos + 1, nextpos + 1)
local value
if escchar == &quot;u&quot; then
if escchar == "u" then
value = tonumber (strsub (str, nextpos + 2, nextpos + 5), 16)
if value then
local value2
if 0xD800 &lt;= value and value &lt;= 0xDBff then
if 0xD800 <= value and value <= 0xDBff then
-- we have the high surrogate of UTF-16. Check if there is a
-- low surrogate escaped nearby to combine them.
if strsub (str, nextpos + 6, nextpos + 7) == &quot;\\u&quot; then
if strsub (str, nextpos + 6, nextpos + 7) == "\\u" then
value2 = tonumber (strsub (str, nextpos + 8, nextpos + 11), 16)
if value2 and 0xDC00 &lt;= value2 and value2 &lt;= 0xDFFF then
if value2 and 0xDC00 <= value2 and value2 <= 0xDFFF then
value = (value - 0xD800) * 0x400 + (value2 - 0xDC00) + 0x10000
else
value2 = nil -- in case it was out of range for a low surrogate
@ -546,10 +494,10 @@ local function scanstring (str, pos)
end
if n == 1 then
return buffer[1], lastpos
elseif n &gt; 1 then
elseif n > 1 then
return concat (buffer), lastpos
else
return &quot;&quot;, lastpos
return "", lastpos
end
end
@ -577,9 +525,9 @@ local function scantable (what, closechar, str, startpos, nullval, objectmeta, a
pos = scanwhite (str, pos)
if not pos then return unterminated (str, what, startpos) end
char = strsub (str, pos, pos)
if char == &quot;:&quot; then
if char == ":" then
if val1 == nil then
return nil, pos, &quot;cannot use nil as table index (at &quot; .. loc (str, pos) .. &quot;)&quot;
return nil, pos, "cannot use nil as table index (at " .. loc (str, pos) .. ")"
end
pos = scanwhite (str, pos + 1)
if not pos then return unterminated (str, what, startpos) end
@ -594,7 +542,7 @@ local function scantable (what, closechar, str, startpos, nullval, objectmeta, a
n = n + 1
tbl[n] = val1
end
if char == &quot;,&quot; then
if char == "," then
pos = pos + 1
end
end
@ -604,40 +552,40 @@ scanvalue = function (str, pos, nullval, objectmeta, arraymeta)
pos = pos or 1
pos = scanwhite (str, pos)
if not pos then
return nil, strlen (str) + 1, &quot;no valid JSON value (reached the end)&quot;
return nil, strlen (str) + 1, "no valid JSON value (reached the end)"
end
local char = strsub (str, pos, pos)
if char == &quot;{&quot; then
return scantable ('object', &quot;}&quot;, str, pos, nullval, objectmeta, arraymeta)
elseif char == &quot;[&quot; then
return scantable ('array', &quot;]&quot;, str, pos, nullval, objectmeta, arraymeta)
elseif char == &quot;\&quot;&quot; then
if char == "{" then
return scantable ('object', "}", str, pos, nullval, objectmeta, arraymeta)
elseif char == "[" then
return scantable ('array', "]", str, pos, nullval, objectmeta, arraymeta)
elseif char == "\"" then
return scanstring (str, pos)
else
local pstart, pend = strfind (str, &quot;^%-?[%d%.]+[eE]?[%+%-]?%d*&quot;, pos)
local pstart, pend = strfind (str, "^%-?[%d%.]+[eE]?[%+%-]?%d*", pos)
if pstart then
local number = str2num (strsub (str, pstart, pend))
if number then
return number, pend + 1
end
end
pstart, pend = strfind (str, &quot;^%a%w*&quot;, pos)
pstart, pend = strfind (str, "^%a%w*", pos)
if pstart then
local name = strsub (str, pstart, pend)
if name == &quot;true&quot; then
if name == "true" then
return true, pend + 1
elseif name == &quot;false&quot; then
elseif name == "false" then
return false, pend + 1
elseif name == &quot;null&quot; then
elseif name == "null" then
return nullval, pend + 1
end
end
return nil, pos, &quot;no valid JSON value at &quot; .. loc (str, pos)
return nil, pos, "no valid JSON value at " .. loc (str, pos)
end
end
local function optionalmetatables(...)
if select(&quot;#&quot;, ...) &gt; 0 then
if select("#", ...) > 0 then
return ...
else
return {__jsontype = 'object'}, {__jsontype = 'array'}
@ -650,10 +598,10 @@ function json.decode (str, pos, nullval, ...)
end
function json.use_lpeg ()
local g = require (&quot;lpeg&quot;)
local g = require ("lpeg")
if g.version() == &quot;0.11&quot; then
error &quot;due to a bug in LPeg 0.11, it cannot be used for JSON matching&quot;
if g.version() == "0.11" then
error "due to a bug in LPeg 0.11, it cannot be used for JSON matching"
end
local pegmatch = g.match
@ -661,7 +609,7 @@ function json.use_lpeg ()
local function ErrorCall (str, pos, msg, state)
if not state.msg then
state.msg = msg .. &quot; at &quot; .. loc (str, pos)
state.msg = msg .. " at " .. loc (str, pos)
state.pos = pos
end
return false
@ -671,16 +619,16 @@ function json.use_lpeg ()
return g.Cmt (g.Cc (msg) * g.Carg (2), ErrorCall)
end
local SingleLineComment = P&quot;//&quot; * (1 - S&quot;\n\r&quot;)^0
local MultiLineComment = P&quot;/*&quot; * (1 - P&quot;*/&quot;)^0 * P&quot;*/&quot;
local Space = (S&quot; \n\r\t&quot; + P&quot;\239\187\191&quot; + SingleLineComment + MultiLineComment)^0
local SingleLineComment = P"//" * (1 - S"\n\r")^0
local MultiLineComment = P"/*" * (1 - P"*/")^0 * P"*/"
local Space = (S" \n\r\t" + P"\239\187\191" + SingleLineComment + MultiLineComment)^0
local PlainChar = 1 - S&quot;\&quot;\\\n\r&quot;
local EscapeSequence = (P&quot;\\&quot; * g.C (S&quot;\&quot;\\/bfnrt&quot; + Err &quot;unsupported escape sequence&quot;)) / escapechars
local HexDigit = R(&quot;09&quot;, &quot;af&quot;, &quot;AF&quot;)
local PlainChar = 1 - S"\"\\\n\r"
local EscapeSequence = (P"\\" * g.C (S"\"\\/bfnrt" + Err "unsupported escape sequence")) / escapechars
local HexDigit = R("09", "af", "AF")
local function UTF16Surrogate (match, pos, high, low)
high, low = tonumber (high, 16), tonumber (low, 16)
if 0xD800 &lt;= high and high &lt;= 0xDBff and 0xDC00 &lt;= low and low &lt;= 0xDFFF then
if 0xD800 <= high and high <= 0xDBff and 0xDC00 <= low and low <= 0xDFFF then
return true, unichar ((high - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000)
else
return false
@ -689,15 +637,15 @@ function json.use_lpeg ()
local function UTF16BMP (hex)
return unichar (tonumber (hex, 16))
end
local U16Sequence = (P&quot;\\u&quot; * g.C (HexDigit * HexDigit * HexDigit * HexDigit))
local U16Sequence = (P"\\u" * g.C (HexDigit * HexDigit * HexDigit * HexDigit))
local UnicodeEscape = g.Cmt (U16Sequence * U16Sequence, UTF16Surrogate) + U16Sequence/UTF16BMP
local Char = UnicodeEscape + EscapeSequence + PlainChar
local String = P&quot;\&quot;&quot; * g.Cs (Char ^ 0) * (P&quot;\&quot;&quot; + Err &quot;unterminated string&quot;)
local Integer = P&quot;-&quot;^(-1) * (P&quot;0&quot; + (R&quot;19&quot; * R&quot;09&quot;^0))
local Fractal = P&quot;.&quot; * R&quot;09&quot;^0
local Exponent = (S&quot;eE&quot;) * (S&quot;+-&quot;)^(-1) * R&quot;09&quot;^1
local String = P"\"" * g.Cs (Char ^ 0) * (P"\"" + Err "unterminated string")
local Integer = P"-"^(-1) * (P"0" + (R"19" * R"09"^0))
local Fractal = P"." * R"09"^0
local Exponent = (S"eE") * (S"+-")^(-1) * R"09"^1
local Number = (Integer * Fractal^(-1) * Exponent^(-1))/str2num
local Constant = P&quot;true&quot; * g.Cc (true) + P&quot;false&quot; * g.Cc (false) + P&quot;null&quot; * g.Carg (1)
local Constant = P"true" * g.Cc (true) + P"false" * g.Cc (false) + P"null" * g.Carg (1)
local SimpleValue = Number + String + Constant
local ArrayContent, ObjectContent
@ -730,13 +678,13 @@ function json.use_lpeg ()
return pos, setmetatable (t, state.objectmeta)
end
local Array = P&quot;[&quot; * g.Cmt (g.Carg(1) * g.Carg(2), parsearray) * Space * (P&quot;]&quot; + Err &quot;']' expected&quot;)
local Object = P&quot;{&quot; * g.Cmt (g.Carg(1) * g.Carg(2), parseobject) * Space * (P&quot;}&quot; + Err &quot;'}' expected&quot;)
local Array = P"[" * g.Cmt (g.Carg(1) * g.Carg(2), parsearray) * Space * (P"]" + Err "']' expected")
local Object = P"{" * g.Cmt (g.Carg(1) * g.Carg(2), parseobject) * Space * (P"}" + Err "'}' expected")
local Value = Space * (Array + Object + SimpleValue)
local ExpectedValue = Value + Space * Err &quot;value expected&quot;
ArrayContent = Value * Space * (P&quot;,&quot; * g.Cc'cont' + g.Cc'last') * g.Cp()
local Pair = g.Cg (Space * String * Space * (P&quot;:&quot; + Err &quot;colon expected&quot;) * ExpectedValue)
ObjectContent = Pair * Space * (P&quot;,&quot; * g.Cc'cont' + g.Cc'last') * g.Cp()
local ExpectedValue = Value + Space * Err "value expected"
ArrayContent = Value * Space * (P"," * g.Cc'cont' + g.Cc'last') * g.Cp()
local Pair = g.Cg (Space * String * Space * (P":" + Err "colon expected") * ExpectedValue)
ObjectContent = Pair * Space * (P"," * g.Cc'cont' + g.Cc'last') * g.Cp()
local DecodeValue = ExpectedValue * g.Cp ()
function json.decode (str, pos, nullval, ...)
@ -755,7 +703,7 @@ function json.use_lpeg ()
json.using_lpeg = true
return json -- so you can get the module using json = require &quot;dkjson&quot;.use_lpeg()
return json -- so you can get the module using json = require "dkjson".use_lpeg()
end
if always_try_using_lpeg then
@ -764,13 +712,3 @@ end
return json
</pre>
</blockquote>
</div>
<div class="footer">
<a href="./">dkolf.de</a>
<a href="/contact">contact</a>
(This page was generated by <a class="extlink" href="http://www.fossil-scm.org/">Fossil</a>.)
</div>
</body></html>

View File

@ -1,55 +1,3 @@
<!DOCTYPE html>
<html>
<head>
<base href="http://dkolf.de/src/dkjson-lua.fsl/artifact" />
<title>Artifact Content - dkjson</title>
<link rel="alternate" type="application/rss+xml" title="RSS Feed"
href="/src/dkjson-lua.fsl/timeline.rss" />
<link rel="stylesheet" href="/src/dkjson-lua.fsl/style.css?default" type="text/css"
media="screen" />
</head>
<body>
<h1>Artifact Content &mdash; dkjson</h1>
<div class="mainmenu">
<a href='/'>dkolf.de</a>
<a href='/src/dkjson-lua.fsl/home'>dkjson</a>
<a href='/src/dkjson-lua.fsl/timeline'>Timeline</a>
<a href='/src/dkjson-lua.fsl/brlist'>Branches</a>
<a href='/src/dkjson-lua.fsl/taglist'>Tags</a>
<a href='/src/dkjson-lua.fsl/wiki'>Wiki</a>
<a href='/src/dkjson-lua.fsl/login'>Login</a>
</div>
<div class="submenu">
<a class="label" href="/src/dkjson-lua.fsl/timeline?n=200&amp;uf=4711879926db7149e28e639af37a95356026c770">Checkins Using</a>
<a class="label" href="/src/dkjson-lua.fsl/raw/jsontest.lua?name=4711879926db7149e28e639af37a95356026c770">Download</a>
<a class="label" href="/src/dkjson-lua.fsl/hexdump?name=4711879926db7149e28e639af37a95356026c770">Hex</a>
</div>
<div class="content">
<script>
function gebi(x){
if(/^#/.test(x)) x = x.substr(1);
var e = document.getElementById(x);
if(!e) throw new Error("Expecting element with ID "+x);
else return e;}
</script>
<h2>Artifact 4711879926db7149e28e639af37a95356026c770:</h2>
<ul>
<li>File
<a id='a1' href='/src/dkjson-lua.fsl/honeypot'>jsontest.lua</a>
<ul>
<li>
2014-03-11 21:36:39
- part of checkin
<span class="timelineHistDsp">[14a1712f0a]</span>
on branch <a id='a2' href='/src/dkjson-lua.fsl/honeypot'>trunk</a>
- handle multi line comments
(user:
dhkolf
</ul>
</ul>
<hr />
<blockquote>
<pre>
local encode, decode, dkencode, dkdecode
@ -66,18 +14,18 @@ local test_module, opt = ... -- command line argument
--local test_module = 'th-json'
test_module = test_module or 'dkjson'
--local opt = &quot;esc&quot; -- Test which characters in the BMP get escaped and whether this is correct
--local opt = &quot;esc_full&quot; -- Full range from 0 to 0x10ffff
--local opt = &quot;esc_asc&quot; -- Just 0 to 127
--local opt = "esc" -- Test which characters in the BMP get escaped and whether this is correct
--local opt = "esc_full" -- Full range from 0 to 0x10ffff
--local opt = "esc_asc" -- Just 0 to 127
--local opt = &quot;refcycle&quot; -- What happens when a reference cycle gets encoded?
--local opt = "refcycle" -- What happens when a reference cycle gets encoded?
local testlocale = &quot;de_DE.UTF8&quot;
local testlocale = "de_DE.UTF8"
local function inlocale(fn)
local oldloc = os.setlocale(nil, 'numeric')
if not os.setlocale(testlocale, 'numeric') then
print(&quot;test could not switch to locale &quot;..testlocale)
print("test could not switch to locale "..testlocale)
else
fn()
end
@ -86,19 +34,19 @@ end
if test_module == 'dkjson-nopeg' then
test_module = 'dkjson'
package.preload[&quot;lpeg&quot;] = function () error &quot;lpeg disabled&quot; end
package.loaded[&quot;lpeg&quot;] = nil
package.preload["lpeg"] = function () error "lpeg disabled" end
package.loaded["lpeg"] = nil
lpeg = nil
end
if test_module == 'dkjson-lulpeg' then
test_module = 'dkjson'
package.loaded[&quot;lpeg&quot;] = require &quot;lulpeg&quot;
package.loaded["lpeg"] = require "lulpeg"
end
do
-- http://chiselapp.com/user/dhkolf/repository/dkjson/
local dkjson = require &quot;dkjson&quot;
local dkjson = require "dkjson"
dkencode = dkjson.encode
dkdecode = dkjson.decode
end
@ -106,7 +54,7 @@ end
if test_module == 'cmj-json' then
-- https://github.com/craigmj/json4lua/
-- http://json.luaforge.net/
local json = require &quot;cmjjson&quot; -- renamed, the original file was just 'json'
local json = require "cmjjson" -- renamed, the original file was just 'json'
encode = json.encode
decode = json.decode
elseif test_module == 'dkjson' then
@ -115,59 +63,59 @@ elseif test_module == 'dkjson' then
decode = dkdecode
elseif test_module == 'fleece' then
-- http://www.eonblast.com/fleece/
local fleece = require &quot;fleece&quot;
encode = function(x) return fleece.json(x, &quot;E4&quot;) end
local fleece = require "fleece"
encode = function(x) return fleece.json(x, "E4") end
elseif test_module == 'jf-json' then
-- http://regex.info/blog/lua/json
local json = require &quot;jfjson&quot; -- renamed, the original file was just 'JSON'
local json = require "jfjson" -- renamed, the original file was just 'JSON'
encode = function(x) return json:encode(x) end
decode = function(x) return json:decode(x) end
elseif test_module == 'lua-yajl' then
-- http://github.com/brimworks/lua-yajl
local yajl = require (&quot;yajl&quot;)
local yajl = require ("yajl")
encode = yajl.to_string
decode = yajl.to_value
elseif test_module == 'mp-cjson' then
-- http://www.kyne.com.au/~mark/software/lua-cjson.php
local json = require &quot;cjson&quot;
local json = require "cjson"
encode = json.encode
decode = json.decode
elseif test_module == 'nm-json' then
-- http://luaforge.net/projects/luajsonlib/
local json = require &quot;LuaJSON&quot;
local json = require "LuaJSON"
encode = json.encode or json.stringify
decode = json.decode or json.parse
elseif test_module == 'sb-json' then
-- http://www.chipmunkav.com/downloads/Json.lua
local json = require &quot;sbjson&quot; -- renamed, the original file was just 'Json'
local json = require "sbjson" -- renamed, the original file was just 'Json'
encode = json.Encode
decode = json.Decode
elseif test_module == 'th-json' then
-- https://github.com/harningt/luajson
-- http://luaforge.net/projects/luajson/
local json = require &quot;json&quot;
local json = require "json"
encode = json.encode
decode = json.decode
else
print &quot;No module specified&quot;
print "No module specified"
return
end
if not encode then
print (&quot;No encode method&quot;)
print ("No encode method")
else
local x, r
local escapecodes = {
[&quot;\&quot;&quot;] = &quot;\\\&quot;&quot;, [&quot;\\&quot;] = &quot;\\\\&quot;, [&quot;\b&quot;] = &quot;\\b&quot;, [&quot;\f&quot;] = &quot;\\f&quot;,
[&quot;\n&quot;] = &quot;\\n&quot;, [&quot;\r&quot;] = &quot;\\r&quot;, [&quot;\t&quot;] = &quot;\\t&quot;, [&quot;/&quot;] = &quot;\\/&quot;
["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f",
["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t", ["/"] = "\\/"
}
local function test (x, n, expect)
local enc = encode{ x }:match(&quot;^%s*%[%s*%\&quot;(.-)%\&quot;%s*%]%s*$&quot;)
local enc = encode{ x }:match("^%s*%[%s*%\"(.-)%\"%s*%]%s*$")
if not enc or (escapecodes[x] ~= enc
and (&quot;\\u%04x&quot;):format(n) ~= enc:gsub(&quot;[A-F]&quot;, string.lower)
and not (expect and enc:match(&quot;^&quot;..expect..&quot;$&quot;))) then
print((&quot;U+%04X isn't encoded correctly: %q&quot;):format(n, enc))
and ("\\u%04x"):format(n) ~= enc:gsub("[A-F]", string.lower)
and not (expect and enc:match("^"..expect.."$"))) then
print(("U+%04X isn't encoded correctly: %q"):format(n, enc))
end
end
@ -175,81 +123,81 @@ else
for i = 0,31 do
test(string.char(i), i)
end
test(&quot;\&quot;&quot;, (&quot;\&quot;&quot;):byte())
test(&quot;\\&quot;, (&quot;\\&quot;):byte())
test("\"", ("\""):byte())
test("\\", ("\\"):byte())
-- necessary escapes for JavaScript:
test(&quot;\226\128\168&quot;, 0x2028)
test(&quot;\226\128\169&quot;, 0x2029)
test("\226\128\168", 0x2028)
test("\226\128\169", 0x2029)
-- invalid escapes that were seen in the wild:
test(&quot;'&quot;, (&quot;'&quot;):byte(), &quot;%'&quot;)
test("'", ("'"):byte(), "%'")
r,x = pcall (encode, { [1000] = &quot;x&quot; })
r,x = pcall (encode, { [1000] = "x" })
if not r then
print (&quot;encoding a sparse array (#=0) raises an error:&quot;, x)
print ("encoding a sparse array (#=0) raises an error:", x)
else
if #x &gt; 30 then
print (&quot;sparse array (#=0) encoded as:&quot;, x:sub(1,15)..&quot; &lt;...&gt; &quot;..x:sub(-15,-1), &quot;#&quot;..#x)
if #x > 30 then
print ("sparse array (#=0) encoded as:", x:sub(1,15).." <...> "..x:sub(-15,-1), "#"..#x)
else
print (&quot;sparse array (#=0) encoded as:&quot;, x)
print ("sparse array (#=0) encoded as:", x)
end
end
r,x = pcall (encode, { [1] = &quot;a&quot;, [1000] = &quot;x&quot; })
r,x = pcall (encode, { [1] = "a", [1000] = "x" })
if not r then
print (&quot;encoding a sparse array (#=1) raises an error:&quot;, x)
print ("encoding a sparse array (#=1) raises an error:", x)
else
if #x &gt; 30 then
print (&quot;sparse array (#=1) encoded as:&quot;, x:sub(1,15)..&quot; &lt;...&gt; &quot;..x:sub(-15,-1), &quot;#str=&quot;..#x)
if #x > 30 then
print ("sparse array (#=1) encoded as:", x:sub(1,15).." <...> "..x:sub(-15,-1), "#str="..#x)
else
print (&quot;sparse array (#=1) encoded as:&quot;, x)
print ("sparse array (#=1) encoded as:", x)
end
end
r,x = pcall (encode, { [1] = &quot;a&quot;, [5] = &quot;c&quot;, [&quot;x&quot;] = &quot;x&quot; })
r,x = pcall (encode, { [1] = "a", [5] = "c", ["x"] = "x" })
if not r then
print (&quot;encoding a mixed table raises an error:&quot;, x)
print ("encoding a mixed table raises an error:", x)
else
print (&quot;mixed table encoded as:&quot;, x)
print ("mixed table encoded as:", x)
end
r, x = pcall(encode, { math.huge*0 }) -- NaN
if not r then
print (&quot;encoding NaN raises an error:&quot;, x)
print ("encoding NaN raises an error:", x)
else
r = dkdecode(x)
if not r then
print (&quot;NaN isn't converted into valid JSON:&quot;, x)
elseif type(r[1]) == &quot;number&quot; and r[1] == r[1] then -- a number, but not NaN
print (&quot;NaN is converted into a valid number:&quot;, x)
print ("NaN isn't converted into valid JSON:", x)
elseif type(r[1]) == "number" and r[1] == r[1] then -- a number, but not NaN
print ("NaN is converted into a valid number:", x)
else
print (&quot;NaN is converted to:&quot;, x)
print ("NaN is converted to:", x)
end
end
if test_module == 'fleece' then
print (&quot;Fleece (0.3.1) is known to freeze on +/-Inf&quot;)
print ("Fleece (0.3.1) is known to freeze on +/-Inf")
else
r, x = pcall(encode, { math.huge }) -- +Inf
if not r then
print (&quot;encoding +Inf raises an error:&quot;, x)
print ("encoding +Inf raises an error:", x)
else
r = dkdecode(x)
if not r then
print (&quot;+Inf isn't converted into valid JSON:&quot;, x)
print ("+Inf isn't converted into valid JSON:", x)
else
print (&quot;+Inf is converted to:&quot;, x)
print ("+Inf is converted to:", x)
end
end
r, x = pcall(encode, { -math.huge }) -- -Inf
if not r then
print (&quot;encoding -Inf raises an error:&quot;, x)
print ("encoding -Inf raises an error:", x)
else
r = dkdecode(x)
if not r then
print (&quot;-Inf isn't converted into valid JSON:&quot;, x)
print ("-Inf isn't converted into valid JSON:", x)
else
print (&quot;-Inf is converted to:&quot;, x)
print ("-Inf is converted to:", x)
end
end
end
@ -257,9 +205,9 @@ else
inlocale(function ()
local r, x = pcall(encode, { 0.5 })
if not r then
print(&quot;encoding 0.5 in locale raises an error:&quot;, x)
elseif not x:find(&quot;.&quot;, 1, true) then
print(&quot;In locale 0.5 isn't converted into valid JSON:&quot;, x)
print("encoding 0.5 in locale raises an error:", x)
elseif not x:find(".", 1, true) then
print("In locale 0.5 isn't converted into valid JSON:", x)
end
end)
@ -270,35 +218,35 @@ else
local state = {
exception = function (w, v, s)
why, value, exstate = w, v, s
return &quot;\&quot;demo\&quot;&quot;
return "\"demo\""
end
}
local encfunction = function () end
r, x = pcall(dkencode, { encfunction }, state )
if not r then
print(&quot;encoding a function with exception handler raises an error:&quot;, x)
print("encoding a function with exception handler raises an error:", x)
else
if x ~= &quot;[\&quot;demo\&quot;]&quot; then
print(&quot;expected to see output of exception handler for type exception, but got&quot;, x)
if x ~= "[\"demo\"]" then
print("expected to see output of exception handler for type exception, but got", x)
end
if why ~= &quot;unsupported type&quot; then
print(&quot;expected exception reason to be 'unsupported type' for type exception&quot;)
if why ~= "unsupported type" then
print("expected exception reason to be 'unsupported type' for type exception")
end
if value ~= encfunction then
print(&quot;expected to recieve value for type exception&quot;)
print("expected to recieve value for type exception")
end
if exstate ~= state then
print(&quot;expected to recieve state for type exception&quot;)
print("expected to recieve state for type exception")
end
end
r, x = pcall(dkencode, { function () end }, {
exception = function (w, v, s)
return nil, &quot;demo&quot;
return nil, "demo"
end
})
if r or x ~= &quot;demo&quot; then
print(&quot;expected custom error for type exception, but got:&quot;, r, x)
if r or x ~= "demo" then
print("expected custom error for type exception, but got:", r, x)
end
r, x = pcall(dkencode, { function () end }, {
@ -306,8 +254,8 @@ else
return nil
end
})
if r or x ~= &quot;type 'function' is not supported by JSON.&quot; then
print(&quot;expected default error for type exception, but got:&quot;, r, x)
if r or x ~= "type 'function' is not supported by JSON." then
print("expected default error for type exception, but got:", r, x)
end
end
@ -316,34 +264,34 @@ else
local state = {
exception = function (w, v, s)
why, value, exstate = w, v, s
return &quot;\&quot;demo\&quot;&quot;
return "\"demo\""
end
}
local a = {}
a[1] = a
r, x = pcall(dkencode, a, state )
if not r then
print(&quot;encoding a reference cycle with exception handler raises an error:&quot;, x)
print("encoding a reference cycle with exception handler raises an error:", x)
else
if x ~= &quot;[\&quot;demo\&quot;]&quot; then
print(&quot;expected to see output of exception handler for reference cycle exception, but got&quot;, x)
if x ~= "[\"demo\"]" then
print("expected to see output of exception handler for reference cycle exception, but got", x)
end
if why ~= &quot;reference cycle&quot; then
print(&quot;expected exception reason to be 'reference cycle' for reference cycle exception&quot;)
if why ~= "reference cycle" then
print("expected exception reason to be 'reference cycle' for reference cycle exception")
end
if value ~= a then
print(&quot;expected to recieve value for reference cycle exception&quot;)
print("expected to recieve value for reference cycle exception")
end
if exstate ~= state then
print(&quot;expected to recieve state for reference cycle exception&quot;)
print("expected to recieve state for reference cycle exception")
end
end
end
do -- example exception handler
r = dkencode(function () end, { exception = require &quot;dkjson&quot;.encodeexception })
if r ~= [[&quot;&lt;type 'function' is not supported by JSON.&gt;&quot;]] then
print(&quot;expected the exception encoder to encode default error message, but got&quot;, r)
r = dkencode(function () end, { exception = require "dkjson".encodeexception })
if r ~= [["<type 'function' is not supported by JSON.>"]] then
print("expected the exception encoder to encode default error message, but got", r)
end
end
@ -358,54 +306,54 @@ else
return true
end
}) }, origstate)
if usedstate ~= origstate then print(&quot;expected tojson-function to recieve the original state&quot;) end
if type(usedbuffer) ~= 'table' or #usedbuffer &lt; 1 then print(&quot;expected buffer in tojson-function to be an array&quot;) end
if usedbufferlen ~= 1 then print(&quot;expected bufferlen in tojson-function to be 1, but got &quot;..tostring(usedbufferlen)) end
if usedstate ~= origstate then print("expected tojson-function to recieve the original state") end
if type(usedbuffer) ~= 'table' or #usedbuffer < 1 then print("expected buffer in tojson-function to be an array") end
if usedbufferlen ~= 1 then print("expected bufferlen in tojson-function to be 1, but got "..tostring(usedbufferlen)) end
end
do -- do not keep buffer and bufferlen when they were not present initially
local origstate = {}
dkencode(setmetatable({}, {__tojson = function() return true end}), origstate)
if origstate.buffer ~= nil then print(&quot;expected buffer to be reset to nil&quot;) end
if origstate.bufferlen ~= nil then print(&quot;expected bufferlen to be reset to nil&quot;) end
if origstate.buffer ~= nil then print("expected buffer to be reset to nil") end
if origstate.bufferlen ~= nil then print("expected bufferlen to be reset to nil") end
end
do -- keep buffer and update bufferlen when they were present initially
local origbuffer = {}
local origstate = { buffer = origbuffer }
dkencode(true, origstate)
if origstate.buffer ~= origbuffer then print(&quot;expected original buffer to remain&quot;) end
if origstate.bufferlen ~= 1 then print(&quot;expected bufferlen to be updated&quot;) end
if origstate.buffer ~= origbuffer then print("expected original buffer to remain") end
if origstate.bufferlen ~= 1 then print("expected bufferlen to be updated") end
end
end
end
if not decode then
print (&quot;No decode method&quot;)
print ("No decode method")
else
local x, r
x = decode[=[ [&quot;\u0000&quot;] ]=]
if x[1] ~= &quot;\000&quot; then
print (&quot;\\u0000 isn't decoded correctly&quot;)
x = decode[=[ ["\u0000"] ]=]
if x[1] ~= "\000" then
print ("\\u0000 isn't decoded correctly")
end
x = decode[=[ [&quot;\u20AC&quot;] ]=]
if x[1] ~= &quot;\226\130\172&quot; then
print (&quot;\\u20AC isn't decoded correctly&quot;)
x = decode[=[ ["\u20AC"] ]=]
if x[1] ~= "\226\130\172" then
print ("\\u20AC isn't decoded correctly")
end
x = decode[=[ [&quot;\uD834\uDD1E&quot;] ]=]
if x[1] ~= &quot;\240\157\132\158&quot; then
print (&quot;\\uD834\\uDD1E isn't decoded correctly&quot;)
x = decode[=[ ["\uD834\uDD1E"] ]=]
if x[1] ~= "\240\157\132\158" then
print ("\\uD834\\uDD1E isn't decoded correctly")
end
r, x = pcall(decode, [=[
{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;: {&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;: {&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:
{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;: {&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;: {&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:
{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;: {&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;: {&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:
{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;: {&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;: {&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:{&quot;x&quot;:
&quot;deep down&quot;
{"x":{"x":{"x":{"x":{"x": {"x":{"x":{"x":{"x":{"x": {"x":{"x":{"x":{"x":{"x":
{"x":{"x":{"x":{"x":{"x": {"x":{"x":{"x":{"x":{"x": {"x":{"x":{"x":{"x":{"x":
{"x":{"x":{"x":{"x":{"x": {"x":{"x":{"x":{"x":{"x": {"x":{"x":{"x":{"x":{"x":
{"x":{"x":{"x":{"x":{"x": {"x":{"x":{"x":{"x":{"x": {"x":{"x":{"x":{"x":{"x":
"deep down"
} } } } } } } } } } } } } } }
} } } } } } } } } } } } } } }
} } } } } } } } } } } } } } }
@ -413,132 +361,132 @@ else
]=])
if not r then
print (&quot;decoding a deep nested table raises an error:&quot;, x)
print ("decoding a deep nested table raises an error:", x)
else
local i = 0
while type(x) == 'table' do
i = i + 1
x = x.x
end
if i ~= 60 or x ~= &quot;deep down&quot; then
print (&quot;deep nested table isn't decoded correctly&quot;)
if i ~= 60 or x ~= "deep down" then
print ("deep nested table isn't decoded correctly")
end
end
if false and test_module == 'cmj-json' then
-- unfortunatly the version can't be read
print (&quot;decoding a big array takes ages (or forever?) on cmj-json prior to version 0.9.5&quot;)
print ("decoding a big array takes ages (or forever?) on cmj-json prior to version 0.9.5")
else
r, x = pcall(decode, &quot;[&quot;..(&quot;0,&quot;):rep(100000)..&quot;0]&quot;)
r, x = pcall(decode, "["..("0,"):rep(100000).."0]")
if not r then
print (&quot;decoding a big array raises an error:&quot;, x)
print ("decoding a big array raises an error:", x)
else
if type(x) ~= 'table' or #x ~= 100001 then
print (&quot;big array isn't decoded correctly&quot;)
print ("big array isn't decoded correctly")
end
end
end
r, x = pcall(decode, &quot;{}&quot;)
r, x = pcall(decode, "{}")
if not r then
print (&quot;decoding an empty object raises an error:&quot;, x)
print ("decoding an empty object raises an error:", x)
end
r, x = pcall(decode, &quot;[]&quot;)
r, x = pcall(decode, "[]")
if not r then
print (&quot;decoding an empty array raises an error:&quot;, x)
print ("decoding an empty array raises an error:", x)
end
r, x = pcall(decode, &quot;[1e+2]&quot;)
r, x = pcall(decode, "[1e+2]")
if not r then
print (&quot;decoding a number with exponential notation raises an error:&quot;, x)
print ("decoding a number with exponential notation raises an error:", x)
elseif x[1] ~= 1e+2 then
print (&quot;1e+2 decoded incorrectly:&quot;, r[1])
print ("1e+2 decoded incorrectly:", r[1])
end
inlocale(function ()
local r, x = pcall(decode, &quot;[0.5]&quot;)
local r, x = pcall(decode, "[0.5]")
if not r then
print(&quot;decoding 0.5 in locale raises an error:&quot;, x)
print("decoding 0.5 in locale raises an error:", x)
elseif not x then
print(&quot;cannot decode 0.5 in locale&quot;)
print("cannot decode 0.5 in locale")
elseif x[1] ~= 0.5 then
print(&quot;decoded 0.5 incorrectly in locale:&quot;, x[1])
print("decoded 0.5 incorrectly in locale:", x[1])
end
end)
-- special tests for dkjson:
if test_module == 'dkjson' then
x = dkdecode[=[ [{&quot;x&quot;:0}] ]=]
x = dkdecode[=[ [{"x":0}] ]=]
local m = getmetatable(x)
if not m or m.__jsontype ~= 'array' then
print (&quot;&lt;metatable&gt;.__jsontype ~= array&quot;)
print ("<metatable>.__jsontype ~= array")
end
local m = getmetatable(x[1])
if not m or m.__jsontype ~= 'object' then
print (&quot;&lt;metatable&gt;.__jsontype ~= object&quot;)
print ("<metatable>.__jsontype ~= object")
end
local x,p,m = dkdecode&quot; invalid &quot;
if p ~= 2 or type(m) ~= 'string' or not m:find(&quot;at line 1, column 2$&quot;) then
print ((&quot;Invalid location: position=%d, message=%q&quot;):format(p,m))
local x,p,m = dkdecode" invalid "
if p ~= 2 or type(m) ~= 'string' or not m:find("at line 1, column 2$") then
print (("Invalid location: position=%d, message=%q"):format(p,m))
end
local x,p,m = dkdecode&quot; \n invalid &quot;
if p ~= 4 or type(m) ~= 'string' or not m:find(&quot;at line 2, column 2$&quot;) then
print ((&quot;Invalid location: position=%d, message=%q&quot;):format(p,m))
local x,p,m = dkdecode" \n invalid "
if p ~= 4 or type(m) ~= 'string' or not m:find("at line 2, column 2$") then
print (("Invalid location: position=%d, message=%q"):format(p,m))
end
do -- single line comments
local x, p, m = dkdecode [[
{&quot;test://&quot; // comment // --?
{"test://" // comment // --?
: [ // continues
0] //
}
]]
if type(x) ~= 'table' or type(x[&quot;test://&quot;]) ~= 'table' or x[&quot;test://&quot;][1] ~= 0 then
print(&quot;could not decode a string with single line comments: &quot;..tostring(m))
if type(x) ~= 'table' or type(x["test://"]) ~= 'table' or x["test://"][1] ~= 0 then
print("could not decode a string with single line comments: "..tostring(m))
end
end
do -- multi line comments
local x, p, m = dkdecode [[
{&quot;test:/*&quot;/**//*
{"test:/*"/**//*
hi! this is a comment
*/ : [/** / **/ 0]
}
]]
if type(x) ~= 'table' or type(x[&quot;test:/*&quot;]) ~= 'table' or x[&quot;test:/*&quot;][1] ~= 0 then
print(&quot;could not decode a string with multi line comments: &quot;..tostring(m))
if type(x) ~= 'table' or type(x["test:/*"]) ~= 'table' or x["test:/*"][1] ~= 0 then
print("could not decode a string with multi line comments: "..tostring(m))
end
end
end
end
if encode and opt == &quot;refcycle&quot; then
if encode and opt == "refcycle" then
local a = {}
a.a = a
print (&quot;Trying a reference cycle...&quot;)
print ("Trying a reference cycle...")
encode(a)
end
if encode and (opt or &quot;&quot;):sub(1,3) == &quot;esc&quot; then
if encode and (opt or ""):sub(1,3) == "esc" then
local strchar, strbyte, strformat = string.char, string.byte, string.format
local floor = math.floor
local function unichar (value)
if value &lt; 0 then
if value < 0 then
return nil
elseif value &lt;= 0x007f then
elseif value <= 0x007f then
return strchar (value)
elseif value &lt;= 0x07ff then
elseif value <= 0x07ff then
return strchar (0xc0 + floor(value/0x40),
0x80 + (floor(value) % 0x40))
elseif value &lt;= 0xffff then
elseif value <= 0xffff then
return strchar (0xe0 + floor(value/0x1000),
0x80 + (floor(value/0x40) % 0x40),
0x80 + (floor(value) % 0x40))
elseif value &lt;= 0x10ffff then
elseif value <= 0x10ffff then
return strchar (0xf0 + floor(value/0x40000),
0x80 + (floor(value/0x1000) % 0x40),
0x80 + (floor(value/0x40) % 0x40),
@ -549,53 +497,53 @@ local function unichar (value)
end
local escapecodes = {
[&quot;\&quot;&quot;] = &quot;\\\&quot;&quot;, [&quot;\\&quot;] = &quot;\\\\&quot;, [&quot;\b&quot;] = &quot;\\b&quot;, [&quot;\f&quot;] = &quot;\\f&quot;,
[&quot;\n&quot;] = &quot;\\n&quot;, [&quot;\r&quot;] = &quot;\\r&quot;, [&quot;\t&quot;] = &quot;\\t&quot;, [&quot;/&quot;] = &quot;\\/&quot;
["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f",
["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t", ["/"] = "\\/"
}
local function escapeutf8 (uchar)
local a, b, c, d = strbyte (uchar, 1, 4)
a, b, c, d = a or 0, b or 0, c or 0, d or 0
if a &lt;= 0x7f then
if a <= 0x7f then
value = a
elseif 0xc0 &lt;= a and a &lt;= 0xdf and b &gt;= 0x80 then
elseif 0xc0 <= a and a <= 0xdf and b >= 0x80 then
value = (a - 0xc0) * 0x40 + b - 0x80
elseif 0xe0 &lt;= a and a &lt;= 0xef and b &gt;= 0x80 and c &gt;= 0x80 then
elseif 0xe0 <= a and a <= 0xef and b >= 0x80 and c >= 0x80 then
value = ((a - 0xe0) * 0x40 + b - 0x80) * 0x40 + c - 0x80
elseif 0xf0 &lt;= a and a &lt;= 0xf7 and b &gt;= 0x80 and c &gt;= 0x80 and d &gt;= 0x80 then
elseif 0xf0 <= a and a <= 0xf7 and b >= 0x80 and c >= 0x80 and d >= 0x80 then
value = (((a - 0xf0) * 0x40 + b - 0x80) * 0x40 + c - 0x80) * 0x40 + d - 0x80
else
return &quot;&quot;
return ""
end
if value &lt;= 0xffff then
return strformat (&quot;\\u%.4x&quot;, value)
elseif value &lt;= 0x10ffff then
if value <= 0xffff then
return strformat ("\\u%.4x", value)
elseif value <= 0x10ffff then
-- encode as UTF-16 surrogate pair
value = value - 0x10000
local highsur, lowsur = 0xD800 + floor (value/0x400), 0xDC00 + (value % 0x400)
return strformat (&quot;\\u%.4x\\u%.4x&quot;, highsur, lowsur)
return strformat ("\\u%.4x\\u%.4x", highsur, lowsur)
else
return &quot;&quot;
return ""
end
end
local isspecial = {}
local unifile = io.open(&quot;UnicodeData.txt&quot;)
local unifile = io.open("UnicodeData.txt")
if unifile then
-- &lt;http://www.unicode.org/Public/UNIDATA/UnicodeData.txt&gt;
-- <http://www.unicode.org/Public/UNIDATA/UnicodeData.txt>
-- each line consists of 15 parts for each defined codepoints
local pat = {}
for i = 1,14 do
pat[i] = &quot;[^;]*;&quot;
pat[i] = "[^;]*;"
end
pat[1] = &quot;([^;]*);&quot; -- Codepoint
pat[3] = &quot;([^;]*);&quot; -- Category
pat[15] = &quot;[^;]*&quot;
pat[1] = "([^;]*);" -- Codepoint
pat[3] = "([^;]*);" -- Category
pat[15] = "[^;]*"
pat = table.concat(pat)
for line in unifile:lines() do
local cp, cat = line:match(pat)
if cat:match(&quot;^C[^so]&quot;) or cat:match(&quot;^Z[lp]&quot;) then
if cat:match("^C[^so]") or cat:match("^Z[lp]") then
isspecial[tonumber(cp, 16)] = cat
end
end
@ -608,72 +556,72 @@ end
local esc = {}
local escerr = {}
local range
if opt == &quot;esc_full&quot; then range = 0x10ffff
elseif opt == &quot;esc_asc&quot; then range = 0x7f
if opt == "esc_full" then range = 0x10ffff
elseif opt == "esc_asc" then range = 0x7f
else range = 0xffff end
for i = 0,range do
t[1] = unichar(i)
xe = encode(t)
x = string.match(xe, &quot;^%s*%[%s*%\&quot;(.*)%\&quot;%s*%]%s*$&quot;)
x = string.match(xe, "^%s*%[%s*%\"(.*)%\"%s*%]%s*$")
if type(x) ~= 'string' then
escerr[i] = xe
elseif string.lower(x) == escapeutf8(t[1]) then
esc[i] = 'u'
elseif x == escapecodes[t[1]] then
esc[i] = 'c'
elseif x:sub(1,1) == &quot;\\&quot; then
elseif x:sub(1,1) == "\\" then
escerr[i] = xe
end
end
do
local i = 0
while i &lt;= range do
while i <= range do
local first
while i &lt;= range and not (esc[i] or isspecial[i]) do i = i + 1 end
if i &gt; range then break end
while i <= range and not (esc[i] or isspecial[i]) do i = i + 1 end
if i > range then break end
first = i
local special = isspecial[i]
if esc[i] and special then
while esc[i] and isspecial[i] == special do i = i + 1 end
if i-1 &gt; first then
print ((&quot;Escaped %s characters from U+%04X to U+%04X&quot;):format(special,first,i-1))
if i-1 > first then
print (("Escaped %s characters from U+%04X to U+%04X"):format(special,first,i-1))
else
print ((&quot;Escaped %s character U+%04X&quot;):format(special,first))
print (("Escaped %s character U+%04X"):format(special,first))
end
elseif esc[i] then
while esc[i] and not isspecial[i] do i = i + 1 end
if i-1 &gt; first then
print ((&quot;Escaped from U+%04X to U+%04X&quot;):format(first,i-1))
if i-1 > first then
print (("Escaped from U+%04X to U+%04X"):format(first,i-1))
else
if first &gt;= 32 and first &lt;= 127 then
print ((&quot;Escaped U+%04X (%c)&quot;):format(first,first))
if first >= 32 and first <= 127 then
print (("Escaped U+%04X (%c)"):format(first,first))
else
print ((&quot;Escaped U+%04X&quot;):format(first))
print (("Escaped U+%04X"):format(first))
end
end
elseif special then
while not esc[i] and isspecial[i] == special do i = i + 1 end
if i-1 &gt; first then
print ((&quot;Unescaped %s characters from U+%04X to U+%04X&quot;):format(special,first,i-1))
if i-1 > first then
print (("Unescaped %s characters from U+%04X to U+%04X"):format(special,first,i-1))
else
print ((&quot;Unescaped %s character U+%04X&quot;):format(special,first))
print (("Unescaped %s character U+%04X"):format(special,first))
end
end
end
end
do
local i = 0
while i &lt;= range do
while i <= range do
local first
while i &lt;= range and not escerr[i] do i = i + 1 end
while i <= range and not escerr[i] do i = i + 1 end
if not escerr[i] then break end
first = i
while escerr[i] do i = i + 1 end
if i-1 &gt; first then
print ((&quot;Errors while escaping from U+%04X to U+%04X&quot;):format(first, i-1))
if i-1 > first then
print (("Errors while escaping from U+%04X to U+%04X"):format(first, i-1))
else
print ((&quot;Errors while escaping U+%04X&quot;):format(first))
print (("Errors while escaping U+%04X"):format(first))
end
end
end
@ -684,7 +632,7 @@ end
--
-- Permission is hereby granted, free of charge, to any person obtaining
-- a copy of this software and associated documentation files (the
-- &quot;Software&quot;), to deal in the Software without restriction, including
-- "Software"), to deal in the Software without restriction, including
-- without limitation the rights to use, copy, modify, merge, publish,
-- distribute, sublicense, and/or sell copies of the Software, and to
-- permit persons to whom the Software is furnished to do so, subject to
@ -693,7 +641,7 @@ end
-- The above copyright notice and this permission notice shall be
-- included in all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
@ -703,13 +651,3 @@ end
-- SOFTWARE.
</pre>
</blockquote>
</div>
<div class="footer">
<a href="./">dkolf.de</a>
<a href="/contact">contact</a>
(This page was generated by <a class="extlink" href="http://www.fossil-scm.org/">Fossil</a>.)
</div>
</body></html>

View File

@ -1,55 +1,3 @@
<!DOCTYPE html>
<html>
<head>
<base href="http://dkolf.de/src/dkjson-lua.fsl/artifact" />
<title>Artifact Content - dkjson</title>
<link rel="alternate" type="application/rss+xml" title="RSS Feed"
href="/src/dkjson-lua.fsl/timeline.rss" />
<link rel="stylesheet" href="/src/dkjson-lua.fsl/style.css?default" type="text/css"
media="screen" />
</head>
<body>
<h1>Artifact Content &mdash; dkjson</h1>
<div class="mainmenu">
<a href='/'>dkolf.de</a>
<a href='/src/dkjson-lua.fsl/home'>dkjson</a>
<a href='/src/dkjson-lua.fsl/timeline'>Timeline</a>
<a href='/src/dkjson-lua.fsl/brlist'>Branches</a>
<a href='/src/dkjson-lua.fsl/taglist'>Tags</a>
<a href='/src/dkjson-lua.fsl/wiki'>Wiki</a>
<a href='/src/dkjson-lua.fsl/login'>Login</a>
</div>
<div class="submenu">
<a class="label" href="/src/dkjson-lua.fsl/timeline?n=200&amp;uf=14fd609d5835b5c808632c2ef0d11c6a92e8f967">Checkins Using</a>
<a class="label" href="/src/dkjson-lua.fsl/raw/readme.txt?name=14fd609d5835b5c808632c2ef0d11c6a92e8f967">Download</a>
<a class="label" href="/src/dkjson-lua.fsl/hexdump?name=14fd609d5835b5c808632c2ef0d11c6a92e8f967">Hex</a>
</div>
<div class="content">
<script>
function gebi(x){
if(/^#/.test(x)) x = x.substr(1);
var e = document.getElementById(x);
if(!e) throw new Error("Expecting element with ID "+x);
else return e;}
</script>
<h2>Artifact 14fd609d5835b5c808632c2ef0d11c6a92e8f967:</h2>
<ul>
<li>File
<a id='a1' href='/src/dkjson-lua.fsl/honeypot'>readme.txt</a>
<ul>
<li>
2014-04-28 21:16:16
- part of checkin
<span class="timelineHistDsp">[3d24a61dd0]</span>
on branch <a id='a2' href='/src/dkjson-lua.fsl/honeypot'>trunk</a>
- fix line breaks in readme.txt, fix release year
(user:
dhkolf
</ul>
</ul>
<hr />
<blockquote>
<pre>
David Kolf's JSON module for Lua 5.1/5.2
========================================
@ -58,7 +6,7 @@ David Kolf's JSON module for Lua 5.1/5.2
In the default configuration this module writes no global values, not even
the module table. Import it using
json = require (&quot;dkjson&quot;)
json = require ("dkjson")
In environments where `require` or a similiar function are not available
and you cannot receive the return value of the module, you can set the
@ -107,8 +55,8 @@ cycles.
When `exception` is given, it will be called whenever the encoder
cannot encode a given value.
The parameters are `reason`, `value`, `state` and `defaultmessage`.
`reason` is either `&quot;reference cycle&quot;`, `&quot;custom encoder failed&quot;` or
`&quot;unsupported type&quot;`. `value` is the original value that caused the
`reason` is either `"reference cycle"`, `"custom encoder failed"` or
`"unsupported type"`. `value` is the original value that caused the
exception, `state` is this state table, `defaultmessage` is the message
of the error that would usually be raised.
You can either return `true` and add directly to the buffer or you can
@ -144,18 +92,18 @@ To prevent the assigning of metatables pass `nil`:
json.decode (string, position, null, nil)
`&lt;metatable&gt;.__jsonorder`
`<metatable>.__jsonorder`
-------------------------
`__jsonorder` can overwrite the `keyorder` for a specific table.
`&lt;metatable&gt;.__jsontype`
`<metatable>.__jsontype`
------------------------
`__jsontype` can be either `&quot;array&quot;` or `&quot;object&quot;`. This value is only
checked for empty tables. (The default for empty tables is `&quot;array&quot;`).
`__jsontype` can be either `"array"` or `"object"`. This value is only
checked for empty tables. (The default for empty tables is `"array"`).
`&lt;metatable&gt;.__tojson (self, state)`
`<metatable>.__tojson (self, state)`
------------------------------------
You can provide your own `__tojson` function in a metatable. In this
@ -171,7 +119,7 @@ You can use this value for setting explicit `null` values.
`json.version`
--------------
Set to `&quot;dkjson 2.5&quot;`.
Set to `"dkjson 2.5"`.
`json.quotestring (string)`
---------------------------
@ -201,7 +149,7 @@ LPeg support
When the local configuration variable `always_try_using_lpeg` is set,
this module tries to load LPeg to replace the `decode` function. The
speed increase is significant. You can get the LPeg module at
&lt;http://www.inf.puc-rio.br/~roberto/lpeg/&gt;.
<http://www.inf.puc-rio.br/~roberto/lpeg/>.
When LPeg couldn't be loaded, the pure Lua functions stay active.
In case you don't want this module to require LPeg on its own,
@ -217,12 +165,12 @@ and `decode` with functions that use LPeg patterns.
This function returns the module table, so you can load the module
using:
json = require &quot;dkjson&quot;.use_lpeg()
json = require "dkjson".use_lpeg()
Alternatively you can use `pcall` so the JSON module still works when
LPeg isn't found.
json = require &quot;dkjson&quot;
json = require "dkjson"
pcall (json.use_lpeg)
### `json.using_lpeg`
@ -243,7 +191,7 @@ domain 'dkolf.de'.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
&quot;Software&quot;), to deal in the Software without restriction, including
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
@ -252,7 +200,7 @@ the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
@ -261,13 +209,3 @@ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</pre>
</blockquote>
</div>
<div class="footer">
<a href="./">dkolf.de</a>
<a href="/contact">contact</a>
(This page was generated by <a class="extlink" href="http://www.fossil-scm.org/">Fossil</a>.)
</div>
</body></html>

View File

@ -1,55 +1,3 @@
<!DOCTYPE html>
<html>
<head>
<base href="http://dkolf.de/src/dkjson-lua.fsl/artifact" />
<title>Artifact Content - dkjson</title>
<link rel="alternate" type="application/rss+xml" title="RSS Feed"
href="/src/dkjson-lua.fsl/timeline.rss" />
<link rel="stylesheet" href="/src/dkjson-lua.fsl/style.css?default" type="text/css"
media="screen" />
</head>
<body>
<h1>Artifact Content &mdash; dkjson</h1>
<div class="mainmenu">
<a href='/'>dkolf.de</a>
<a href='/src/dkjson-lua.fsl/home'>dkjson</a>
<a href='/src/dkjson-lua.fsl/timeline'>Timeline</a>
<a href='/src/dkjson-lua.fsl/brlist'>Branches</a>
<a href='/src/dkjson-lua.fsl/taglist'>Tags</a>
<a href='/src/dkjson-lua.fsl/wiki'>Wiki</a>
<a href='/src/dkjson-lua.fsl/login'>Login</a>
</div>
<div class="submenu">
<a class="label" href="/src/dkjson-lua.fsl/timeline?n=200&amp;uf=18fa972b68042a87ff3ae03c9f6accf575b13d2d">Checkins Using</a>
<a class="label" href="/src/dkjson-lua.fsl/raw/speedtest.lua?name=18fa972b68042a87ff3ae03c9f6accf575b13d2d">Download</a>
<a class="label" href="/src/dkjson-lua.fsl/hexdump?name=18fa972b68042a87ff3ae03c9f6accf575b13d2d">Hex</a>
</div>
<div class="content">
<script>
function gebi(x){
if(/^#/.test(x)) x = x.substr(1);
var e = document.getElementById(x);
if(!e) throw new Error("Expecting element with ID "+x);
else return e;}
</script>
<h2>Artifact 18fa972b68042a87ff3ae03c9f6accf575b13d2d:</h2>
<ul>
<li>File
<a id='a1' href='/src/dkjson-lua.fsl/honeypot'>speedtest.lua</a>
<ul>
<li>
2011-08-05 21:59:09
- part of checkin
<span class="timelineHistDsp">[e0a83a39ad]</span>
on branch <a id='a2' href='/src/dkjson-lua.fsl/honeypot'>trunk</a>
- updated the tests to reflect the new version of cmj-JSON4Lua
(user:
dhkolf
</ul>
</ul>
<hr />
<blockquote>
<pre>
local encode, decode
local test_module = ... -- command line argument
@ -67,57 +15,57 @@ local test_module = ... -- command line argument
if test_module == 'cmj-json' then
-- http://json.luaforge.net/
local json = require &quot;cmjjson&quot; -- renamed, the original file was just 'json'
local json = require "cmjjson" -- renamed, the original file was just 'json'
encode = json.encode
decode = json.decode
elseif test_module == 'dkjson' then
-- http://chiselapp.com/user/dhkolf/repository/dkjson/
local dkjson = require &quot;dkjson&quot;
local dkjson = require "dkjson"
encode = dkjson.encode
decode = dkjson.decode
elseif test_module == 'dkjson-nopeg' then
package.preload[&quot;lpeg&quot;] = function () error &quot;lpeg disabled&quot; end
package.loaded[&quot;lpeg&quot;] = nil
package.preload["lpeg"] = function () error "lpeg disabled" end
package.loaded["lpeg"] = nil
lpeg = nil
local dkjson = require &quot;dkjson&quot;
local dkjson = require "dkjson"
encode = dkjson.encode
decode = dkjson.decode
elseif test_module == 'fleece' then
-- http://www.eonblast.com/fleece/
local fleece = require &quot;fleece&quot;
encode = function(x) return fleece.json(x, &quot;E4&quot;) end
local fleece = require "fleece"
encode = function(x) return fleece.json(x, "E4") end
elseif test_module == 'jf-json' then
-- http://regex.info/blog/lua/json
local json = require &quot;jfjson&quot; -- renamed, the original file was just 'JSON'
local json = require "jfjson" -- renamed, the original file was just 'JSON'
encode = function(x) return json:encode(x) end
decode = function(x) return json:decode(x) end
elseif test_module == 'lua-yajl' then
-- http://github.com/brimworks/lua-yajl
local yajl = require (&quot;yajl&quot;)
local yajl = require ("yajl")
encode = yajl.to_string
decode = yajl.to_value
elseif test_module == 'mp-cjson' then
-- http://www.kyne.com.au/~mark/software/lua-cjson.php
local json = require &quot;cjson&quot;
local json = require "cjson"
encode = json.encode
decode = json.decode
elseif test_module == 'nm-json' then
-- http://luaforge.net/projects/luajsonlib/
local json = require &quot;LuaJSON&quot;
local json = require "LuaJSON"
encode = json.encode or json.stringify
decode = json.decode or json.parse
elseif test_module == 'sb-json' then
-- http://www.chipmunkav.com/downloads/Json.lua
local json = require &quot;sbjson&quot; -- renamed, the original file was just 'Json'
local json = require "sbjson" -- renamed, the original file was just 'Json'
encode = json.Encode
decode = json.Decode
elseif test_module == 'th-json' then
-- http://luaforge.net/projects/luajson/
local json = require &quot;json&quot;
local json = require "json"
encode = json.encode
decode = json.decode
else
print &quot;No module specified&quot;
print "No module specified"
return
end
@ -126,34 +74,34 @@ end
local str = [[
{
&quot;Herausgeber&quot;: &quot;Xema&quot;,
&quot;Nummer&quot;: &quot;1234-5678-9012-3456&quot;,
&quot;Deckung&quot;: 26,
&quot;Währung&quot;: &quot;EUR&quot;,
&quot;Inhaber&quot;: {
&quot;Name&quot;: &quot;Mustermann&quot;,
&quot;Vorname&quot;: &quot;Max&quot;,
&quot;männlich&quot;: true,
&quot;Depot&quot;: {},
&quot;Hobbys&quot;: [ &quot;Reiten&quot;, &quot;Golfen&quot;, &quot;Lesen&quot; ],
&quot;Alter&quot;: 42,
&quot;Kinder&quot;: [0],
&quot;Partner&quot;: null
"Herausgeber": "Xema",
"Nummer": "1234-5678-9012-3456",
"Deckung": 26,
"Währung": "EUR",
"Inhaber": {
"Name": "Mustermann",
"Vorname": "Max",
"männlich": true,
"Depot": {},
"Hobbys": [ "Reiten", "Golfen", "Lesen" ],
"Alter": 42,
"Kinder": [0],
"Partner": null
}
}
]]
local tbl = {
Herausgeber= &quot;Xema&quot;,
Nummer= &quot;1234-5678-9012-3456&quot;,
Herausgeber= "Xema",
Nummer= "1234-5678-9012-3456",
Deckung= 2e+6,
[&quot;Währung&quot;]= &quot;EUR&quot;,
["Währung"]= "EUR",
Inhaber= {
Name= &quot;Mustermann&quot;,
Vorname= &quot;Max&quot;,
[&quot;männlich&quot;]= true,
Name= "Mustermann",
Vorname= "Max",
["männlich"]= true,
Depot= {},
Hobbys= { &quot;Reiten&quot;, &quot;Golfen&quot;, &quot;Lesen&quot; },
Hobbys= { "Reiten", "Golfen", "Lesen" },
Alter= 42,
Kinder= {},
Partner= nil
@ -169,7 +117,7 @@ if decode then
decode (str)
end
t2 = os.clock ()
print (&quot;Decoding:&quot;, t2 - t1)
print ("Decoding:", t2 - t1)
end
if encode then
@ -178,16 +126,6 @@ if encode then
encode (tbl)
end
t2 = os.clock ()
print (&quot;Encoding:&quot;, t2 - t1)
print ("Encoding:", t2 - t1)
end
</pre>
</blockquote>
</div>
<div class="footer">
<a href="./">dkolf.de</a>
<a href="/contact">contact</a>
(This page was generated by <a class="extlink" href="http://www.fossil-scm.org/">Fossil</a>.)
</div>
</body></html>

View File

@ -1,55 +1,3 @@
<!DOCTYPE html>
<html>
<head>
<base href="http://dkolf.de/src/dkjson-lua.fsl/artifact" />
<title>Artifact Content - dkjson</title>
<link rel="alternate" type="application/rss+xml" title="RSS Feed"
href="/src/dkjson-lua.fsl/timeline.rss" />
<link rel="stylesheet" href="/src/dkjson-lua.fsl/style.css?default" type="text/css"
media="screen" />
</head>
<body>
<h1>Artifact Content &mdash; dkjson</h1>
<div class="mainmenu">
<a href='/'>dkolf.de</a>
<a href='/src/dkjson-lua.fsl/home'>dkjson</a>
<a href='/src/dkjson-lua.fsl/timeline'>Timeline</a>
<a href='/src/dkjson-lua.fsl/brlist'>Branches</a>
<a href='/src/dkjson-lua.fsl/taglist'>Tags</a>
<a href='/src/dkjson-lua.fsl/wiki'>Wiki</a>
<a href='/src/dkjson-lua.fsl/login'>Login</a>
</div>
<div class="submenu">
<a class="label" href="/src/dkjson-lua.fsl/timeline?n=200&amp;uf=441fcf232729d1ec667cb34cc60ebda85579ed9e">Checkins Using</a>
<a class="label" href="/src/dkjson-lua.fsl/raw/versions.txt?name=441fcf232729d1ec667cb34cc60ebda85579ed9e">Download</a>
<a class="label" href="/src/dkjson-lua.fsl/hexdump?name=441fcf232729d1ec667cb34cc60ebda85579ed9e">Hex</a>
</div>
<div class="content">
<script>
function gebi(x){
if(/^#/.test(x)) x = x.substr(1);
var e = document.getElementById(x);
if(!e) throw new Error("Expecting element with ID "+x);
else return e;}
</script>
<h2>Artifact 441fcf232729d1ec667cb34cc60ebda85579ed9e:</h2>
<ul>
<li>File
<a id='a1' href='/src/dkjson-lua.fsl/honeypot'>versions.txt</a>
<ul>
<li>
2014-04-28 21:01:14
- part of checkin
<span class="timelineHistDsp">[fdee269361]</span>
on branch <a id='a2' href='/src/dkjson-lua.fsl/honeypot'>trunk</a>
- increased version
(user:
dhkolf
</ul>
</ul>
<hr />
<blockquote>
<pre>
Version 2.5 (2014-04-28)
===========
@ -124,7 +72,7 @@ Version 1.1 (2011-07-08)
Changes since version 1.0:
* The values NaN/+Inf/-Inf are recognised and encoded as &quot;null&quot; like in
* The values NaN/+Inf/-Inf are recognised and encoded as "null" like in
the original JavaScript implementation.
* Read __tojson even from blocked metatables through the debug module.
* Fixed decoding single numbers.
@ -148,8 +96,8 @@ Changes since version 1.0:
However, you can specify your own metatables as arguments).
* There are no spaces added any longer when encoding.
* It is possible to explicitly sort keys for encoding by providing an array with key
names to the option &quot;keyorder&quot; or the metatable field __jsonorder.
* The values NaN/+Inf/-Inf are recognised and encoded as &quot;null&quot; like in
names to the option "keyorder" or the metatable field __jsonorder.
* The values NaN/+Inf/-Inf are recognised and encoded as "null" like in
the original JavaScript implementation.
Version 1.0
@ -157,13 +105,3 @@ Version 1.0
Initial version, released 2010-08-28.
</pre>
</blockquote>
</div>
<div class="footer">
<a href="./">dkolf.de</a>
<a href="/contact">contact</a>
(This page was generated by <a class="extlink" href="http://www.fossil-scm.org/">Fossil</a>.)
</div>
</body></html>