Software /
code /
prosody
Annotate
util/serialization.lua @ 13039:9ddb344b9fab
util.human.io: Allow defining per column ellipsis function
As an alternative to doing it in the mapper function. Could be useful in
cases where one may want to put the ellipsis in the middle or beginning
instead of the start.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 07 Apr 2023 13:00:58 +0200 |
parent | 12975:d10957394a3c |
child | 13131:03f1509a6105 |
rev | line source |
---|---|
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 |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
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 |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
10 local getmetatable = getmetatable; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
11 local next, type = next, type; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
12 local s_format = string.format; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
13 local s_gsub = string.gsub; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
14 local s_rep = string.rep; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
15 local s_char = string.char; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
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 |
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12782
diff
changeset
|
19 local to_hex = require "prosody.util.hex".to; |
9865
37278b420c74
util.serialization: Use util.hex
Kim Alvefur <zash@zash.se>
parents:
9864
diff
changeset
|
20 |
3736
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
21 local pcall = pcall; |
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12782
diff
changeset
|
22 local envload = require"prosody.util.envload".envload; |
5021
85b2689dbcfe
Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents:
3745
diff
changeset
|
23 |
12782
8815d3090928
util.mathcompat: Module to ease reuse of math.type()
Kim Alvefur <zash@zash.se>
parents:
12781
diff
changeset
|
24 if not math.type then |
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12782
diff
changeset
|
25 require "prosody.util.mathcompat" |
12782
8815d3090928
util.mathcompat: Module to ease reuse of math.type()
Kim Alvefur <zash@zash.se>
parents:
12781
diff
changeset
|
26 end |
8815d3090928
util.mathcompat: Module to ease reuse of math.type()
Kim Alvefur <zash@zash.se>
parents:
12781
diff
changeset
|
27 |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
28 local pos_inf, neg_inf = math.huge, -math.huge; |
12781
22066b02887f
util.startup: Provide a common Lua 5.3+ math.type() for Lua 5.2
Kim Alvefur <zash@zash.se>
parents:
11093
diff
changeset
|
29 local m_type = math.type; |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
30 |
9864
9d80e679c371
util.serialization: Allow overriding table iterator
Kim Alvefur <zash@zash.se>
parents:
9863
diff
changeset
|
31 local function rawpairs(t) |
9d80e679c371
util.serialization: Allow overriding table iterator
Kim Alvefur <zash@zash.se>
parents:
9863
diff
changeset
|
32 return next, t, nil; |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
33 end |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
34 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
35 local function fatal_error(obj, why) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
36 error("Can't serialize "..type(obj) .. (why and ": ".. why or "")); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
37 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
38 |
9569
0bc399953c27
util.serialization: Rename non-fatal fallback handler for clarity
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
39 local function nonfatal_fallback(x, why) |
9570
ce403b6470f8
util.serialization: Encode non-fatal error in way that can be restored
Kim Alvefur <zash@zash.se>
parents:
9569
diff
changeset
|
40 return s_format("{__type=%q,__error=%q}", type(x), why or "fail"); |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
41 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
42 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
43 local string_escapes = { |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
44 ['\a'] = [[\a]]; ['\b'] = [[\b]]; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
45 ['\f'] = [[\f]]; ['\n'] = [[\n]]; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
46 ['\r'] = [[\r]]; ['\t'] = [[\t]]; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
47 ['\v'] = [[\v]]; ['\\'] = [[\\]]; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
48 ['\"'] = [[\"]]; ['\''] = [[\']]; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
49 } |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
50 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
51 for i = 0, 255 do |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
52 local c = s_char(i); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
53 if not string_escapes[c] then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
54 string_escapes[c] = s_format("\\%03d", i); |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
55 end |
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
56 end |
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
57 |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
58 local default_keywords = { |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
59 ["do"] = true; ["and"] = true; ["else"] = true; ["break"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
60 ["if"] = true; ["end"] = true; ["goto"] = true; ["false"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
61 ["in"] = true; ["for"] = true; ["then"] = true; ["local"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
62 ["or"] = true; ["nil"] = true; ["true"] = true; ["until"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
63 ["elseif"] = true; ["function"] = true; ["not"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
64 ["repeat"] = true; ["return"] = true; ["while"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
65 }; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
66 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
67 local function new(opt) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
68 if type(opt) ~= "table" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
69 opt = { preset = opt }; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
70 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
71 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
72 local types = { |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
73 table = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
74 string = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
75 number = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
76 boolean = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
77 ["nil"] = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
78 }; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
79 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
80 -- presets |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
81 if opt.preset == "debug" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
82 opt.preset = "oneline"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
83 opt.freeze = true; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
84 opt.fatal = false; |
9569
0bc399953c27
util.serialization: Rename non-fatal fallback handler for clarity
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
85 opt.fallback = nonfatal_fallback; |
9568
69f589c888e7
util.serialization: Disable use of unquoted table keys by default
Kim Alvefur <zash@zash.se>
parents:
9567
diff
changeset
|
86 opt.unquoted = true; |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
87 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
88 if opt.preset == "oneline" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
89 opt.indentwith = opt.indentwith or ""; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
90 opt.itemstart = opt.itemstart or " "; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
91 opt.itemlast = opt.itemlast or ""; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
92 opt.tend = opt.tend or " }"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
93 elseif opt.preset == "compact" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
94 opt.indentwith = opt.indentwith or ""; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
95 opt.itemstart = opt.itemstart or ""; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
96 opt.itemlast = opt.itemlast or ""; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
97 opt.equals = opt.equals or "="; |
9568
69f589c888e7
util.serialization: Disable use of unquoted table keys by default
Kim Alvefur <zash@zash.se>
parents:
9567
diff
changeset
|
98 opt.unquoted = true; |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
99 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
100 |
9569
0bc399953c27
util.serialization: Rename non-fatal fallback handler for clarity
Kim Alvefur <zash@zash.se>
parents:
9568
diff
changeset
|
101 local fallback = opt.fallback or opt.fatal == false and nonfatal_fallback or fatal_error; |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
102 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
103 local function ser(v) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
104 return (types[type(v)] or fallback)(v); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
105 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
106 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
107 local keywords = opt.keywords or default_keywords; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
108 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
109 -- indented |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
110 local indentwith = opt.indentwith or "\t"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
111 local itemstart = opt.itemstart or "\n"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
112 local itemsep = opt.itemsep or ";"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
113 local itemlast = opt.itemlast or ";\n"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
114 local tstart = opt.tstart or "{"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
115 local tend = opt.tend or "}"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
116 local kstart = opt.kstart or "["; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
117 local kend = opt.kend or "]"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
118 local equals = opt.equals or " = "; |
9568
69f589c888e7
util.serialization: Disable use of unquoted table keys by default
Kim Alvefur <zash@zash.se>
parents:
9567
diff
changeset
|
119 local unquoted = opt.unquoted == true and "^[%a_][%w_]*$" or opt.unquoted; |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
120 local hex = opt.hex; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
121 local freeze = opt.freeze; |
9564
ed0090f8b709
util.serialization: Make maximum table depth configurable
Kim Alvefur <zash@zash.se>
parents:
9486
diff
changeset
|
122 local maxdepth = opt.maxdepth or 127; |
9567
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9565
diff
changeset
|
123 local multirefs = opt.multiref; |
9864
9d80e679c371
util.serialization: Allow overriding table iterator
Kim Alvefur <zash@zash.se>
parents:
9863
diff
changeset
|
124 local table_pairs = opt.table_iterator or rawpairs; |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
125 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
126 -- serialize one table, recursively |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
127 -- t - table being serialized |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
128 -- 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:
8555
diff
changeset
|
129 -- - also used to detect cycles |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
130 -- l - position in o of where to insert next token |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
131 -- d - depth, used for indentation |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
132 local function serialize_table(t, o, l, d) |
9565
9a1e2f5f674f
util.serialization: Separate errors for multiple table references and max depth
Kim Alvefur <zash@zash.se>
parents:
9564
diff
changeset
|
133 if o[t] then |
9a1e2f5f674f
util.serialization: Separate errors for multiple table references and max depth
Kim Alvefur <zash@zash.se>
parents:
9564
diff
changeset
|
134 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:
9564
diff
changeset
|
135 return l; |
9a1e2f5f674f
util.serialization: Separate errors for multiple table references and max depth
Kim Alvefur <zash@zash.se>
parents:
9564
diff
changeset
|
136 elseif d > maxdepth then |
9a1e2f5f674f
util.serialization: Separate errors for multiple table references and max depth
Kim Alvefur <zash@zash.se>
parents:
9564
diff
changeset
|
137 o[l], l = fallback(t, "max table depth reached"), l + 1; |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
138 return l; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
139 end |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
140 |
9567
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9565
diff
changeset
|
141 -- 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:
9565
diff
changeset
|
142 local ot = t; -- reference pre-freeze |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
143 o[t] = true; |
9567
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9565
diff
changeset
|
144 o[ot] = true; |
9485
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
145 |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
146 if freeze == true then |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
147 -- opportunity to do pre-serialization |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
148 local mt = getmetatable(t); |
9485
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
149 if type(mt) == "table" then |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
150 local tag = mt.__name; |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
151 local fr = mt.__freeze; |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
152 |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
153 if type(fr) == "function" then |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
154 t = fr(t); |
11093
ec14d4fce855
util.serialization: Let freeze metamethod return a literal string
Kim Alvefur <zash@zash.se>
parents:
10061
diff
changeset
|
155 if type(t) == "string" then |
ec14d4fce855
util.serialization: Let freeze metamethod return a literal string
Kim Alvefur <zash@zash.se>
parents:
10061
diff
changeset
|
156 o[l], l = t, l + 1; |
ec14d4fce855
util.serialization: Let freeze metamethod return a literal string
Kim Alvefur <zash@zash.se>
parents:
10061
diff
changeset
|
157 return l; |
ec14d4fce855
util.serialization: Let freeze metamethod return a literal string
Kim Alvefur <zash@zash.se>
parents:
10061
diff
changeset
|
158 end |
9485
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
159 if type(tag) == "string" then |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
160 o[l], l = tag, l + 1; |
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
161 end |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
162 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
163 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
164 end |
9485
c667887d78ad
util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents:
9484
diff
changeset
|
165 |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
166 o[l], l = tstart, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
167 local indent = s_rep(indentwith, d); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
168 local numkey = 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
169 local ktyp, vtyp; |
9863
aebfd1601ae2
util.serialization: Optimize handling of last table separator
Kim Alvefur <zash@zash.se>
parents:
9692
diff
changeset
|
170 local had_items = false; |
9864
9d80e679c371
util.serialization: Allow overriding table iterator
Kim Alvefur <zash@zash.se>
parents:
9863
diff
changeset
|
171 for k,v in table_pairs(t) do |
9863
aebfd1601ae2
util.serialization: Optimize handling of last table separator
Kim Alvefur <zash@zash.se>
parents:
9692
diff
changeset
|
172 had_items = true; |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
173 o[l], l = itemstart, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
174 o[l], l = indent, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
175 ktyp, vtyp = type(k), type(v); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
176 if k == numkey then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
177 -- next index in array part |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
178 -- assuming that these are found in order |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
179 numkey = numkey + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
180 elseif unquoted and ktyp == "string" and |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
181 not keywords[k] and s_match(k, unquoted) then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
182 -- unquoted keys |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
183 o[l], l = k, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
184 o[l], l = equals, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
185 else |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
186 -- quoted keys |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
187 o[l], l = kstart, l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
188 if ktyp == "table" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
189 l = serialize_table(k, o, l, d+1); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
190 else |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
191 o[l], l = ser(k), l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
192 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
193 -- = |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
194 o[l], o[l+1], l = kend, equals, l + 2; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
195 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
196 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
197 -- the value |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
198 if vtyp == "table" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
199 l = serialize_table(v, o, l, d+1); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
200 else |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
201 o[l], l = ser(v), l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
202 end |
9863
aebfd1601ae2
util.serialization: Optimize handling of last table separator
Kim Alvefur <zash@zash.se>
parents:
9692
diff
changeset
|
203 o[l], l = itemsep, l + 1; |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
204 end |
9863
aebfd1601ae2
util.serialization: Optimize handling of last table separator
Kim Alvefur <zash@zash.se>
parents:
9692
diff
changeset
|
205 if had_items then |
aebfd1601ae2
util.serialization: Optimize handling of last table separator
Kim Alvefur <zash@zash.se>
parents:
9692
diff
changeset
|
206 o[l - 1] = itemlast; |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
207 o[l], l = s_rep(indentwith, d-1), l + 1; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
208 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
209 o[l], l = tend, l +1; |
9567
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9565
diff
changeset
|
210 |
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9565
diff
changeset
|
211 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:
9565
diff
changeset
|
212 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:
9565
diff
changeset
|
213 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:
9565
diff
changeset
|
214 end |
dbfa286cfa88
util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents:
9565
diff
changeset
|
215 |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
216 return l; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
217 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
218 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
219 function types.table(t) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
220 local o = {}; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
221 serialize_table(t, o, 1, 1); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
222 return t_concat(o); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
223 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
224 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
225 local function serialize_string(s) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
226 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:
8555
diff
changeset
|
227 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
228 |
9483
903e0cfd4cc9
util.serialization: Make check of prefix for optional hex encoding stricter
Kim Alvefur <zash@zash.se>
parents:
9480
diff
changeset
|
229 if type(hex) == "string" then |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
230 function types.string(s) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
231 local esc = serialize_string(s); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
232 if #esc > (#s*2+2+#hex) then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
233 return hex .. '"' .. to_hex(s) .. '"'; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
234 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
235 return esc; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
236 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
237 else |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
238 types.string = serialize_string; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
239 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
240 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
241 function types.number(t) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
242 if m_type(t) == "integer" then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
243 return s_format("%d", t); |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
244 elseif t == pos_inf then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
245 return "(1/0)"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
246 elseif t == neg_inf then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
247 return "(-1/0)"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
248 elseif t ~= t then |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
249 return "(0/0)"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
250 end |
9486
20aad0108999
util.serialization: Remove encoding of very large or very small numbers in scientific notation
Kim Alvefur <zash@zash.se>
parents:
9485
diff
changeset
|
251 return s_format("%.18g", t); |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
252 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
253 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
254 -- Are these faster than tostring? |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
255 types["nil"] = function() |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
256 return "nil"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
257 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
258 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
259 function types.boolean(t) |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
260 return t and "true" or "false"; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
261 end |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
262 |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
263 return ser; |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
264 end |
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
265 |
6777
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:
6670
diff
changeset
|
266 local function deserialize(str) |
3736
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
267 if type(str) ~= "string" then return nil; end |
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
268 str = "return "..str; |
9484
1d1541630c20
util.serialization: Use '=' prefix for chunk source description
Kim Alvefur <zash@zash.se>
parents:
9483
diff
changeset
|
269 local f, err = envload(str, "=serialized data", {}); |
3736
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
270 if not f then return nil, err; end |
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
271 local success, ret = pcall(f); |
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
272 if not success then return nil, ret; end |
73399dd525e8
util.serialization: Implemented deserialize().
Waqas Hussain <waqas20@gmail.com>
parents:
2923
diff
changeset
|
273 return ret; |
546
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
274 end |
1e65f64dfabf
Added module util.serialization
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
275 |
10060
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9570
diff
changeset
|
276 local default = new(); |
6777
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:
6670
diff
changeset
|
277 return { |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
278 new = new; |
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
279 serialize = function (x, opt) |
10060
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9570
diff
changeset
|
280 if opt == nil then |
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9570
diff
changeset
|
281 return default(x); |
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9570
diff
changeset
|
282 else |
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9570
diff
changeset
|
283 return new(opt)(x); |
7a36b7ac309b
util.serialization: Cache default serialization instance (fixes #1389)
Kim Alvefur <zash@zash.se>
parents:
9570
diff
changeset
|
284 end |
9008
ae3c52419ec1
util.serialization: Rewritte for performance and flexibility
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
285 end; |
6777
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:
6670
diff
changeset
|
286 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:
6670
diff
changeset
|
287 }; |