author | Kim Alvefur <zash@zash.se> |
Sat, 07 Nov 2020 21:39:36 +0100 | |
changeset 11643 | ad39528e647d |
parent 11097 | ec14d4fce855 |
child 12785 | 22066b02887f |
permissions | -rw-r--r-- |
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1135
diff
changeset
|
1 |
-- Prosody IM |
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2222
diff
changeset
|
2 |
-- Copyright (C) 2008-2010 Matthew Wild |
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2222
diff
changeset
|
3 |
-- Copyright (C) 2008-2010 Waqas Hussain |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
4 |
-- Copyright (C) 2018 Kim Alvefur |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5021
diff
changeset
|
5 |
-- |
758 | 6 |
-- This project is MIT/X11 licensed. Please see the |
7 |
-- COPYING file in the source package for more information. |
|
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
8 |
-- |
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
9 |
|
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
10 |
local getmetatable = getmetatable; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
11 |
local next, type = next, type; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
12 |
local s_format = string.format; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
13 |
local s_gsub = string.gsub; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
14 |
local s_rep = string.rep; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
15 |
local s_char = string.char; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
16 |
local s_match = string.match; |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
17 |
local t_concat = table.concat; |
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
18 |
|
9869
37278b420c74
util.serialization: Use util.hex
Kim Alvefur <zash@zash.se>
parents:
9868
diff
changeset
|
19 |
local to_hex = require "util.hex".to; |
37278b420c74
util.serialization: Use util.hex
Kim Alvefur <zash@zash.se>
parents:
9868
diff
changeset
|
20 |
|
3736
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
21 |
local pcall = pcall; |
5021
85b2689dbcfe
Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents:
3745
diff
changeset
|
22 |
local envload = require"util.envload".envload; |
85b2689dbcfe
Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents:
3745
diff
changeset
|
23 |
|
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
24 |
local pos_inf, neg_inf = math.huge, -math.huge; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
25 |
local m_type = math.type or function (n) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
26 |
return n % 1 == 0 and n <= 9007199254740992 and n >= -9007199254740992 and "integer" or "float"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
27 |
end; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
28 |
|
9868
9d80e679c371
util.serialization: Allow overriding table iterator
Kim Alvefur <zash@zash.se>
parents:
9867
diff
changeset
|
29 |
local function rawpairs(t) |
9d80e679c371
util.serialization: Allow overriding table iterator
Kim Alvefur <zash@zash.se>
parents:
9867
diff
changeset
|
30 |
return next, t, nil; |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
31 |
end |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
32 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
33 |
local function fatal_error(obj, why) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
34 |
error("Can't serialize "..type(obj) .. (why and ": ".. why or "")); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
35 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
36 |
|
9572
0bc399953c27
util.serialization: Rename non-fatal fallback handler for clarity
Kim Alvefur <zash@zash.se>
parents:
9571
diff
changeset
|
37 |
local function nonfatal_fallback(x, why) |
9573
ce403b6470f8
util.serialization: Encode non-fatal error in way that can be restored
Kim Alvefur <zash@zash.se>
parents:
9572
diff
changeset
|
38 |
return s_format("{__type=%q,__error=%q}", type(x), why or "fail"); |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
39 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
40 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
41 |
local string_escapes = { |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
42 |
['\a'] = [[\a]]; ['\b'] = [[\b]]; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
43 |
['\f'] = [[\f]]; ['\n'] = [[\n]]; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
44 |
['\r'] = [[\r]]; ['\t'] = [[\t]]; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
45 |
['\v'] = [[\v]]; ['\\'] = [[\\]]; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
46 |
['\"'] = [[\"]]; ['\''] = [[\']]; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
47 |
} |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
48 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
49 |
for i = 0, 255 do |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
50 |
local c = s_char(i); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
51 |
if not string_escapes[c] then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
52 |
string_escapes[c] = s_format("\\%03d", i); |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
53 |
end |
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
54 |
end |
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
55 |
|
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
56 |
local default_keywords = { |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
57 |
["do"] = true; ["and"] = true; ["else"] = true; ["break"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
58 |
["if"] = true; ["end"] = true; ["goto"] = true; ["false"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
59 |
["in"] = true; ["for"] = true; ["then"] = true; ["local"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
60 |
["or"] = true; ["nil"] = true; ["true"] = true; ["until"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
61 |
["elseif"] = true; ["function"] = true; ["not"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
62 |
["repeat"] = true; ["return"] = true; ["while"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
63 |
}; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
64 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
65 |
local function new(opt) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
66 |
if type(opt) ~= "table" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
67 |
opt = { preset = opt }; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
68 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
69 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
70 |
local types = { |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
71 |
table = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
72 |
string = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
73 |
number = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
74 |
boolean = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
75 |
["nil"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
76 |
}; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
77 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
78 |
-- presets |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
79 |
if opt.preset == "debug" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
80 |
opt.preset = "oneline"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
81 |
opt.freeze = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
82 |
opt.fatal = false; |
9572
0bc399953c27
util.serialization: Rename non-fatal fallback handler for clarity
Kim Alvefur <zash@zash.se>
parents:
9571
diff
changeset
|
83 |
opt.fallback = nonfatal_fallback; |
9571
69f589c888e7
util.serialization: Disable use of unquoted table keys by default
Kim Alvefur <zash@zash.se>
parents:
9570
diff
changeset
|
84 |
opt.unquoted = true; |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
85 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
86 |
if opt.preset == "oneline" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
87 |
opt.indentwith = opt.indentwith or ""; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
88 |
opt.itemstart = opt.itemstart or " "; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
89 |
opt.itemlast = opt.itemlast or ""; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
90 |
opt.tend = opt.tend or " }"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
91 |
elseif opt.preset == "compact" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
92 |
opt.indentwith = opt.indentwith or ""; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
93 |
opt.itemstart = opt.itemstart or ""; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
94 |
opt.itemlast = opt.itemlast or ""; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
95 |
opt.equals = opt.equals or "="; |
9571
69f589c888e7
util.serialization: Disable use of unquoted table keys by default
Kim Alvefur <zash@zash.se>
parents:
9570
diff
changeset
|
96 |
opt.unquoted = true; |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
97 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
98 |
|
9572
0bc399953c27
util.serialization: Rename non-fatal fallback handler for clarity
Kim Alvefur <zash@zash.se>
parents:
9571
diff
changeset
|
99 |
local fallback = opt.fallback or opt.fatal == false and nonfatal_fallback or fatal_error; |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
100 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
101 |
local function ser(v) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
102 |
return (types[type(v)] or fallback)(v); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
103 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
104 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
105 |
local keywords = opt.keywords or default_keywords; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
106 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
107 |
-- indented |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
108 |
local indentwith = opt.indentwith or "\t"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
109 |
local itemstart = opt.itemstart or "\n"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
110 |
local itemsep = opt.itemsep or ";"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
111 |
local itemlast = opt.itemlast or ";\n"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
112 |
local tstart = opt.tstart or "{"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
113 |
local tend = opt.tend or "}"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
114 |
local kstart = opt.kstart or "["; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
115 |
local kend = opt.kend or "]"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
116 |
local equals = opt.equals or " = "; |
9571
69f589c888e7
util.serialization: Disable use of unquoted table keys by default
Kim Alvefur <zash@zash.se>
parents:
9570
diff
changeset
|
117 |
local unquoted = opt.unquoted == true and "^[%a_][%w_]*$" or opt.unquoted; |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
118 |
local hex = opt.hex; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
119 |
local freeze = opt.freeze; |
9567
ed0090f8b709
util.serialization: Make maximum table depth configurable
Kim Alvefur <zash@zash.se>
parents:
9489
diff
changeset
|
120 |
local maxdepth = opt.maxdepth or 127; |
9570
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
121 |
local multirefs = opt.multiref; |
9868
9d80e679c371
util.serialization: Allow overriding table iterator
Kim Alvefur <zash@zash.se>
parents:
9867
diff
changeset
|
122 |
local table_pairs = opt.table_iterator or rawpairs; |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
123 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
124 |
-- serialize one table, recursively |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
125 |
-- t - table being serialized |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
126 |
-- o - array where tokens are added, concatenate to get final result |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
127 |
-- - also used to detect cycles |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
128 |
-- l - position in o of where to insert next token |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
129 |
-- d - depth, used for indentation |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
130 |
local function serialize_table(t, o, l, d) |
9568
9a1e2f5f674f
util.serialization: Separate errors for multiple table references and max depth
Kim Alvefur <zash@zash.se>
parents:
9567
diff
changeset
|
131 |
if o[t] then |
9a1e2f5f674f
util.serialization: Separate errors for multiple table references and max depth
Kim Alvefur <zash@zash.se>
parents:
9567
diff
changeset
|
132 |
o[l], l = fallback(t, "table has multiple references"), l + 1; |
9a1e2f5f674f
util.serialization: Separate errors for multiple table references and max depth
Kim Alvefur <zash@zash.se>
parents:
9567
diff
changeset
|
133 |
return l; |
9a1e2f5f674f
util.serialization: Separate errors for multiple table references and max depth
Kim Alvefur <zash@zash.se>
parents:
9567
diff
changeset
|
134 |
elseif d > maxdepth then |
9a1e2f5f674f
util.serialization: Separate errors for multiple table references and max depth
Kim Alvefur <zash@zash.se>
parents:
9567
diff
changeset
|
135 |
o[l], l = fallback(t, "max table depth reached"), l + 1; |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
136 |
return l; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
137 |
end |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
138 |
|
9570
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
139 |
-- Keep track of table loops |
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
140 |
local ot = t; -- reference pre-freeze |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
141 |
o[t] = true; |
9570
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
142 |
o[ot] = true; |
9488
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
143 |
|
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
144 |
if freeze == true then |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
145 |
-- opportunity to do pre-serialization |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
146 |
local mt = getmetatable(t); |
9488
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
147 |
if type(mt) == "table" then |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
148 |
local tag = mt.__name; |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
149 |
local fr = mt.__freeze; |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
150 |
|
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
151 |
if type(fr) == "function" then |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
152 |
t = fr(t); |
11097
ec14d4fce855
util.serialization: Let freeze metamethod return a literal string
Kim Alvefur <zash@zash.se>
parents:
10065
diff
changeset
|
153 |
if type(t) == "string" then |
ec14d4fce855
util.serialization: Let freeze metamethod return a literal string
Kim Alvefur <zash@zash.se>
parents:
10065
diff
changeset
|
154 |
o[l], l = t, l + 1; |
ec14d4fce855
util.serialization: Let freeze metamethod return a literal string
Kim Alvefur <zash@zash.se>
parents:
10065
diff
changeset
|
155 |
return l; |
ec14d4fce855
util.serialization: Let freeze metamethod return a literal string
Kim Alvefur <zash@zash.se>
parents:
10065
diff
changeset
|
156 |
end |
9488
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
157 |
if type(tag) == "string" then |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
158 |
o[l], l = tag, l + 1; |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
159 |
end |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
160 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
161 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
162 |
end |
9488
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9487
diff
changeset
|
163 |
|
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
164 |
o[l], l = tstart, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
165 |
local indent = s_rep(indentwith, d); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
166 |
local numkey = 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
167 |
local ktyp, vtyp; |
9867
aebfd1601ae2
util.serialization: Optimize handling of last table separator
Kim Alvefur <zash@zash.se>
parents:
9696
diff
changeset
|
168 |
local had_items = false; |
9868
9d80e679c371
util.serialization: Allow overriding table iterator
Kim Alvefur <zash@zash.se>
parents:
9867
diff
changeset
|
169 |
for k,v in table_pairs(t) do |
9867
aebfd1601ae2
util.serialization: Optimize handling of last table separator
Kim Alvefur <zash@zash.se>
parents:
9696
diff
changeset
|
170 |
had_items = true; |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
171 |
o[l], l = itemstart, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
172 |
o[l], l = indent, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
173 |
ktyp, vtyp = type(k), type(v); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
174 |
if k == numkey then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
175 |
-- next index in array part |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
176 |
-- assuming that these are found in order |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
177 |
numkey = numkey + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
178 |
elseif unquoted and ktyp == "string" and |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
179 |
not keywords[k] and s_match(k, unquoted) then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
180 |
-- unquoted keys |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
181 |
o[l], l = k, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
182 |
o[l], l = equals, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
183 |
else |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
184 |
-- quoted keys |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
185 |
o[l], l = kstart, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
186 |
if ktyp == "table" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
187 |
l = serialize_table(k, o, l, d+1); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
188 |
else |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
189 |
o[l], l = ser(k), l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
190 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
191 |
-- = |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
192 |
o[l], o[l+1], l = kend, equals, l + 2; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
193 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
194 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
195 |
-- the value |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
196 |
if vtyp == "table" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
197 |
l = serialize_table(v, o, l, d+1); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
198 |
else |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
199 |
o[l], l = ser(v), l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
200 |
end |
9867
aebfd1601ae2
util.serialization: Optimize handling of last table separator
Kim Alvefur <zash@zash.se>
parents:
9696
diff
changeset
|
201 |
o[l], l = itemsep, l + 1; |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
202 |
end |
9867
aebfd1601ae2
util.serialization: Optimize handling of last table separator
Kim Alvefur <zash@zash.se>
parents:
9696
diff
changeset
|
203 |
if had_items then |
aebfd1601ae2
util.serialization: Optimize handling of last table separator
Kim Alvefur <zash@zash.se>
parents:
9696
diff
changeset
|
204 |
o[l - 1] = itemlast; |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
205 |
o[l], l = s_rep(indentwith, d-1), l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
206 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
207 |
o[l], l = tend, l +1; |
9570
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
208 |
|
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
209 |
if multirefs then |
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
210 |
o[t] = nil; |
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
211 |
o[ot] = nil; |
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
212 |
end |
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
213 |
|
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
214 |
return l; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
215 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
216 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
217 |
function types.table(t) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
218 |
local o = {}; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
219 |
serialize_table(t, o, 1, 1); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
220 |
return t_concat(o); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
221 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
222 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
223 |
local function serialize_string(s) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
224 |
return '"' .. s_gsub(s, "[%z\1-\31\"\'\\\127-\255]", string_escapes) .. '"'; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
225 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
226 |
|
9486
903e0cfd4cc9
util.serialization: Make check of prefix for optional hex encoding stricter
Kim Alvefur <zash@zash.se>
parents:
9483
diff
changeset
|
227 |
if type(hex) == "string" then |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
228 |
function types.string(s) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
229 |
local esc = serialize_string(s); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
230 |
if #esc > (#s*2+2+#hex) then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
231 |
return hex .. '"' .. to_hex(s) .. '"'; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
232 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
233 |
return esc; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
234 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
235 |
else |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
236 |
types.string = serialize_string; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
237 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
238 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
239 |
function types.number(t) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
240 |
if m_type(t) == "integer" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
241 |
return s_format("%d", t); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
242 |
elseif t == pos_inf then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
243 |
return "(1/0)"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
244 |
elseif t == neg_inf then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
245 |
return "(-1/0)"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
246 |
elseif t ~= t then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
247 |
return "(0/0)"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
248 |
end |
9489
20aad0108999
util.serialization: Remove encoding of very large or very small numbers in scientific notation
Kim Alvefur <zash@zash.se>
parents:
9488
diff
changeset
|
249 |
return s_format("%.18g", t); |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
250 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
251 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
252 |
-- Are these faster than tostring? |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
253 |
types["nil"] = function() |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
254 |
return "nil"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
255 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
256 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
257 |
function types.boolean(t) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
258 |
return t and "true" or "false"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
259 |
end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
260 |
|
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
261 |
return ser; |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
262 |
end |
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
263 |
|
6780
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6673
diff
changeset
|
264 |
local function deserialize(str) |
3736
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
265 |
if type(str) ~= "string" then return nil; end |
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
266 |
str = "return "..str; |
9487
1d1541630c20
util.serialization: Use '=' prefix for chunk source description
Kim Alvefur <zash@zash.se>
parents:
9486
diff
changeset
|
267 |
local f, err = envload(str, "=serialized data", {}); |
3736
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
268 |
if not f then return nil, err; end |
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
269 |
local success, ret = pcall(f); |
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
270 |
if not success then return nil, ret; end |
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
271 |
return ret; |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
272 |
end |
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
273 |
|
10064
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
274 |
local default = new(); |
6780
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6673
diff
changeset
|
275 |
return { |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
276 |
new = new; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
277 |
serialize = function (x, opt) |
10064
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
278 |
if opt == nil then |
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
279 |
return default(x); |
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
280 |
else |
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
281 |
return new(opt)(x); |
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
282 |
end |
9011
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8558
diff
changeset
|
283 |
end; |
6780
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6673
diff
changeset
|
284 |
deserialize = deserialize; |
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
6673
diff
changeset
|
285 |
}; |