From af4beb5e992ce35892a5689b7e2b7e65ede344a0 Mon Sep 17 00:00:00 2001 From: Tavish Naruka Date: Wed, 4 Mar 2015 11:18:07 +0530 Subject: [PATCH] update to version 2.5 --- dist.info | 2 +- dkjson-2.5-2.rockspec | 92 +++++++ dkjson.lua | 549 ++++++++++++++++++------------------------ jsontest.lua | 511 +++++++++++++++++++++++++++------------ readme.txt | 273 +++++++++++++++++++++ speedtest.lua | 134 ++++++++--- versions.txt | 76 +++++- 7 files changed, 1135 insertions(+), 502 deletions(-) create mode 100644 dkjson-2.5-2.rockspec create mode 100644 readme.txt diff --git a/dist.info b/dist.info index c0edd7b..9945679 100644 --- a/dist.info +++ b/dist.info @@ -1,7 +1,7 @@ --- This file is part of LuaDist project name = "dkjson" -version = "2.4" +version = "2.5" desc = "dkjson is a module for encoding and decoding JSON data. It supports UTF-8." author = "David Kolf" diff --git a/dkjson-2.5-2.rockspec b/dkjson-2.5-2.rockspec new file mode 100644 index 0000000..bb52746 --- /dev/null +++ b/dkjson-2.5-2.rockspec @@ -0,0 +1,92 @@ + + + + +Artifact Content - dkjson + + + + +

Artifact Content — dkjson

+ + +
+ +

Artifact f1093c6b2e5a858b6100958c8c5e575ae439a0df:

+ +
+
+
+package = "dkjson"
+version = "2.5-2"
+source = {
+  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 = "David Kolf's JSON module for Lua",
+  detailed = [[
+dkjson is a module for encoding and decoding JSON data. It supports UTF-8.
+
+JSON (JavaScript Object Notation) is a format for serializing data based
+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 = "http://dkolf.de/src/dkjson-lua.fsl/",
+  license = "MIT/X11"
+}
+dependencies = {
+  "lua >= 5.1, < 5.4"
+}
+build = {
+  type = "builtin",
+  modules = {
+    dkjson = "dkjson.lua"
+  }
+}
+
+
+
+
+
+ + diff --git a/dkjson.lua b/dkjson.lua index b7475ba..50f2387 100644 --- a/dkjson.lua +++ b/dkjson.lua @@ -1,182 +1,79 @@ - -- Module options: - local always_try_using_lpeg = true - local register_global_module_table = false - local global_module_name = 'json' + + + + +Artifact Content - dkjson + + + + +

Artifact Content — dkjson

+ + +
+ +

Artifact 19fd705cf41e4977b7fe04c79c0808b079836024:

+ +
+
+
+-- Module options:
+local always_try_using_lpeg = true
+local register_global_module_table = false
+local global_module_name = 'json'
 
-    --[==[
+--[==[
 
 David Kolf's JSON module for Lua 5.1/5.2
-========================================
 
-*Version 2.4*
+Version 2.5
 
-In the default configuration this module writes no global values, not even
-the module table. Import it using
 
-    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
-option `register_global_module_table` to `true`.  The module table will
-then be saved in the global variable with the name given by the option
-`global_module_name`.
-
-Exported functions and values:
-
-`json.encode (object [, state])`
---------------------------------
-
-Create a string representing the object. `Object` can be a table,
-a string, a number, a boolean, `nil`, `json.null` or any object with
-a function `__tojson` in its metatable. A table can only use strings
-and numbers as keys and its values have to be valid objects as
-well. It raises an error for any invalid data types or reference
-cycles.
-
-`state` is an optional table with the following fields:
-
-  - `indent`  
-    When `indent` (a boolean) is set, the created string will contain
-    newlines and indentations. Otherwise it will be one long line.
-  - `keyorder`  
-    `keyorder` is an array to specify the ordering of keys in the
-    encoded output. If an object has keys which are not in this array
-    they are written after the sorted keys.
-  - `level`  
-    This is the initial level of indentation used when `indent` is
-    set. For each level two spaces are added. When absent it is set
-    to 0.
-  - `buffer`  
-    `buffer` is an array to store the strings for the result so they
-    can be concatenated at once. When it isn't given, the encode
-    function will create it temporary and will return the
-    concatenated result.
-  - `bufferlen`  
-    When `bufferlen` is set, it has to be the index of the last
-    element of `buffer`.
-  - `tables`  
-    `tables` is a set to detect reference cycles. It is created
-    temporary when absent. Every table that is currently processed
-    is used as key, the value is `true`.
-
-When `state.buffer` was set, the return value will be `true` on
-success. Without `state.buffer` the return value will be a string.
-
-`json.decode (string [, position [, null]])`
---------------------------------------------
-
-Decode `string` starting at `position` or at 1 if `position` was
-omitted.
-
-`null` is an optional value to be returned for null values. The
-default is `nil`, but you could set it to `json.null` or any other
-value.
-
-The return values are the object or `nil`, the position of the next
-character that doesn't belong to the object, and in case of errors
-an error message.
-
-Two metatables are created. Every array or object that is decoded gets
-a metatable with the `__jsontype` field set to either `array` or
-`object`. If you want to provide your own metatables use the syntax
-
-    json.decode (string, position, null, objectmeta, arraymeta)
-
-To prevent the assigning of metatables pass `nil`:
-
-    json.decode (string, position, null, nil)
-
-`.__jsonorder`
--------------------------
-
-`__jsonorder` can overwrite the `keyorder` for a specific table.
-
-`.__jsontype`
-------------------------
-
-`__jsontype` can be either `"array"` or `"object"`. This value is only
-checked for empty tables. (The default for empty tables is `"array"`).
-
-`.__tojson (self, state)`
-------------------------------------
-
-You can provide your own `__tojson` function in a metatable. In this
-function you can either add directly to the buffer and return true,
-or you can return a string. On errors nil and a message should be
-returned.
-
-`json.null`
------------
-
-You can use this value for setting explicit `null` values.
-
-`json.version`
---------------
-
-Set to `"dkjson 2.4"`.
-
-`json.quotestring (string)`
----------------------------
-
-Quote a UTF-8 string and escape critical characters using JSON
-escape sequences. This function is only necessary when you build
-your own `__tojson` functions.
-
-`json.addnewline (state)`
--------------------------
-
-When `state.indent` is set, add a newline to `state.buffer` and spaces
-according to `state.level`.
-
-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
-  .
-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,
-disable the option `always_try_using_lpeg` in the options section at
-the top of the module.
-
-In this case you can later load LPeg support using
-
-### `json.use_lpeg ()`
-
-Require the LPeg module and replace the functions `quotestring` and
-and `decode` with functions that use LPeg patterns.
-This function returns the module table, so you can load the module
-using:
-
-    json = require "dkjson".use_lpeg()
-
-Alternatively you can use `pcall` so the JSON module still works when
-LPeg isn't found.
-
-    json = require "dkjson"
-    pcall (json.use_lpeg)
-
-### `json.using_lpeg`
-
-This variable is set to `true` when LPeg was loaded successfully.
-
----------------------------------------------------------------------
-
-Contact
--------
+For the documentation see the corresponding readme.txt or visit
+<http://dkolf.de/src/dkjson-lua.fsl/>.
 
 You can contact the author by sending an e-mail to 'david' at the
 domain 'dkolf.de'.
 
----------------------------------------------------------------------
 
-*Copyright (C) 2010-2013 David Heiko Kolf*
+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
-"Software"), 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
@@ -185,7 +82,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 "AS IS", 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
@@ -194,13 +91,7 @@ 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.
 
-
-
-
+
+
+
+
+ + diff --git a/jsontest.lua b/jsontest.lua index 62b9f80..f87cbff 100644 --- a/jsontest.lua +++ b/jsontest.lua @@ -1,3 +1,55 @@ + + + + +Artifact Content - dkjson + + + + +

Artifact Content — dkjson

+ + +
+ +

Artifact 4711879926db7149e28e639af37a95356026c770:

+ +
+
+
 local encode, decode, dkencode, dkdecode
 
 
@@ -12,19 +64,20 @@ local test_module, opt = ... -- command line argument
 --local test_module = 'nm-json'
 --local test_module = 'sb-json'
 --local test_module = 'th-json'
+test_module = test_module or 'dkjson'
 
---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 = "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 = "refcycle" -- What happens when a reference cycle gets encoded?
+--local opt = "refcycle" -- What happens when a reference cycle gets encoded?
 
-local testlocale = "de_DE.UTF8"
+local testlocale = "de_DE.UTF8"
 
 local function inlocale(fn)
   local oldloc = os.setlocale(nil, 'numeric')
   if not os.setlocale(testlocale, 'numeric') then
-    print("test could not switch to locale "..testlocale)
+    print("test could not switch to locale "..testlocale)
   else
     fn()
   end
@@ -33,19 +86,19 @@ end
 
 if test_module == 'dkjson-nopeg' then
   test_module = 'dkjson'
-  package.preload["lpeg"] = function () error "lpeg disabled" end
-  package.loaded["lpeg"] = 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["lpeg"] = require "lulpeg"
+  package.loaded["lpeg"] = require "lulpeg"
 end
 
 do
   -- http://chiselapp.com/user/dhkolf/repository/dkjson/
-  local dkjson = require "dkjson"
+  local dkjson = require "dkjson"
   dkencode = dkjson.encode
   dkdecode = dkjson.decode
 end
@@ -53,7 +106,7 @@ end
 if test_module == 'cmj-json' then
   -- https://github.com/craigmj/json4lua/
   -- http://json.luaforge.net/
-  local json = require "cmjjson" -- 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
@@ -62,59 +115,59 @@ elseif test_module == 'dkjson' then
   decode = dkdecode
 elseif test_module == 'fleece' then
   -- http://www.eonblast.com/fleece/
-  local fleece = require "fleece"
-  encode = function(x) return fleece.json(x, "E4") 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 "jfjson" -- 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 ("yajl")
+  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 "cjson"
+  local json = require "cjson"
   encode = json.encode
   decode = json.decode
 elseif test_module == 'nm-json' then
   -- http://luaforge.net/projects/luajsonlib/
-  local json = require "LuaJSON"
+  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 "sbjson" -- 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 "json"
+  local json = require "json"
   encode = json.encode
   decode = json.decode
 else
-  print "No module specified"
+  print "No module specified"
   return
 end
 
 if not encode then
-  print ("No encode method")
+  print ("No encode method")
 else
   local x, r
 
   local escapecodes = {
-    ["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f",
-    ["\n"] = "\\n",  ["\r"] = "\\r",  ["\t"] = "\\t", ["/"] = "\\/"
+    ["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f",
+    ["\n"] = "\\n",  ["\r"] = "\\r",  ["\t"] = "\\t", ["/"] = "\\/"
   }
   local function test (x, n, expect)
-    local enc = encode{ x }:match("^%s*%[%s*%\"(.-)%\"%s*%]%s*$")
+    local enc = encode{ x }:match("^%s*%[%s*%\"(.-)%\"%s*%]%s*$")
     if not enc or (escapecodes[x] ~= 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))
+        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
 
@@ -122,81 +175,81 @@ else
   for i = 0,31 do
     test(string.char(i), i)
   end
-  test("\"", ("\""):byte())
-  test("\\", ("\\"):byte())
+  test("\"", ("\""):byte())
+  test("\\", ("\\"):byte())
   -- necessary escapes for JavaScript:
-  test("\226\128\168", 0x2028)
-  test("\226\128\169", 0x2029)
+  test("\226\128\168", 0x2028)
+  test("\226\128\169", 0x2029)
   -- invalid escapes that were seen in the wild:
-  test("'", ("'"):byte(), "%'")
+  test("'", ("'"):byte(), "%'")
 
-  r,x = pcall (encode, { [1000] = "x" })
+  r,x = pcall (encode, { [1000] = "x" })
   if not r then
-    print ("encoding a sparse array (#=0) raises an error:", x)
+    print ("encoding a sparse array (#=0) raises an error:", x)
   else
-    if #x > 30 then
-      print ("sparse array (#=0) encoded as:", x:sub(1,15).." <...> "..x:sub(-15,-1), "#"..#x)
+    if #x > 30 then
+      print ("sparse array (#=0) encoded as:", x:sub(1,15).." <...> "..x:sub(-15,-1), "#"..#x)
     else
-      print ("sparse array (#=0) encoded as:", x)
+      print ("sparse array (#=0) encoded as:", x)
     end
   end
 
-  r,x = pcall (encode, { [1] = "a", [1000] = "x" })
+  r,x = pcall (encode, { [1] = "a", [1000] = "x" })
   if not r then
-    print ("encoding a sparse array (#=1) raises an error:", x)
+    print ("encoding a sparse array (#=1) raises an error:", x)
   else
-    if #x > 30 then
-      print ("sparse array (#=1) encoded as:", x:sub(1,15).." <...> "..x:sub(-15,-1), "#str="..#x)
+    if #x > 30 then
+      print ("sparse array (#=1) encoded as:", x:sub(1,15).." <...> "..x:sub(-15,-1), "#str="..#x)
     else
-      print ("sparse array (#=1) encoded as:", x)
+      print ("sparse array (#=1) encoded as:", x)
     end
   end
 
-  r,x = pcall (encode, { [1] = "a", [5] = "c", ["x"] = "x" })
+  r,x = pcall (encode, { [1] = "a", [5] = "c", ["x"] = "x" })
   if not r then
-    print ("encoding a mixed table raises an error:", x)
+    print ("encoding a mixed table raises an error:", x)
   else
-    print ("mixed table encoded as:", x)
+    print ("mixed table encoded as:", x)
   end
 
   r, x = pcall(encode, { math.huge*0 }) -- NaN
   if not r then
-    print ("encoding NaN raises an error:", x)
+    print ("encoding NaN raises an error:", x)
   else
     r = dkdecode(x)
     if not r then
-      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)
+      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 ("NaN is converted to:", x)
+      print ("NaN is converted to:", x)
     end
   end
 
   if test_module == 'fleece' then
-    print ("Fleece (0.3.1) is known to freeze on +/-Inf")
+    print ("Fleece (0.3.1) is known to freeze on +/-Inf")
   else
     r, x = pcall(encode, { math.huge }) -- +Inf
     if not r then
-      print ("encoding +Inf raises an error:", x)
+      print ("encoding +Inf raises an error:", x)
     else
       r = dkdecode(x)
       if not r then
-        print ("+Inf isn't converted into valid JSON:", x)
+        print ("+Inf isn't converted into valid JSON:", x)
       else
-        print ("+Inf is converted to:", x)
+        print ("+Inf is converted to:", x)
       end
     end
 
     r, x = pcall(encode, { -math.huge }) -- -Inf
     if not r then
-      print ("encoding -Inf raises an error:", x)
+      print ("encoding -Inf raises an error:", x)
     else
       r = dkdecode(x)
       if not r then
-        print ("-Inf isn't converted into valid JSON:", x)
+        print ("-Inf isn't converted into valid JSON:", x)
       else
-        print ("-Inf is converted to:", x)
+        print ("-Inf is converted to:", x)
       end
     end
   end
@@ -204,39 +257,155 @@ else
   inlocale(function ()
     local r, x = pcall(encode, { 0.5 })
     if not r then
-      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)
+      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)
+
+  -- special tests for dkjson:
+  if test_module == 'dkjson' then
+    do -- encode a function
+      local why, value, exstate
+      local state = {
+        exception = function (w, v, s)
+          why, value, exstate = w, v, s
+          return "\"demo\""
+        end
+      }
+      local encfunction = function () end
+      r, x = pcall(dkencode, { encfunction }, state )
+      if not r then
+        print("encoding a function with exception handler raises an error:", x)
+      else
+        if x ~= "[\"demo\"]" then
+          print("expected to see output of exception handler for type exception, but got", x)
+        end
+        if why ~= "unsupported type" then
+          print("expected exception reason to be 'unsupported type' for type exception")
+        end
+        if value ~= encfunction then
+          print("expected to recieve value for type exception")
+        end
+        if exstate ~= state then
+          print("expected to recieve state for type exception")
+        end
+      end
+
+      r, x = pcall(dkencode, { function () end }, {
+        exception = function (w, v, s)
+          return nil, "demo"
+        end
+      })
+      if r or x ~= "demo" then
+        print("expected custom error for type exception, but got:", r, x)
+      end
+
+      r, x = pcall(dkencode, { function () end }, {
+        exception = function (w, v, s)
+          return nil
+        end
+      })
+      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
+
+    do -- encode a reference cycle
+      local why, value, exstate
+      local state = {
+        exception = function (w, v, s)
+          why, value, exstate = w, v, s
+          return "\"demo\""
+        end
+      }
+      local a = {}
+      a[1] = a
+      r, x = pcall(dkencode, a, state )
+      if not r then
+        print("encoding a reference cycle with exception handler raises an error:", x)
+      else
+        if x ~= "[\"demo\"]" then
+          print("expected to see output of exception handler for reference cycle exception, but got", x)
+        end
+        if why ~= "reference cycle" then
+          print("expected exception reason to be 'reference cycle' for reference cycle exception")
+        end
+        if value ~= a then
+          print("expected to recieve value for reference cycle exception")
+        end
+        if exstate ~= state then
+          print("expected to recieve state for reference cycle exception")
+        end
+      end
+    end
+
+    do -- example exception handler
+      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
+
+    do -- test state buffer for custom __tojson function
+      local origstate = {}
+      local usedstate, usedbuffer, usedbufferlen
+      dkencode({ setmetatable({}, {
+        __tojson = function(self, state)
+          usedstate = state
+          usedbuffer = state.buffer
+          usedbufferlen = state.bufferlen
+          return true
+        end
+      }) }, origstate)
+      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("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("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 ("No decode method")
+  print ("No decode method")
 else
   local x, r
 
-  x = decode[=[ ["\u0000"] ]=]
-  if x[1] ~= "\000" then
-    print ("\\u0000 isn't decoded correctly")
+  x = decode[=[ ["\u0000"] ]=]
+  if x[1] ~= "\000" then
+    print ("\\u0000 isn't decoded correctly")
   end
 
-  x = decode[=[ ["\u20AC"] ]=]
-  if x[1] ~= "\226\130\172" then
-    print ("\\u20AC isn't decoded correctly")
+  x = decode[=[ ["\u20AC"] ]=]
+  if x[1] ~= "\226\130\172" then
+    print ("\\u20AC isn't decoded correctly")
   end
 
-  x = decode[=[ ["\uD834\uDD1E"] ]=]
-  if x[1] ~= "\240\157\132\158" then
-    print ("\\uD834\\uDD1E isn't decoded correctly")
+  x = decode[=[ ["\uD834\uDD1E"] ]=]
+  if x[1] ~= "\240\157\132\158" then
+    print ("\\uD834\\uDD1E isn't decoded correctly")
   end
 
   r, x = pcall(decode, [=[
-{"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"
+{"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"
     }    }    }    }    }     }    }    }    }    }     }    }    }    }    }
     }    }    }    }    }     }    }    }    }    }     }    }    }    }    }
     }    }    }    }    }     }    }    }    }    }     }    }    }    }    }
@@ -244,108 +413,132 @@ else
 ]=])
 
   if not r then
-    print ("decoding a deep nested table raises an error:", 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 ~= "deep down" then
-      print ("deep nested table isn't decoded correctly")
+    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 ("decoding a big array takes ages (or forever?) on cmj-json prior to version 0.9.5")
+    print ("decoding a big array takes ages (or forever?) on cmj-json prior to version 0.9.5")
   else
-    r, x = pcall(decode, "["..("0,"):rep(100000).."0]")
+    r, x = pcall(decode, "["..("0,"):rep(100000).."0]")
     if not r then
-      print ("decoding a big array raises an error:", x)
+      print ("decoding a big array raises an error:", x)
     else
       if type(x) ~= 'table' or #x ~= 100001 then
-        print ("big array isn't decoded correctly")
+        print ("big array isn't decoded correctly")
       end
     end
   end
 
-  r, x = pcall(decode, "{}")
+  r, x = pcall(decode, "{}")
   if not r then
-    print ("decoding an empty object raises an error:", x)
+    print ("decoding an empty object raises an error:", x)
   end
 
-  r, x = pcall(decode, "[]")
+  r, x = pcall(decode, "[]")
   if not r then
-    print ("decoding an empty array raises an error:", x)
+    print ("decoding an empty array raises an error:", x)
   end
 
-  r, x = pcall(decode, "[1e+2]")
+  r, x = pcall(decode, "[1e+2]")
   if not r then
-    print ("decoding a number with exponential notation raises an error:", x)
+    print ("decoding a number with exponential notation raises an error:", x)
   elseif x[1] ~= 1e+2 then
-    print ("1e+2 decoded incorrectly:", r[1])
+    print ("1e+2 decoded incorrectly:", r[1])
   end
 
   inlocale(function ()
-    local r, x = pcall(decode, "[0.5]")
+    local r, x = pcall(decode, "[0.5]")
     if not r then
-      print("decoding 0.5 in locale raises an error:", x)
+      print("decoding 0.5 in locale raises an error:", x)
     elseif not x then
-      print("cannot decode 0.5 in locale")
+      print("cannot decode 0.5 in locale")
     elseif x[1] ~= 0.5 then
-      print("decoded 0.5 incorrectly in locale:", x[1])
+      print("decoded 0.5 incorrectly in locale:", x[1])
     end
   end)
 
   -- special tests for dkjson:
   if test_module == 'dkjson' then
-    x = dkdecode[=[ [{"x":0}] ]=]
+    x = dkdecode[=[ [{"x":0}] ]=]
     local m = getmetatable(x)
     if not m or m.__jsontype ~= 'array' then
-      print (".__jsontype ~= array")
+      print ("<metatable>.__jsontype ~= array")
     end
     local m = getmetatable(x[1])
     if not m or m.__jsontype ~= 'object' then
-      print (".__jsontype ~= object")
+      print ("<metatable>.__jsontype ~= object")
     end
     
-    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))
+    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" \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))
+    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 [[
+{"test://" // comment // --?
+   : [  // continues
+   0]   //
+}
+]]
+      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 [[
+{"test:/*"/**//*
+   hi! this is a comment
+*/   : [/** / **/  0]
+}
+]]
+      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 == "refcycle" then
+if encode and opt == "refcycle" then
   local a = {}
   a.a = a
-  print ("Trying a reference cycle...")
+  print ("Trying a reference cycle...")
   encode(a)
 end
 
-if encode and (opt or ""):sub(1,3) == "esc" 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 < 0 then
+  if value < 0 then
     return nil
-  elseif value <= 0x007f then
+  elseif value <= 0x007f then
     return strchar (value)
-  elseif value <= 0x07ff then
+  elseif value <= 0x07ff then
     return strchar (0xc0 + floor(value/0x40),
                     0x80 + (floor(value) % 0x40))
-  elseif value <= 0xffff then
+  elseif value <= 0xffff then
     return strchar (0xe0 + floor(value/0x1000),
                     0x80 + (floor(value/0x40) % 0x40),
                     0x80 + (floor(value) % 0x40))
-  elseif value <= 0x10ffff then
+  elseif value <= 0x10ffff then
     return strchar (0xf0 + floor(value/0x40000),
                     0x80 + (floor(value/0x1000) % 0x40),
                     0x80 + (floor(value/0x40) % 0x40),
@@ -356,53 +549,53 @@ local function unichar (value)
 end
 
 local escapecodes = {
-  ["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f",
-  ["\n"] = "\\n",  ["\r"] = "\\r",  ["\t"] = "\\t", ["/"] = "\\/"
+  ["\""] = "\\\"", ["\\"] = "\\\\", ["\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 <= 0x7f then
+  if a <= 0x7f then
     value = a
-  elseif 0xc0 <= a and a <= 0xdf and b >= 0x80 then
+  elseif 0xc0 <= a and a <= 0xdf and b >= 0x80 then
     value = (a - 0xc0) * 0x40 + b - 0x80
-  elseif 0xe0 <= a and a <= 0xef and b >= 0x80 and c >= 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 <= a and a <= 0xf7 and b >= 0x80 and c >= 0x80 and d >= 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 ""
+    return ""
   end
-  if value <= 0xffff then
-    return strformat ("\\u%.4x", value)
-  elseif value <= 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 ("\\u%.4x\\u%.4x", highsur, lowsur)
+    return strformat ("\\u%.4x\\u%.4x", highsur, lowsur)
   else
-    return ""
+    return ""
   end
 end
 
   local isspecial = {}
-  local unifile = io.open("UnicodeData.txt")
+  local unifile = io.open("UnicodeData.txt")
   if unifile then
-    -- 
+    -- <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] = "[^;]*;"
+      pat[i] = "[^;]*;"
     end
-    pat[1] = "([^;]*);" -- Codepoint
-    pat[3] = "([^;]*);" -- Category
-    pat[15] = "[^;]*"
+    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("^C[^so]") or cat:match("^Z[lp]") then
+      if cat:match("^C[^so]") or cat:match("^Z[lp]") then
         isspecial[tonumber(cp, 16)] = cat
       end
     end
@@ -415,72 +608,72 @@ end
   local esc = {}
   local escerr = {}
   local range
-  if opt == "esc_full" then range = 0x10ffff
-  elseif opt == "esc_asc" 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, "^%s*%[%s*%\"(.*)%\"%s*%]%s*$")
+    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) == "\\" then
+    elseif x:sub(1,1) == "\\" then
       escerr[i] = xe
     end
   end
   do
     local i = 0
-    while i <= range do
+    while i <= range do
       local first
-      while i <= range and not (esc[i] or isspecial[i]) do i = i + 1 end
-      if i > 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 > first then
-          print (("Escaped %s characters from U+%04X to U+%04X"):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 (("Escaped %s character U+%04X"):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 > first then
-          print (("Escaped from U+%04X to U+%04X"):format(first,i-1))
+        if i-1 > first then
+          print (("Escaped from U+%04X to U+%04X"):format(first,i-1))
         else
-          if first >= 32 and first <= 127 then
-            print (("Escaped U+%04X (%c)"):format(first,first))
+          if first >= 32 and first <= 127 then
+            print (("Escaped U+%04X (%c)"):format(first,first))
           else
-            print (("Escaped U+%04X"):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 > first then
-          print (("Unescaped %s characters from U+%04X to U+%04X"):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 (("Unescaped %s character U+%04X"):format(special,first))
+          print (("Unescaped %s character U+%04X"):format(special,first))
         end
       end
     end
   end
   do
     local i = 0
-    while i <= range do
+    while i <= range do
       local first
-      while i <= 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 > first then
-        print (("Errors while escaping from U+%04X to U+%04X"):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 (("Errors while escaping U+%04X"):format(first))
+        print (("Errors while escaping U+%04X"):format(first))
       end
     end
   end
@@ -491,7 +684,7 @@ end
 --
 -- Permission is hereby granted, free of charge, to any person obtaining
 -- a copy of this software and associated documentation files (the
--- "Software"), 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
@@ -500,7 +693,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 "AS IS", 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
@@ -510,3 +703,13 @@ end
 -- SOFTWARE. 
 
 
+
+
+
+
+ + diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..acd2971 --- /dev/null +++ b/readme.txt @@ -0,0 +1,273 @@ + + + + +Artifact Content - dkjson + + + + +

Artifact Content — dkjson

+ + +
+ +

Artifact 14fd609d5835b5c808632c2ef0d11c6a92e8f967:

+ +
+
+
+David Kolf's JSON module for Lua 5.1/5.2
+========================================
+
+*Version 2.5*
+
+In the default configuration this module writes no global values, not even
+the module table. Import it using
+
+    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
+option `register_global_module_table` to `true`.  The module table will
+then be saved in the global variable with the name given by the option
+`global_module_name`.
+
+Exported functions and values:
+
+`json.encode (object [, state])`
+--------------------------------
+
+Create a string representing the object. `Object` can be a table,
+a string, a number, a boolean, `nil`, `json.null` or any object with
+a function `__tojson` in its metatable. A table can only use strings
+and numbers as keys and its values have to be valid objects as
+well. It raises an error for any invalid data types or reference
+cycles.
+
+`state` is an optional table with the following fields:
+
+  - `indent`  
+    When `indent` (a boolean) is set, the created string will contain
+    newlines and indentations. Otherwise it will be one long line.
+  - `keyorder`  
+    `keyorder` is an array to specify the ordering of keys in the
+    encoded output. If an object has keys which are not in this array
+    they are written after the sorted keys.
+  - `level`  
+    This is the initial level of indentation used when `indent` is
+    set. For each level two spaces are added. When absent it is set
+    to 0.
+  - `buffer`  
+    `buffer` is an array to store the strings for the result so they
+    can be concatenated at once. When it isn't given, the encode
+    function will create it temporary and will return the
+    concatenated result.
+  - `bufferlen`  
+    When `bufferlen` is set, it has to be the index of the last
+    element of `buffer`.
+  - `tables`  
+    `tables` is a set to detect reference cycles. It is created
+    temporary when absent. Every table that is currently processed
+    is used as key, the value is `true`.
+  - `exception`  
+    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 `"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
+    return the string directly. To keep raising an error return `nil` and
+    the desired error message.  
+    An example implementation for an exception function is given in
+    `json.encodeexception`.
+
+When `state.buffer` was set, the return value will be `true` on
+success. Without `state.buffer` the return value will be a string.
+
+`json.decode (string [, position [, null]])`
+--------------------------------------------
+
+Decode `string` starting at `position` or at 1 if `position` was
+omitted.
+
+`null` is an optional value to be returned for null values. The
+default is `nil`, but you could set it to `json.null` or any other
+value.
+
+The return values are the object or `nil`, the position of the next
+character that doesn't belong to the object, and in case of errors
+an error message.
+
+Two metatables are created. Every array or object that is decoded gets
+a metatable with the `__jsontype` field set to either `array` or
+`object`. If you want to provide your own metatables use the syntax
+
+    json.decode (string, position, null, objectmeta, arraymeta)
+
+To prevent the assigning of metatables pass `nil`:
+
+    json.decode (string, position, null, nil)
+
+`<metatable>.__jsonorder`
+-------------------------
+
+`__jsonorder` can overwrite the `keyorder` for a specific table.
+
+`<metatable>.__jsontype`
+------------------------
+
+`__jsontype` can be either `"array"` or `"object"`. This value is only
+checked for empty tables. (The default for empty tables is `"array"`).
+
+`<metatable>.__tojson (self, state)`
+------------------------------------
+
+You can provide your own `__tojson` function in a metatable. In this
+function you can either add directly to the buffer and return true,
+or you can return a string. On errors nil and a message should be
+returned.
+
+`json.null`
+-----------
+
+You can use this value for setting explicit `null` values.
+
+`json.version`
+--------------
+
+Set to `"dkjson 2.5"`.
+
+`json.quotestring (string)`
+---------------------------
+
+Quote a UTF-8 string and escape critical characters using JSON
+escape sequences. This function is only necessary when you build
+your own `__tojson` functions.
+
+`json.addnewline (state)`
+-------------------------
+
+When `state.indent` is set, add a newline to `state.buffer` and spaces
+according to `state.level`.
+
+`json.encodeexception (reason, value, state, defaultmessage)`
+-------------------------------------------------------------
+
+This function can be used as value to the `exception` option. Instead of
+raising an error this function encodes the error message as a string. This
+can help to debug malformed input data.
+
+    x = json.encode(value, { exception = json.encodeexception })
+
+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
+  <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,
+disable the option `always_try_using_lpeg` in the options section at
+the top of the module.
+
+In this case you can later load LPeg support using
+
+### `json.use_lpeg ()`
+
+Require the LPeg module and replace the functions `quotestring` and
+and `decode` with functions that use LPeg patterns.
+This function returns the module table, so you can load the module
+using:
+
+    json = require "dkjson".use_lpeg()
+
+Alternatively you can use `pcall` so the JSON module still works when
+LPeg isn't found.
+
+    json = require "dkjson"
+    pcall (json.use_lpeg)
+
+### `json.using_lpeg`
+
+This variable is set to `true` when LPeg was loaded successfully.
+
+---------------------------------------------------------------------
+
+Contact
+-------
+
+You can contact the author by sending an e-mail to 'david' at the
+domain 'dkolf.de'.
+
+---------------------------------------------------------------------
+
+*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
+"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
+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 "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
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+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.
+
+
+
+
+
+ + diff --git a/speedtest.lua b/speedtest.lua index 69a8be5..d0684b2 100644 --- a/speedtest.lua +++ b/speedtest.lua @@ -1,3 +1,55 @@ + + + + +Artifact Content - dkjson + + + + +

Artifact Content — dkjson

+ + +
+ +

Artifact 18fa972b68042a87ff3ae03c9f6accf575b13d2d:

+ +
+
+
 local encode, decode
 
 local test_module = ... -- command line argument
@@ -15,57 +67,57 @@ local test_module = ... -- command line argument
 
 if test_module == 'cmj-json' then
   -- http://json.luaforge.net/
-  local json = require "cmjjson" -- 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 "dkjson"
+  local dkjson = require "dkjson"
   encode = dkjson.encode
   decode = dkjson.decode
 elseif test_module == 'dkjson-nopeg' then
-  package.preload["lpeg"] = function () error "lpeg disabled" end
-  package.loaded["lpeg"] = nil
+  package.preload["lpeg"] = function () error "lpeg disabled" end
+  package.loaded["lpeg"] = nil
   lpeg = nil
-  local dkjson = require "dkjson"
+  local dkjson = require "dkjson"
   encode = dkjson.encode
   decode = dkjson.decode
 elseif test_module == 'fleece' then
   -- http://www.eonblast.com/fleece/
-  local fleece = require "fleece"
-  encode = function(x) return fleece.json(x, "E4") 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 "jfjson" -- 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 ("yajl")
+  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 "cjson"
+  local json = require "cjson"
   encode = json.encode
   decode = json.decode
 elseif test_module == 'nm-json' then
   -- http://luaforge.net/projects/luajsonlib/
-  local json = require "LuaJSON"
+  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 "sbjson" -- 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 "json"
+  local json = require "json"
   encode = json.encode
   decode = json.decode
 else
-  print "No module specified"
+  print "No module specified"
   return
 end
 
@@ -74,34 +126,34 @@ end
 
 local str = [[
 {
-  "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
+  "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= "Xema",
-  Nummer= "1234-5678-9012-3456",
+  Herausgeber= "Xema",
+  Nummer= "1234-5678-9012-3456",
   Deckung= 2e+6,
-  ["Währung"]= "EUR",
+  ["Währung"]= "EUR",
   Inhaber= {
-    Name= "Mustermann",
-    Vorname= "Max",
-    ["männlich"]= true,
+    Name= "Mustermann",
+    Vorname= "Max",
+    ["männlich"]= true,
     Depot= {},
-    Hobbys= { "Reiten", "Golfen", "Lesen" },
+    Hobbys= { "Reiten", "Golfen", "Lesen" },
     Alter= 42,
     Kinder= {},
     Partner= nil
@@ -117,7 +169,7 @@ if decode then
     decode (str)
   end
   t2 = os.clock ()
-  print ("Decoding:", t2 - t1)
+  print ("Decoding:", t2 - t1)
 end
 
 if encode then
@@ -126,6 +178,16 @@ if encode then
     encode (tbl)
   end
   t2 = os.clock ()
-  print ("Encoding:", t2 - t1)
+  print ("Encoding:", t2 - t1)
 end
 
+
+
+
+
+ + diff --git a/versions.txt b/versions.txt index 14ce417..7f74de8 100644 --- a/versions.txt +++ b/versions.txt @@ -1,3 +1,63 @@ + + + + +Artifact Content - dkjson + + + + +

Artifact Content — dkjson

+ + +
+ +

Artifact 441fcf232729d1ec667cb34cc60ebda85579ed9e:

+ +
+
+
+Version 2.5 (2014-04-28)
+===========
+
+Changes since version 2.4:
+
+  *  Added customizable exception handling.
+  *  Decode input that contains JavaScript comments.
+
 Version 2.4 (2013-09-28)
 ===========
 
@@ -64,7 +124,7 @@ Version 1.1 (2011-07-08)
 
 Changes since version 1.0:
 
-  *  The values NaN/+Inf/-Inf are recognised and encoded as "null" 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.
@@ -88,8 +148,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 "keyorder" or the metatable field __jsonorder.
-  *  The values NaN/+Inf/-Inf are recognised and encoded as "null" 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
@@ -97,3 +157,13 @@ Version 1.0
 
 Initial version, released 2010-08-28.
 
+
+
+
+
+ +