Commit b6b4d3b299490966524ee5a1a8ecc03c267af0c8
1 parent
1787d850
Add new method JSONParser::numberError
Showing
1 changed file
with
35 additions
and
5 deletions
libqpdf/JSON.cc
| @@ -620,6 +620,7 @@ namespace | @@ -620,6 +620,7 @@ namespace | ||
| 620 | private: | 620 | private: |
| 621 | void getToken(); | 621 | void getToken(); |
| 622 | void handleToken(); | 622 | void handleToken(); |
| 623 | + void numberError(); | ||
| 623 | static std::string | 624 | static std::string |
| 624 | decode_string(std::string const& json, qpdf_offset_t offset); | 625 | decode_string(std::string const& json, qpdf_offset_t offset); |
| 625 | static void handle_u_code( | 626 | static void handle_u_code( |
| @@ -797,6 +798,39 @@ JSONParser::decode_string(std::string const& str, qpdf_offset_t offset) | @@ -797,6 +798,39 @@ JSONParser::decode_string(std::string const& str, qpdf_offset_t offset) | ||
| 797 | } | 798 | } |
| 798 | 799 | ||
| 799 | void | 800 | void |
| 801 | +JSONParser::numberError() | ||
| 802 | +{ | ||
| 803 | + if (*p == '.') { | ||
| 804 | + if (number_saw_e) { | ||
| 805 | + // QTC::TC("libtests", "JSON parse point after e"); | ||
| 806 | + throw std::runtime_error( | ||
| 807 | + "JSON: offset " + std::to_string(offset) + | ||
| 808 | + ": numeric literal: decimal point after e"); | ||
| 809 | + } else { | ||
| 810 | + // QTC::TC("libtests", "JSON parse duplicate point"); | ||
| 811 | + throw std::runtime_error( | ||
| 812 | + "JSON: offset " + std::to_string(offset) + | ||
| 813 | + ": numeric literal: decimal point already seen"); | ||
| 814 | + } | ||
| 815 | + } else if (*p == 'e') { | ||
| 816 | + // QTC::TC("libtests", "JSON parse duplicate e"); | ||
| 817 | + throw std::runtime_error( | ||
| 818 | + "JSON: offset " + std::to_string(offset) + | ||
| 819 | + ": numeric literal: e already seen"); | ||
| 820 | + } else if ((*p == '+') || (*p == '-')) { | ||
| 821 | + // QTC::TC("libtests", "JSON parse unexpected sign"); | ||
| 822 | + throw std::runtime_error( | ||
| 823 | + "JSON: offset " + std::to_string(offset) + | ||
| 824 | + ": numeric literal: unexpected sign"); | ||
| 825 | + } else { | ||
| 826 | + QTC::TC("libtests", "JSON parse numeric bad character"); | ||
| 827 | + throw std::runtime_error( | ||
| 828 | + "JSON: offset " + std::to_string(offset) + | ||
| 829 | + ": numeric literal: unexpected character " + std::string(p, 1)); | ||
| 830 | + } | ||
| 831 | +} | ||
| 832 | + | ||
| 833 | +void | ||
| 800 | JSONParser::getToken() | 834 | JSONParser::getToken() |
| 801 | { | 835 | { |
| 802 | enum { append, ignore, reread } action = append; | 836 | enum { append, ignore, reread } action = append; |
| @@ -905,11 +939,7 @@ JSONParser::getToken() | @@ -905,11 +939,7 @@ JSONParser::getToken() | ||
| 905 | action = reread; | 939 | action = reread; |
| 906 | ready = true; | 940 | ready = true; |
| 907 | } else { | 941 | } else { |
| 908 | - QTC::TC("libtests", "JSON parse numeric bad character"); | ||
| 909 | - throw std::runtime_error( | ||
| 910 | - "JSON: offset " + std::to_string(offset) + | ||
| 911 | - ": numeric literal: unexpected character " + | ||
| 912 | - std::string(p, 1)); | 942 | + numberError(); |
| 913 | } | 943 | } |
| 914 | break; | 944 | break; |
| 915 | 945 |