forgot to add json.lua
[?]
May 15, 2022, 9:36 PM
RSZD5A7GI5MISRTDFFJ63VUSFUFF3R7SXA66J64CBHWHNEUBMICQCDependencies
- [2]
R5QXEHUIsomebody stop me
Change contents
- file addition: json.lua[2.2]
---- https://github.com/rxi/json.lua---- Copyright (c) 2020 rxi---- 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.--local json = { _version = "0.1.2" }--------------------------------------------------------------------------------- Encode-------------------------------------------------------------------------------local encodelocal escape_char_map = {[ "\\" ] = "\\",[ "\"" ] = "\"",[ "\b" ] = "b",[ "\f" ] = "f",[ "\n" ] = "n",[ "\r" ] = "r",[ "\t" ] = "t",}local escape_char_map_inv = { [ "/" ] = "/" }for k, v in pairs(escape_char_map) doescape_char_map_inv[v] = kendlocal function escape_char(c)return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte()))endlocal function encode_nil(val)return "null"endlocal function encode_table(val, stack)local res = {}stack = stack or {}-- Circular reference?if stack[val] then error("circular reference") endstack[val] = trueif rawget(val, 1) ~= nil or next(val) == nil then-- Treat as array -- check keys are valid and it is not sparselocal n = 0for k in pairs(val) doif type(k) ~= "number" thenerror("invalid table: mixed or invalid key types")endn = n + 1endif n ~= #val thenerror("invalid table: sparse array")end-- Encodefor i, v in ipairs(val) dotable.insert(res, encode(v, stack))endstack[val] = nilreturn "[" .. table.concat(res, ",") .. "]"else-- Treat as an objectfor k, v in pairs(val) doif type(k) ~= "string" thenerror("invalid table: mixed or invalid key types")endtable.insert(res, encode(k, stack) .. ":" .. encode(v, stack))endstack[val] = nilreturn "{" .. table.concat(res, ",") .. "}"endendlocal function encode_string(val)return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"'endlocal function encode_number(val)-- Check for NaN, -inf and infif val ~= val or val <= -math.huge or val >= math.huge thenerror("unexpected number value '" .. tostring(val) .. "'")endreturn string.format("%.14g", val)endlocal type_func_map = {[ "nil" ] = encode_nil,[ "table" ] = encode_table,[ "string" ] = encode_string,[ "number" ] = encode_number,[ "boolean" ] = tostring,}encode = function(val, stack)local t = type(val)local f = type_func_map[t]if f thenreturn f(val, stack)enderror("unexpected type '" .. t .. "'")endfunction json.encode(val)return ( encode(val) )end--------------------------------------------------------------------------------- Decode-------------------------------------------------------------------------------local parselocal function create_set(...)local res = {}for i = 1, select("#", ...) dores[ select(i, ...) ] = trueendreturn resendlocal space_chars = create_set(" ", "\t", "\r", "\n")local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",")local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u")local literals = create_set("true", "false", "null")local literal_map = {[ "true" ] = true,[ "false" ] = false,[ "null" ] = nil,}local function next_char(str, idx, set, negate)for i = idx, #str doif set[str:sub(i, i)] ~= negate thenreturn iendendreturn #str + 1endlocal function decode_error(str, idx, msg)local line_count = 1local col_count = 1for i = 1, idx - 1 docol_count = col_count + 1if str:sub(i, i) == "\n" thenline_count = line_count + 1col_count = 1endenderror( string.format("%s at line %d col %d", msg, line_count, col_count) )endlocal function codepoint_to_utf8(n)-- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixalocal f = math.floorif n <= 0x7f thenreturn string.char(n)elseif n <= 0x7ff thenreturn string.char(f(n / 64) + 192, n % 64 + 128)elseif n <= 0xffff thenreturn string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128)elseif n <= 0x10ffff thenreturn string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128,f(n % 4096 / 64) + 128, n % 64 + 128)enderror( string.format("invalid unicode codepoint '%x'", n) )endlocal function parse_unicode_escape(s)local n1 = tonumber( s:sub(1, 4), 16 )local n2 = tonumber( s:sub(7, 10), 16 )-- Surrogate pair?if n2 thenreturn codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000)elsereturn codepoint_to_utf8(n1)endendlocal function parse_string(str, i)local res = ""local j = i + 1local k = jwhile j <= #str dolocal x = str:byte(j)if x < 32 thendecode_error(str, j, "control character in string")elseif x == 92 then -- `\`: Escaperes = res .. str:sub(k, j - 1)j = j + 1local c = str:sub(j, j)if c == "u" thenlocal hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1)or str:match("^%x%x%x%x", j + 1)or decode_error(str, j - 1, "invalid unicode escape in string")res = res .. parse_unicode_escape(hex)j = j + #hexelseif not escape_chars[c] thendecode_error(str, j - 1, "invalid escape char '" .. c .. "' in string")endres = res .. escape_char_map_inv[c]endk = j + 1elseif x == 34 then -- `"`: End of stringres = res .. str:sub(k, j - 1)return res, j + 1endj = j + 1enddecode_error(str, i, "expected closing quote for string")endlocal function parse_number(str, i)local x = next_char(str, i, delim_chars)local s = str:sub(i, x - 1)local n = tonumber(s)if not n thendecode_error(str, i, "invalid number '" .. s .. "'")endreturn n, xendlocal function parse_literal(str, i)local x = next_char(str, i, delim_chars)local word = str:sub(i, x - 1)if not literals[word] thendecode_error(str, i, "invalid literal '" .. word .. "'")endreturn literal_map[word], xendlocal function parse_array(str, i)local res = {}local n = 1i = i + 1while 1 dolocal xi = next_char(str, i, space_chars, true)-- Empty / end of array?if str:sub(i, i) == "]" theni = i + 1breakend-- Read tokenx, i = parse(str, i)res[n] = xn = n + 1-- Next tokeni = next_char(str, i, space_chars, true)local chr = str:sub(i, i)i = i + 1if chr == "]" then break endif chr ~= "," then decode_error(str, i, "expected ']' or ','") endendreturn res, iendlocal function parse_object(str, i)local res = {}i = i + 1while 1 dolocal key, vali = next_char(str, i, space_chars, true)-- Empty / end of object?if str:sub(i, i) == "}" theni = i + 1breakend-- Read keyif str:sub(i, i) ~= '"' thendecode_error(str, i, "expected string for key")endkey, i = parse(str, i)-- Read ':' delimiteri = next_char(str, i, space_chars, true)if str:sub(i, i) ~= ":" thendecode_error(str, i, "expected ':' after key")endi = next_char(str, i + 1, space_chars, true)-- Read valueval, i = parse(str, i)-- Setres[key] = val-- Next tokeni = next_char(str, i, space_chars, true)local chr = str:sub(i, i)i = i + 1if chr == "}" then break endif chr ~= "," then decode_error(str, i, "expected '}' or ','") endendreturn res, iendlocal char_func_map = {[ '"' ] = parse_string,[ "0" ] = parse_number,[ "1" ] = parse_number,[ "2" ] = parse_number,[ "3" ] = parse_number,[ "4" ] = parse_number,[ "5" ] = parse_number,[ "6" ] = parse_number,[ "7" ] = parse_number,[ "8" ] = parse_number,[ "9" ] = parse_number,[ "-" ] = parse_number,[ "t" ] = parse_literal,[ "f" ] = parse_literal,[ "n" ] = parse_literal,[ "[" ] = parse_array,[ "{" ] = parse_object,}parse = function(str, idx)local chr = str:sub(idx, idx)local f = char_func_map[chr]if f thenreturn f(str, idx)enddecode_error(str, idx, "unexpected character '" .. chr .. "'")endfunction json.decode(str)if type(str) ~= "string" thenerror("expected argument of type string, got " .. type(str))endlocal res, idx = parse(str, next_char(str, 1, space_chars, true))idx = next_char(str, idx, space_chars, true)if idx <= #str thendecode_error(str, idx, "trailing garbage")endreturn resendreturn json