Comparison

util/serialization.lua @ 9864:9d80e679c371

util.serialization: Allow overriding table iterator Could be useful to eg swap it out with sorted_pairs to get a stable serialization. Default to next() wrapper to avoid metatable tricks from pairs().
author Kim Alvefur <zash@zash.se>
date Sun, 17 Mar 2019 21:16:27 +0100
parent 9863:aebfd1601ae2
child 9865:37278b420c74
comparison
equal deleted inserted replaced
9863:aebfd1601ae2 9864:9d80e679c371
29 char_to_hex[s_char(i)] = s_format("%02x", i); 29 char_to_hex[s_char(i)] = s_format("%02x", i);
30 end 30 end
31 31
32 local function to_hex(s) 32 local function to_hex(s)
33 return (s_gsub(s, ".", char_to_hex)); 33 return (s_gsub(s, ".", char_to_hex));
34 end
35
36 local function rawpairs(t)
37 return next, t, nil;
34 end 38 end
35 39
36 local function fatal_error(obj, why) 40 local function fatal_error(obj, why)
37 error("Can't serialize "..type(obj) .. (why and ": ".. why or "")); 41 error("Can't serialize "..type(obj) .. (why and ": ".. why or ""));
38 end 42 end
120 local unquoted = opt.unquoted == true and "^[%a_][%w_]*$" or opt.unquoted; 124 local unquoted = opt.unquoted == true and "^[%a_][%w_]*$" or opt.unquoted;
121 local hex = opt.hex; 125 local hex = opt.hex;
122 local freeze = opt.freeze; 126 local freeze = opt.freeze;
123 local maxdepth = opt.maxdepth or 127; 127 local maxdepth = opt.maxdepth or 127;
124 local multirefs = opt.multiref; 128 local multirefs = opt.multiref;
129 local table_pairs = opt.table_iterator or rawpairs;
125 130
126 -- serialize one table, recursively 131 -- serialize one table, recursively
127 -- t - table being serialized 132 -- t - table being serialized
128 -- o - array where tokens are added, concatenate to get final result 133 -- o - array where tokens are added, concatenate to get final result
129 -- - also used to detect cycles 134 -- - also used to detect cycles
162 o[l], l = tstart, l + 1; 167 o[l], l = tstart, l + 1;
163 local indent = s_rep(indentwith, d); 168 local indent = s_rep(indentwith, d);
164 local numkey = 1; 169 local numkey = 1;
165 local ktyp, vtyp; 170 local ktyp, vtyp;
166 local had_items = false; 171 local had_items = false;
167 for k,v in next,t do 172 for k,v in table_pairs(t) do
168 had_items = true; 173 had_items = true;
169 o[l], l = itemstart, l + 1; 174 o[l], l = itemstart, l + 1;
170 o[l], l = indent, l + 1; 175 o[l], l = indent, l + 1;
171 ktyp, vtyp = type(k), type(v); 176 ktyp, vtyp = type(k), type(v);
172 if k == numkey then 177 if k == numkey then