| 616 | } |
| 617 | |
| 618 | void putString(char32_t const* s, size_t len) { |
| 619 | startValue(); |
| 620 | |
| 621 | write('"'); |
| 622 | char32_t c = *s; |
| 623 | while (len > 0) { |
| 624 | if (!isPrintable(c)) { |
| 625 | switch (c) { |
| 626 | case '"': |
| 627 | write('\\'); |
| 628 | write('"'); |
| 629 | break; |
| 630 | case '\\': |
| 631 | write('\\'); |
| 632 | write('\\'); |
| 633 | break; |
| 634 | case '\b': |
| 635 | write('\\'); |
| 636 | write('b'); |
| 637 | break; |
| 638 | case '\f': |
| 639 | write('\\'); |
| 640 | write('f'); |
| 641 | break; |
| 642 | case '\n': |
| 643 | write('\\'); |
| 644 | write('n'); |
| 645 | break; |
| 646 | case '\r': |
| 647 | write('\\'); |
| 648 | write('r'); |
| 649 | break; |
| 650 | case '\t': |
| 651 | write('\\'); |
| 652 | write('t'); |
| 653 | break; |
| 654 | default: |
| 655 | auto hex = hexStringFromUtf32(c); |
| 656 | if (hex.size() == 4) { |
| 657 | write('\\'); |
| 658 | write('u'); |
| 659 | for (auto c : hex) { |
| 660 | write(c); |
| 661 | } |
| 662 | } else if (hex.size() == 8) { |
| 663 | write('\\'); |
| 664 | write('u'); |
| 665 | for (auto c : hex.substr(0, 4)) { |
| 666 | write(c); |
| 667 | } |
| 668 | write('\\'); |
| 669 | write('u'); |
| 670 | for (auto c : hex.substr(4)) { |
| 671 | write(c); |
| 672 | } |
| 673 | } else { |
| 674 | throw UnicodeException("Internal Error: Received invalid unicode hex from hexStringFromUtf32."); |
| 675 | } |