(StringBuilder builder)
| 601 | */ |
| 602 | // FIXME: This function doesn't appear to support UTF-8 or UTF-32. |
| 603 | private void readEscape(StringBuilder builder) { |
| 604 | char read = input.read(); |
| 605 | |
| 606 | // List from: https://tools.ietf.org/html/rfc7159.html#section-7 |
| 607 | switch (read) { |
| 608 | case 'b': |
| 609 | builder.append("\b"); |
| 610 | break; |
| 611 | |
| 612 | case 'f': |
| 613 | builder.append("\f"); |
| 614 | break; |
| 615 | |
| 616 | case 'n': |
| 617 | builder.append("\n"); |
| 618 | break; |
| 619 | |
| 620 | case 'r': |
| 621 | builder.append("\r"); |
| 622 | break; |
| 623 | |
| 624 | case 't': |
| 625 | builder.append("\t"); |
| 626 | break; |
| 627 | |
| 628 | case 'u': // Unicode digit. The next four characters count. |
| 629 | int result = 0; |
| 630 | int multiplier = 4096; // (16 * 16 * 16) as we start from the thousands and work to units. |
| 631 | for (int i = 0; i < 4; i++) { |
| 632 | char c = input.read(); |
| 633 | int digit = Character.digit(c, 16); |
| 634 | if (digit == -1) { |
| 635 | throw new JsonException(c + " is not a hexadecimal digit. " + input); |
| 636 | } |
| 637 | result += digit * multiplier; |
| 638 | multiplier /= 16; |
| 639 | } |
| 640 | builder.append((char) result); |
| 641 | break; |
| 642 | |
| 643 | case '/': |
| 644 | case '\\': |
| 645 | case '"': |
| 646 | builder.append(read); |
| 647 | break; |
| 648 | |
| 649 | default: |
| 650 | throw new JsonException("Unexpected escape code: " + read + ". " + input); |
| 651 | } |
| 652 | } |
| 653 | |
| 654 | /** |
| 655 | * Consume whitespace characters from the head of the specified input object. |
no test coverage detected