| 239 | } |
| 240 | |
| 241 | static const char *parse_key(const char *json, DynamicString &key) |
| 242 | { |
| 243 | if (json == NULL) { |
| 244 | fatal("json is NULL"); |
| 245 | return NULL; |
| 246 | } |
| 247 | |
| 248 | if (*json == '"') { |
| 249 | while (*++json) { |
| 250 | if (*json == '"') |
| 251 | return json + 1; |
| 252 | |
| 253 | if (*json == '\\') { |
| 254 | ++json; |
| 255 | |
| 256 | switch (*json) { |
| 257 | case '"': key += '"'; break; |
| 258 | case '\\': key += '\\'; break; |
| 259 | case '/': key += '/'; break; |
| 260 | case 'b': key += '\b'; break; |
| 261 | case 'f': key += '\f'; break; |
| 262 | case 'n': key += '\n'; break; |
| 263 | case 'r': key += '\r'; break; |
| 264 | case 't': key += '\t'; break; |
| 265 | default: fatal("Bad escape character"); return NULL; break; |
| 266 | } |
| 267 | } else { |
| 268 | key += *json; |
| 269 | } |
| 270 | } |
| 271 | |
| 272 | fatal("Bad string"); |
| 273 | return NULL; |
| 274 | } |
| 275 | |
| 276 | while (*json) { |
| 277 | if (isspace(*json) || *json == '=' || *json == ':') |
| 278 | return json; |
| 279 | |
| 280 | key += *json++; |
| 281 | } |
| 282 | |
| 283 | fatal("Bad object key '%s'", key.c_str()); |
| 284 | return NULL; |
| 285 | } |
| 286 | |
| 287 | static f64 parse_number(const char *json) |
| 288 | { |
no test coverage detected