Commit 972ebca5055c5077b117c497355f264036fed1ec

Authored by m-holger
1 parent cdd1f0a9

In JSONParser add lex_state ls_number_after_point

Showing 1 changed file with 21 additions and 2 deletions
libqpdf/JSON.cc
@@ -651,6 +651,7 @@ namespace @@ -651,6 +651,7 @@ namespace
651 ls_number_leading_zero, 651 ls_number_leading_zero,
652 ls_number_before_point, 652 ls_number_before_point,
653 ls_number_point, 653 ls_number_point,
  654 + ls_number_after_point,
654 ls_alpha, 655 ls_alpha,
655 ls_string, 656 ls_string,
656 ls_backslash, 657 ls_backslash,
@@ -811,7 +812,7 @@ JSONParser::numberError() @@ -811,7 +812,7 @@ JSONParser::numberError()
811 "JSON: offset " + std::to_string(offset) + 812 "JSON: offset " + std::to_string(offset) +
812 ": numeric literal: decimal point after e"); 813 ": numeric literal: decimal point after e");
813 } else { 814 } else {
814 - // QTC::TC("libtests", "JSON parse duplicate point"); 815 + QTC::TC("libtests", "JSON parse duplicate point");
815 throw std::runtime_error( 816 throw std::runtime_error(
816 "JSON: offset " + std::to_string(offset) + 817 "JSON: offset " + std::to_string(offset) +
817 ": numeric literal: decimal point already seen"); 818 ": numeric literal: decimal point already seen");
@@ -957,7 +958,24 @@ JSONParser::getToken() @@ -957,7 +958,24 @@ JSONParser::getToken()
957 case ls_number_point: 958 case ls_number_point:
958 if ((*p >= '0') && (*p <= '9')) { 959 if ((*p >= '0') && (*p <= '9')) {
959 ++number_after_point; 960 ++number_after_point;
  961 + lex_state = ls_number_after_point;
  962 + } else {
  963 + numberError();
  964 + }
  965 + break;
  966 +
  967 + case ls_number_after_point:
  968 + if ((*p >= '0') && (*p <= '9')) {
  969 + ++number_after_point;
  970 + } else if (*p == 'e') {
  971 + number_saw_e = true;
960 lex_state = ls_number; 972 lex_state = ls_number;
  973 + } else if (QUtil::is_space(*p)) {
  974 + action = ignore;
  975 + ready = true;
  976 + } else if (strchr("{}[]:,", *p)) {
  977 + action = reread;
  978 + ready = true;
961 } else { 979 } else {
962 numberError(); 980 numberError();
963 } 981 }
@@ -979,7 +997,6 @@ JSONParser::getToken() @@ -979,7 +997,6 @@ JSONParser::getToken()
979 "JSON: offset " + std::to_string(offset) + 997 "JSON: offset " + std::to_string(offset) +
980 ": numeric literal: decimal point after e"); 998 ": numeric literal: decimal point after e");
981 } else if (number_saw_point) { 999 } else if (number_saw_point) {
982 - QTC::TC("libtests", "JSON parse duplicate point");  
983 throw std::runtime_error( 1000 throw std::runtime_error(
984 "JSON: offset " + std::to_string(offset) + 1001 "JSON: offset " + std::to_string(offset) +
985 ": numeric literal: decimal point already seen"); 1002 ": numeric literal: decimal point already seen");
@@ -1092,6 +1109,7 @@ JSONParser::getToken() @@ -1092,6 +1109,7 @@ JSONParser::getToken()
1092 1109
1093 case ls_number_before_point: 1110 case ls_number_before_point:
1094 case ls_number_point: 1111 case ls_number_point:
  1112 + case ls_number_after_point:
1095 case ls_number: 1113 case ls_number:
1096 case ls_number_minus: 1114 case ls_number_minus:
1097 case ls_number_leading_zero: 1115 case ls_number_leading_zero:
@@ -1172,6 +1190,7 @@ JSONParser::handleToken() @@ -1172,6 +1190,7 @@ JSONParser::handleToken()
1172 case ls_number_leading_zero: 1190 case ls_number_leading_zero:
1173 case ls_number_before_point: 1191 case ls_number_before_point:
1174 case ls_number_point: 1192 case ls_number_point:
  1193 + case ls_number_after_point:
1175 if (number_saw_point && (number_after_point == 0)) { 1194 if (number_saw_point && (number_after_point == 0)) {
1176 // QTC::TC("libtests", "JSON parse decimal with no digits"); 1195 // QTC::TC("libtests", "JSON parse decimal with no digits");
1177 throw std::runtime_error( 1196 throw std::runtime_error(