Commit 8fd6e1c5b24d0fc804c25004f398b39b5041b034
1 parent
6ea543e6
Refactor handling of ls_number in JSONParser::getToken
Reflect that the ls_number case only handles the digits after an 'e'. Also, change state to ls_number for all 'ready' numbers.
Showing
1 changed file
with
9 additions
and
38 deletions
libqpdf/JSON.cc
| @@ -809,7 +809,7 @@ JSONParser::numberError() | @@ -809,7 +809,7 @@ JSONParser::numberError() | ||
| 809 | { | 809 | { |
| 810 | if (*p == '.') { | 810 | if (*p == '.') { |
| 811 | if (number_saw_e) { | 811 | if (number_saw_e) { |
| 812 | - // QTC::TC("libtests", "JSON parse point after e"); | 812 | + QTC::TC("libtests", "JSON parse point after e"); |
| 813 | throw std::runtime_error( | 813 | throw std::runtime_error( |
| 814 | "JSON: offset " + std::to_string(offset) + | 814 | "JSON: offset " + std::to_string(offset) + |
| 815 | ": numeric literal: decimal point after e"); | 815 | ": numeric literal: decimal point after e"); |
| @@ -820,7 +820,7 @@ JSONParser::numberError() | @@ -820,7 +820,7 @@ JSONParser::numberError() | ||
| 820 | ": numeric literal: decimal point already seen"); | 820 | ": numeric literal: decimal point already seen"); |
| 821 | } | 821 | } |
| 822 | } else if (*p == 'e' || *p == 'E') { | 822 | } else if (*p == 'e' || *p == 'E') { |
| 823 | - // QTC::TC("libtests", "JSON parse duplicate e"); | 823 | + QTC::TC("libtests", "JSON parse duplicate e"); |
| 824 | throw std::runtime_error( | 824 | throw std::runtime_error( |
| 825 | "JSON: offset " + std::to_string(offset) + | 825 | "JSON: offset " + std::to_string(offset) + |
| 826 | ": numeric literal: e already seen"); | 826 | ": numeric literal: e already seen"); |
| @@ -922,9 +922,11 @@ JSONParser::getToken() | @@ -922,9 +922,11 @@ JSONParser::getToken() | ||
| 922 | if (*p == '.') { | 922 | if (*p == '.') { |
| 923 | lex_state = ls_number_point; | 923 | lex_state = ls_number_point; |
| 924 | } else if (QUtil::is_space(*p)) { | 924 | } else if (QUtil::is_space(*p)) { |
| 925 | + lex_state = ls_number; | ||
| 925 | action = ignore; | 926 | action = ignore; |
| 926 | ready = true; | 927 | ready = true; |
| 927 | } else if (strchr("{}[]:,", *p)) { | 928 | } else if (strchr("{}[]:,", *p)) { |
| 929 | + lex_state = ls_number; | ||
| 928 | action = reread; | 930 | action = reread; |
| 929 | ready = true; | 931 | ready = true; |
| 930 | } else if (*p == 'e' || *p == 'E') { | 932 | } else if (*p == 'e' || *p == 'E') { |
| @@ -945,9 +947,11 @@ JSONParser::getToken() | @@ -945,9 +947,11 @@ JSONParser::getToken() | ||
| 945 | number_saw_point = true; | 947 | number_saw_point = true; |
| 946 | lex_state = ls_number_point; | 948 | lex_state = ls_number_point; |
| 947 | } else if (QUtil::is_space(*p)) { | 949 | } else if (QUtil::is_space(*p)) { |
| 950 | + lex_state = ls_number; | ||
| 948 | action = ignore; | 951 | action = ignore; |
| 949 | ready = true; | 952 | ready = true; |
| 950 | } else if (strchr("{}[]:,", *p)) { | 953 | } else if (strchr("{}[]:,", *p)) { |
| 954 | + lex_state = ls_number; | ||
| 951 | action = reread; | 955 | action = reread; |
| 952 | ready = true; | 956 | ready = true; |
| 953 | } else if (*p == 'e' || *p == 'E') { | 957 | } else if (*p == 'e' || *p == 'E') { |
| @@ -971,9 +975,11 @@ JSONParser::getToken() | @@ -971,9 +975,11 @@ JSONParser::getToken() | ||
| 971 | if ((*p >= '0') && (*p <= '9')) { | 975 | if ((*p >= '0') && (*p <= '9')) { |
| 972 | ++number_after_point; | 976 | ++number_after_point; |
| 973 | } else if (QUtil::is_space(*p)) { | 977 | } else if (QUtil::is_space(*p)) { |
| 978 | + lex_state = ls_number; | ||
| 974 | action = ignore; | 979 | action = ignore; |
| 975 | ready = true; | 980 | ready = true; |
| 976 | } else if (strchr("{}[]:,", *p)) { | 981 | } else if (strchr("{}[]:,", *p)) { |
| 982 | + lex_state = ls_number; | ||
| 977 | action = reread; | 983 | action = reread; |
| 978 | ready = true; | 984 | ready = true; |
| 979 | } else if (*p == 'e' || *p == 'E') { | 985 | } else if (*p == 'e' || *p == 'E') { |
| @@ -1004,44 +1010,9 @@ JSONParser::getToken() | @@ -1004,44 +1010,9 @@ JSONParser::getToken() | ||
| 1004 | break; | 1010 | break; |
| 1005 | 1011 | ||
| 1006 | case ls_number: | 1012 | case ls_number: |
| 1013 | + // We only get here after we have seen an exponent. | ||
| 1007 | if ((*p >= '0') && (*p <= '9')) { | 1014 | if ((*p >= '0') && (*p <= '9')) { |
| 1008 | - if (number_saw_e) { | ||
| 1009 | ++number_after_e; | 1015 | ++number_after_e; |
| 1010 | - } else if (number_saw_point) { | ||
| 1011 | - ++number_after_point; | ||
| 1012 | - } else { | ||
| 1013 | - ++number_before_point; | ||
| 1014 | - } | ||
| 1015 | - } else if (*p == '.') { | ||
| 1016 | - if (number_saw_e) { | ||
| 1017 | - QTC::TC("libtests", "JSON parse point after e"); | ||
| 1018 | - throw std::runtime_error( | ||
| 1019 | - "JSON: offset " + std::to_string(offset) + | ||
| 1020 | - ": numeric literal: decimal point after e"); | ||
| 1021 | - } else if (number_saw_point) { | ||
| 1022 | - throw std::runtime_error( | ||
| 1023 | - "JSON: offset " + std::to_string(offset) + | ||
| 1024 | - ": numeric literal: decimal point already seen"); | ||
| 1025 | - } else { | ||
| 1026 | - number_saw_point = true; | ||
| 1027 | - } | ||
| 1028 | - } else if (*p == 'e' || *p == 'E') { | ||
| 1029 | - if (number_saw_e) { | ||
| 1030 | - QTC::TC("libtests", "JSON parse duplicate e"); | ||
| 1031 | - throw std::runtime_error( | ||
| 1032 | - "JSON: offset " + std::to_string(offset) + | ||
| 1033 | - ": numeric literal: e already seen"); | ||
| 1034 | - } else { | ||
| 1035 | - number_saw_e = true; | ||
| 1036 | - } | ||
| 1037 | - } else if ((*p == '+') || (*p == '-')) { | ||
| 1038 | - if (number_saw_e && (number_after_e == 0)) { | ||
| 1039 | - // okay | ||
| 1040 | - } else { | ||
| 1041 | - throw std::runtime_error( | ||
| 1042 | - "JSON: offset " + std::to_string(offset) + | ||
| 1043 | - ": numeric literal: unexpected sign"); | ||
| 1044 | - } | ||
| 1045 | } else if (QUtil::is_space(*p)) { | 1016 | } else if (QUtil::is_space(*p)) { |
| 1046 | action = ignore; | 1017 | action = ignore; |
| 1047 | ready = true; | 1018 | ready = true; |