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 649 ls_number,
650 650 ls_number_minus,
651 651 ls_number_leading_zero,
  652 + ls_number_before_point,
652 653 ls_alpha,
653 654 ls_string,
654 655 ls_backslash,
... ... @@ -820,7 +821,7 @@ JSONParser::numberError()
820 821 "JSON: offset " + std::to_string(offset) +
821 822 ": numeric literal: e already seen");
822 823 } else if ((*p == '+') || (*p == '-')) {
823   - // QTC::TC("libtests", "JSON parse unexpected sign");
  824 + QTC::TC("libtests", "JSON parse unexpected sign");
824 825 throw std::runtime_error(
825 826 "JSON: offset " + std::to_string(offset) +
826 827 ": numeric literal: unexpected sign");
... ... @@ -870,7 +871,7 @@ JSONParser::getToken()
870 871 number_saw_point = false;
871 872 number_saw_e = false;
872 873 } else if ((*p >= '1') && (*p <= '9')) {
873   - lex_state = ls_number;
  874 + lex_state = ls_number_before_point;
874 875 number_before_point = 1;
875 876 number_after_point = 0;
876 877 number_after_e = 0;
... ... @@ -903,7 +904,7 @@ JSONParser::getToken()
903 904 case ls_number_minus:
904 905 if ((*p >= '1') && (*p <= '9')) {
905 906 ++number_before_point;
906   - lex_state = ls_number;
  907 + lex_state = ls_number_before_point;
907 908 } else if (*p == '0') {
908 909 ++number_before_point;
909 910 lex_state = ls_number_leading_zero;
... ... @@ -934,6 +935,26 @@ JSONParser::getToken()
934 935 }
935 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 958 case ls_number:
938 959 if ((*p >= '0') && (*p <= '9')) {
939 960 if (number_saw_e) {
... ... @@ -970,7 +991,6 @@ JSONParser::getToken()
970 991 if (number_saw_e && (number_after_e == 0)) {
971 992 // okay
972 993 } else {
973   - QTC::TC("libtests", "JSON parse unexpected sign");
974 994 throw std::runtime_error(
975 995 "JSON: offset " + std::to_string(offset) +
976 996 ": numeric literal: unexpected sign");
... ... @@ -1062,6 +1082,7 @@ JSONParser::getToken()
1062 1082 throw std::logic_error("tok_start set in ls_top while parsing");
1063 1083 break;
1064 1084  
  1085 + case ls_number_before_point:
1065 1086 case ls_number:
1066 1087 case ls_number_minus:
1067 1088 case ls_number_leading_zero:
... ... @@ -1137,6 +1158,7 @@ JSONParser::handleToken()
1137 1158 }
1138 1159 break;
1139 1160  
  1161 + case ls_number_before_point:
1140 1162 case ls_number:
1141 1163 case ls_number_minus:
1142 1164 case ls_number_leading_zero:
... ...