| 529 | } |
| 530 | |
| 531 | static JSON parse_string( const std::string &str, size_t &offset ) { |
| 532 | std::string val; |
| 533 | for( char c = str.at(++offset); c != '\"' ; c = str.at(++offset) ) { |
| 534 | if( c == '\\' ) { |
| 535 | switch( str.at(++offset) ) { |
| 536 | case '\"': val += '\"'; break; |
| 537 | case '\\': val += '\\'; break; |
| 538 | case '/' : val += '/' ; break; |
| 539 | case 'b' : val += '\b'; break; |
| 540 | case 'f' : val += '\f'; break; |
| 541 | case 'n' : val += '\n'; break; |
| 542 | case 'r' : val += '\r'; break; |
| 543 | case 't' : val += '\t'; break; |
| 544 | case 'u' : { |
| 545 | val += "\\u" ; |
| 546 | for( size_t i = 1; i <= 4; ++i ) { |
| 547 | c = str.at(offset+i); |
| 548 | if( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') ) { |
| 549 | val += c; |
| 550 | } else { |
| 551 | throw std::runtime_error(std::string("JSON ERROR: String: Expected hex character in unicode escape, found '") + c + "'"); |
| 552 | } |
| 553 | } |
| 554 | offset += 4; |
| 555 | } break; |
| 556 | default : val += '\\'; break; |
| 557 | } |
| 558 | } else { |
| 559 | val += c; |
| 560 | } |
| 561 | } |
| 562 | ++offset; |
| 563 | return JSON(val); |
| 564 | } |
| 565 | |
| 566 | static JSON parse_number( const std::string &str, size_t &offset ) { |
| 567 | std::string val, exp_str; |