Commit bfda62aeeb72355b5e8b6fbcdc94c50afaa366ab

Authored by m-holger
1 parent 08e76890

In JSONParser add lex_state ls_number_before_point

Showing 1 changed file with 26 additions and 4 deletions
libqpdf/JSON.cc
@@ -649,6 +649,7 @@ namespace @@ -649,6 +649,7 @@ namespace
649 ls_number, 649 ls_number,
650 ls_number_minus, 650 ls_number_minus,
651 ls_number_leading_zero, 651 ls_number_leading_zero,
  652 + ls_number_before_point,
652 ls_alpha, 653 ls_alpha,
653 ls_string, 654 ls_string,
654 ls_backslash, 655 ls_backslash,
@@ -820,7 +821,7 @@ JSONParser::numberError() @@ -820,7 +821,7 @@ JSONParser::numberError()
820 "JSON: offset " + std::to_string(offset) + 821 "JSON: offset " + std::to_string(offset) +
821 ": numeric literal: e already seen"); 822 ": numeric literal: e already seen");
822 } else if ((*p == '+') || (*p == '-')) { 823 } else if ((*p == '+') || (*p == '-')) {
823 - // QTC::TC("libtests", "JSON parse unexpected sign"); 824 + QTC::TC("libtests", "JSON parse unexpected sign");
824 throw std::runtime_error( 825 throw std::runtime_error(
825 "JSON: offset " + std::to_string(offset) + 826 "JSON: offset " + std::to_string(offset) +
826 ": numeric literal: unexpected sign"); 827 ": numeric literal: unexpected sign");
@@ -870,7 +871,7 @@ JSONParser::getToken() @@ -870,7 +871,7 @@ JSONParser::getToken()
870 number_saw_point = false; 871 number_saw_point = false;
871 number_saw_e = false; 872 number_saw_e = false;
872 } else if ((*p >= '1') && (*p <= '9')) { 873 } else if ((*p >= '1') && (*p <= '9')) {
873 - lex_state = ls_number; 874 + lex_state = ls_number_before_point;
874 number_before_point = 1; 875 number_before_point = 1;
875 number_after_point = 0; 876 number_after_point = 0;
876 number_after_e = 0; 877 number_after_e = 0;
@@ -903,7 +904,7 @@ JSONParser::getToken() @@ -903,7 +904,7 @@ JSONParser::getToken()
903 case ls_number_minus: 904 case ls_number_minus:
904 if ((*p >= '1') && (*p <= '9')) { 905 if ((*p >= '1') && (*p <= '9')) {
905 ++number_before_point; 906 ++number_before_point;
906 - lex_state = ls_number; 907 + lex_state = ls_number_before_point;
907 } else if (*p == '0') { 908 } else if (*p == '0') {
908 ++number_before_point; 909 ++number_before_point;
909 lex_state = ls_number_leading_zero; 910 lex_state = ls_number_leading_zero;
@@ -934,6 +935,26 @@ JSONParser::getToken() @@ -934,6 +935,26 @@ JSONParser::getToken()
934 } 935 }
935 break; 936 break;
936 937
  938 + case ls_number_before_point:
  939 + if ((*p >= '0') && (*p <= '9')) {
  940 + ++number_before_point;
  941 + } else if (*p == '.') {
  942 + number_saw_point = true;
  943 + lex_state = ls_number;
  944 + } else if (*p == 'e') {
  945 + number_saw_e = true;
  946 + lex_state = ls_number;
  947 + } else if (QUtil::is_space(*p)) {
  948 + action = ignore;
  949 + ready = true;
  950 + } else if (strchr("{}[]:,", *p)) {
  951 + action = reread;
  952 + ready = true;
  953 + } else {
  954 + numberError();
  955 + }
  956 + break;
  957 +
937 case ls_number: 958 case ls_number:
938 if ((*p >= '0') && (*p <= '9')) { 959 if ((*p >= '0') && (*p <= '9')) {
939 if (number_saw_e) { 960 if (number_saw_e) {
@@ -970,7 +991,6 @@ JSONParser::getToken() @@ -970,7 +991,6 @@ JSONParser::getToken()
970 if (number_saw_e && (number_after_e == 0)) { 991 if (number_saw_e && (number_after_e == 0)) {
971 // okay 992 // okay
972 } else { 993 } else {
973 - QTC::TC("libtests", "JSON parse unexpected sign");  
974 throw std::runtime_error( 994 throw std::runtime_error(
975 "JSON: offset " + std::to_string(offset) + 995 "JSON: offset " + std::to_string(offset) +
976 ": numeric literal: unexpected sign"); 996 ": numeric literal: unexpected sign");
@@ -1062,6 +1082,7 @@ JSONParser::getToken() @@ -1062,6 +1082,7 @@ JSONParser::getToken()
1062 throw std::logic_error("tok_start set in ls_top while parsing"); 1082 throw std::logic_error("tok_start set in ls_top while parsing");
1063 break; 1083 break;
1064 1084
  1085 + case ls_number_before_point:
1065 case ls_number: 1086 case ls_number:
1066 case ls_number_minus: 1087 case ls_number_minus:
1067 case ls_number_leading_zero: 1088 case ls_number_leading_zero:
@@ -1137,6 +1158,7 @@ JSONParser::handleToken() @@ -1137,6 +1158,7 @@ JSONParser::handleToken()
1137 } 1158 }
1138 break; 1159 break;
1139 1160
  1161 + case ls_number_before_point:
1140 case ls_number: 1162 case ls_number:
1141 case ls_number_minus: 1163 case ls_number_minus:
1142 case ls_number_leading_zero: 1164 case ls_number_leading_zero: