215 if b ~= 0x2c then return nil, "object eof"; end -- "," |
215 if b ~= 0x2c then return nil, "object eof"; end -- "," |
216 end |
216 end |
217 end |
217 end |
218 local function _readarray(json, index) |
218 local function _readarray(json, index) |
219 local a = {}; |
219 local a = {}; |
220 local oindex = index; |
|
221 while true do |
220 while true do |
222 local val; |
221 local val, terminated; |
223 val, index = _readvalue(json, index + 1); |
222 val, index, terminated = _readvalue(json, index + 1, 0x5d); |
224 if val == nil then |
223 if val == nil then |
225 if json:byte(oindex + 1) == 0x5d then return setmetatable(a, array_mt), oindex + 2; end -- "]" |
224 if terminated then -- "]" found instead of value |
|
225 if #a ~= 0 then |
|
226 -- A non-empty array here means we processed a comma, |
|
227 -- but it wasn't followed by a value. JSON doesn't allow |
|
228 -- trailing commas. |
|
229 return nil, "value expected"; |
|
230 end |
|
231 val, index = setmetatable(a, array_mt), index+1; |
|
232 end |
226 return val, index; |
233 return val, index; |
227 end |
234 end |
228 t_insert(a, val); |
235 t_insert(a, val); |
229 index = _skip_whitespace(json, index); |
236 index = _skip_whitespace(json, index); |
230 local b = json:byte(index); |
237 local b = json:byte(index); |
292 if a == 0x61 and b == 0x6c and c == 0x73 and d == 0x65 then |
299 if a == 0x61 and b == 0x6c and c == 0x73 and d == 0x65 then |
293 return false, index + 5; |
300 return false, index + 5; |
294 end |
301 end |
295 return nil, "false parse failed"; |
302 return nil, "false parse failed"; |
296 end |
303 end |
297 function _readvalue(json, index) |
304 function _readvalue(json, index, terminator) |
298 index = _skip_whitespace(json, index); |
305 index = _skip_whitespace(json, index); |
299 local b = json:byte(index); |
306 local b = json:byte(index); |
300 -- TODO try table lookup instead of if-else? |
307 -- TODO try table lookup instead of if-else? |
301 if b == 0x7B then -- "{" |
308 if b == 0x7B then -- "{" |
302 return _readobject(json, index); |
309 return _readobject(json, index); |
310 return _readnull(json, index); |
317 return _readnull(json, index); |
311 elseif b == 0x74 then -- "t" |
318 elseif b == 0x74 then -- "t" |
312 return _readtrue(json, index); |
319 return _readtrue(json, index); |
313 elseif b == 0x66 then -- "f" |
320 elseif b == 0x66 then -- "f" |
314 return _readfalse(json, index); |
321 return _readfalse(json, index); |
|
322 elseif b == terminator then |
|
323 return nil, index, true; |
315 else |
324 else |
316 return nil, "value expected"; |
325 return nil, "value expected"; |
317 end |
326 end |
318 end |
327 end |
319 local first_escape = { |
328 local first_escape = { |