Software / code / prosody
Comparison
util/json.lua @ 12793:d63190a7a714
Merge 0.12->trunk
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 04 Nov 2022 12:26:43 +0000 |
| parent | 12792:997f3ca90628 |
| child | 12975:d10957394a3c |
comparison
equal
deleted
inserted
replaced
| 12791:4f69423603f2 | 12793:d63190a7a714 |
|---|---|
| 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 = { |