Commit 04333bbc201963a8e716c5949bad071ea6c1a2fe

Authored by m-holger
1 parent 972ebca5

In JSONParser add lex_state ls_number_e

Also, allow 'E' as alternative to 'e'.
Showing 1 changed file with 25 additions and 10 deletions
libqpdf/JSON.cc
@@ -652,6 +652,7 @@ namespace @@ -652,6 +652,7 @@ namespace
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_number_after_point,
  655 + ls_number_e,
655 ls_alpha, 656 ls_alpha,
656 ls_string, 657 ls_string,
657 ls_backslash, 658 ls_backslash,
@@ -817,7 +818,7 @@ JSONParser::numberError() @@ -817,7 +818,7 @@ JSONParser::numberError()
817 "JSON: offset " + std::to_string(offset) + 818 "JSON: offset " + std::to_string(offset) +
818 ": numeric literal: decimal point already seen"); 819 ": numeric literal: decimal point already seen");
819 } 820 }
820 - } else if (*p == 'e') { 821 + } else if (*p == 'e' || *p == 'E') {
821 // QTC::TC("libtests", "JSON parse duplicate e"); 822 // QTC::TC("libtests", "JSON parse duplicate e");
822 throw std::runtime_error( 823 throw std::runtime_error(
823 "JSON: offset " + std::to_string(offset) + 824 "JSON: offset " + std::to_string(offset) +
@@ -919,14 +920,15 @@ JSONParser::getToken() @@ -919,14 +920,15 @@ JSONParser::getToken()
919 case ls_number_leading_zero: 920 case ls_number_leading_zero:
920 if (*p == '.') { 921 if (*p == '.') {
921 lex_state = ls_number_point; 922 lex_state = ls_number_point;
922 - } else if (*p == 'e') {  
923 - lex_state = ls_number;  
924 } else if (QUtil::is_space(*p)) { 923 } else if (QUtil::is_space(*p)) {
925 action = ignore; 924 action = ignore;
926 ready = true; 925 ready = true;
927 } else if (strchr("{}[]:,", *p)) { 926 } else if (strchr("{}[]:,", *p)) {
928 action = reread; 927 action = reread;
929 ready = true; 928 ready = true;
  929 + } else if (*p == 'e' || *p == 'E') {
  930 + number_saw_e = true;
  931 + lex_state = ls_number_e;
930 } else { 932 } else {
931 QTC::TC("libtests", "JSON parse leading zero"); 933 QTC::TC("libtests", "JSON parse leading zero");
932 throw std::runtime_error( 934 throw std::runtime_error(
@@ -941,15 +943,15 @@ JSONParser::getToken() @@ -941,15 +943,15 @@ JSONParser::getToken()
941 } else if (*p == '.') { 943 } else if (*p == '.') {
942 number_saw_point = true; 944 number_saw_point = true;
943 lex_state = ls_number_point; 945 lex_state = ls_number_point;
944 - } else if (*p == 'e') {  
945 - number_saw_e = true;  
946 - lex_state = ls_number;  
947 } else if (QUtil::is_space(*p)) { 946 } else if (QUtil::is_space(*p)) {
948 action = ignore; 947 action = ignore;
949 ready = true; 948 ready = true;
950 } else if (strchr("{}[]:,", *p)) { 949 } else if (strchr("{}[]:,", *p)) {
951 action = reread; 950 action = reread;
952 ready = true; 951 ready = true;
  952 + } else if (*p == 'e' || *p == 'E') {
  953 + number_saw_e = true;
  954 + lex_state = ls_number_e;
953 } else { 955 } else {
954 numberError(); 956 numberError();
955 } 957 }
@@ -967,15 +969,26 @@ JSONParser::getToken() @@ -967,15 +969,26 @@ JSONParser::getToken()
967 case ls_number_after_point: 969 case ls_number_after_point:
968 if ((*p >= '0') && (*p <= '9')) { 970 if ((*p >= '0') && (*p <= '9')) {
969 ++number_after_point; 971 ++number_after_point;
970 - } else if (*p == 'e') {  
971 - number_saw_e = true;  
972 - lex_state = ls_number;  
973 } else if (QUtil::is_space(*p)) { 972 } else if (QUtil::is_space(*p)) {
974 action = ignore; 973 action = ignore;
975 ready = true; 974 ready = true;
976 } else if (strchr("{}[]:,", *p)) { 975 } else if (strchr("{}[]:,", *p)) {
977 action = reread; 976 action = reread;
978 ready = true; 977 ready = true;
  978 + } else if (*p == 'e' || *p == 'E') {
  979 + number_saw_e = true;
  980 + lex_state = ls_number_e;
  981 + } else {
  982 + numberError();
  983 + }
  984 + break;
  985 +
  986 + case ls_number_e:
  987 + if ((*p >= '0') && (*p <= '9')) {
  988 + ++number_after_e;
  989 + lex_state = ls_number;
  990 + } else if ((*p == '+') || (*p == '-')) {
  991 + lex_state = ls_number;
979 } else { 992 } else {
980 numberError(); 993 numberError();
981 } 994 }
@@ -1003,7 +1016,7 @@ JSONParser::getToken() @@ -1003,7 +1016,7 @@ JSONParser::getToken()
1003 } else { 1016 } else {
1004 number_saw_point = true; 1017 number_saw_point = true;
1005 } 1018 }
1006 - } else if (*p == 'e') { 1019 + } else if (*p == 'e' || *p == 'E') {
1007 if (number_saw_e) { 1020 if (number_saw_e) {
1008 QTC::TC("libtests", "JSON parse duplicate e"); 1021 QTC::TC("libtests", "JSON parse duplicate e");
1009 throw std::runtime_error( 1022 throw std::runtime_error(
@@ -1110,6 +1123,7 @@ JSONParser::getToken() @@ -1110,6 +1123,7 @@ JSONParser::getToken()
1110 case ls_number_before_point: 1123 case ls_number_before_point:
1111 case ls_number_point: 1124 case ls_number_point:
1112 case ls_number_after_point: 1125 case ls_number_after_point:
  1126 + case ls_number_e:
1113 case ls_number: 1127 case ls_number:
1114 case ls_number_minus: 1128 case ls_number_minus:
1115 case ls_number_leading_zero: 1129 case ls_number_leading_zero:
@@ -1191,6 +1205,7 @@ JSONParser::handleToken() @@ -1191,6 +1205,7 @@ JSONParser::handleToken()
1191 case ls_number_before_point: 1205 case ls_number_before_point:
1192 case ls_number_point: 1206 case ls_number_point:
1193 case ls_number_after_point: 1207 case ls_number_after_point:
  1208 + case ls_number_e:
1194 if (number_saw_point && (number_after_point == 0)) { 1209 if (number_saw_point && (number_after_point == 0)) {
1195 // QTC::TC("libtests", "JSON parse decimal with no digits"); 1210 // QTC::TC("libtests", "JSON parse decimal with no digits");
1196 throw std::runtime_error( 1211 throw std::runtime_error(