Lines Matching refs:data
63 // parses 'data' and writes the corresponding JSON structure to 'value'
64 char* parse_value(char* data, value& value);
66 // parses 'data' and return JSON structure. the value::type will be 'uninitialized' if parsing failed.
67 value parse(char* data);
303 char* parse_value(char* data, value& value);
304 char* parse_number(char* data, value&);
305 char* parse_string(char* data, value&);
307 inline bool isWhite(char data)
309 return ((data == ' ') || (data == '\n') || (data == '\r') || (data == '\t'));
312 inline bool isSign(char data)
314 return ((data == '+') || (data == '-'));
317 inline bool isDigit(char data)
319 return ((data >= '0') && (data <= '9'));
322 inline bool isHex(char data)
324 return ((data >= '0') && (data <= '9')) || ((data >= 'a') && (data <= 'f')) || ((data >= 'A') && (data <= 'F'));
327 inline char* trim(char* data)
329 while (*data && isWhite(*data)) {
330 data++;
332 return data;
335 char* parse_object(char* data, value& res)
337 data = trim(data);
338 if (*data == '}') {
341 return data + 1;
344 for (; *data != 0;) {
345 if (*data != '"') {
347 *data = 0;
348 return data;
353 data = trim(parse_string(data + 1, key));
355 if (*data == ':') {
356 data++;
359 *data = 0;
360 return data;
362 data = trim(data);
363 data = trim(parse_value(data, pair.value));
364 if (*data == '}') {
367 return data + 1;
368 } else if (*data == ',') {
369 data = trim(data + 1);
372 *data = 0;
373 return data;
376 return data;
379 char* parse_array(char* data, value& res)
381 data = trim(data);
382 if (*data == ']') {
385 return data + 1;
388 for (; *data != 0;) {
390 data = trim(parse_value(data, tmp));
392 if (*data == ',') {
393 data = trim(data + 1);
394 } else if (*data == ']') {
396 return data + 1;
399 *data = 0;
400 return data;
403 return data;
407 char* parse_string(char* data, value& res)
409 char* start = data;
410 for (; *data != 0; data++) {
411 if (*data == '\\' && data[1]) {
413 if (data[1] == '\\' || data[1] == '"' || data[1] == '/' || data[1] == 'b' || data[1] == 'f' ||
414 data[1] == 'n' || data[1] == 'r' || data[1] == 't') {
415 ++data;
417 } else if (data[1] == 'u') {
418 data += 2;
419 for (char* end = data + 4; data != end; ++data) {
420 if (*data == 0 || !isHex(*data)) {
421 *data = 0;
422 return data;
425 --data;
428 *data = 0;
429 return data;
431 } else if (*data == '"') {
432 res = value(string_t{ start, (size_t)(data - start) });
433 return data + 1;
434 } else if (static_cast<unsigned char>(*data) < 0x20) {
436 *data = 0;
437 return data;
440 return data;
443 char* parse_number(char* data, value& res)
445 char* beg = data;
446 if (*data == '-') {
448 data++;
449 if (!isDigit(*data)) {
450 *data = 0;
451 return data;
457 if (*data == '0') {
458 ++data;
460 if (*data == '.') {
461 ++data;
463 } else if (*data == 'e' || *data == 'E') {
464 ++data;
468 for (; *data != 0; data++) {
469 if (isDigit(*data))
471 if (*data == '.') {
472 ++data;
474 } else if (*data == 'e' || *data == 'E') {
475 ++data;
484 if (isDigit(*data)) {
485 ++data;
488 *data = 0;
489 return data;
492 for (; *data != 0; data++) {
493 if (isDigit(*data))
495 if (*data == 'e' || *data == 'E') {
496 ++data;
504 if (*data == '-' || *data == '+') {
505 ++data;
507 if (isDigit(*data)) {
508 ++data;
511 *data = 0;
512 return data;
514 for (; *data != 0; data++) {
515 if (isDigit(*data))
520 if (data != beg) {
521 char* end = data - 1;
523 return data;
525 *data = 0;
526 return data;
529 char* parse_boolean(char* data, value& res)
531 if (*data == 't') {
532 ++data;
535 if (data[i] == 0 || data[i] != rue[i]) {
536 *data = 0;
537 return data;
542 data += sizeof(rue);
543 } else if (*data == 'f') {
544 ++data;
547 if (data[i] == 0 || data[i] != alse[i]) {
548 *data = 0;
549 return data;
553 data += sizeof(alse);
556 *data = 0;
557 return data;
559 return data;
562 char* parse_null(char* data, value& res)
564 if (*data == 'n') {
565 ++data;
568 if (data[i] == 0 || data[i] != ull[i]) {
569 *data = 0;
570 return data;
574 data += sizeof(ull);
577 *data = 0;
578 return data;
580 return data;
583 char* parse_value(char* data, value& value)
585 data = trim(data);
586 if (*data == '{') {
587 data = trim(parse_object(data + 1, value));
588 } else if (*data == '[') {
589 data = trim(parse_array(data + 1, value));
590 } else if (*data == '"') {
591 data = trim(parse_string(data + 1, value));
592 } else if (isSign(*data) || isDigit(*data)) {
593 data = trim(parse_number(data, value));
594 } else if ((*data == 't') || (*data == 'f')) {
595 data = trim(parse_boolean(data, value));
596 } else if (*data == 'n') {
597 data = trim(parse_null(data, value));
600 *data = 0;
601 return data;
603 return data;
627 value parse(char* data)
634 while (*data) {
635 data = trim(data);
636 if (*data == '{') {
641 data = trim(data + 1);
642 if (*data == '}') {
643 data = trim(data + 1);
647 } else if (*data == '"') {
650 data = trim(parse_string(data + 1, key));
652 if (*data != ':') {
656 data = trim(data + 1);
665 } else if (*data == '}') {
675 data = trim(data + 1);
685 } else if (*data == '[') {
690 data = trim(data + 1);
691 if (*data == ']') {
692 data = trim(data + 1);
701 } else if (*data == ']') {
712 data = trim(data + 1);
722 } else if (*data == ',') {
726 data = trim(data + 1);
727 if (*data != '"') {
733 data = trim(parse_string(data + 1, key));
735 if (*data != ':') {
739 data = trim(data + 1);
743 data = trim(data + 1);
749 } else if (*data == '"') {
751 data = trim(parse_string(data + 1, value));
759 } else if (isSign(*data) || isDigit(*data)) {
761 data = trim(parse_number(data, value));
769 } else if ((*data == 't') || (*data == 'f')) {
771 data = trim(parse_boolean(data, value));
779 } else if (*data == 'n') {
781 data = trim(parse_null(data, value));
820 out.append(v.key.data(), v.key.size());
844 out.append(value.string_.data(), value.string_.size());
859 out += std::to_string(value.number_).data();