Commit b6b4d3b299490966524ee5a1a8ecc03c267af0c8

Authored by m-holger
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