Commit 04333bbc201963a8e716c5949bad071ea6c1a2fe
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( |