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 | 809 | { |
| 810 | 810 | if (*p == '.') { |
| 811 | 811 | if (number_saw_e) { |
| 812 | - // QTC::TC("libtests", "JSON parse point after e"); | |
| 812 | + QTC::TC("libtests", "JSON parse point after e"); | |
| 813 | 813 | throw std::runtime_error( |
| 814 | 814 | "JSON: offset " + std::to_string(offset) + |
| 815 | 815 | ": numeric literal: decimal point after e"); |
| ... | ... | @@ -820,7 +820,7 @@ JSONParser::numberError() |
| 820 | 820 | ": numeric literal: decimal point already seen"); |
| 821 | 821 | } |
| 822 | 822 | } else if (*p == 'e' || *p == 'E') { |
| 823 | - // QTC::TC("libtests", "JSON parse duplicate e"); | |
| 823 | + QTC::TC("libtests", "JSON parse duplicate e"); | |
| 824 | 824 | throw std::runtime_error( |
| 825 | 825 | "JSON: offset " + std::to_string(offset) + |
| 826 | 826 | ": numeric literal: e already seen"); |
| ... | ... | @@ -922,9 +922,11 @@ JSONParser::getToken() |
| 922 | 922 | if (*p == '.') { |
| 923 | 923 | lex_state = ls_number_point; |
| 924 | 924 | } else if (QUtil::is_space(*p)) { |
| 925 | + lex_state = ls_number; | |
| 925 | 926 | action = ignore; |
| 926 | 927 | ready = true; |
| 927 | 928 | } else if (strchr("{}[]:,", *p)) { |
| 929 | + lex_state = ls_number; | |
| 928 | 930 | action = reread; |
| 929 | 931 | ready = true; |
| 930 | 932 | } else if (*p == 'e' || *p == 'E') { |
| ... | ... | @@ -945,9 +947,11 @@ JSONParser::getToken() |
| 945 | 947 | number_saw_point = true; |
| 946 | 948 | lex_state = ls_number_point; |
| 947 | 949 | } else if (QUtil::is_space(*p)) { |
| 950 | + lex_state = ls_number; | |
| 948 | 951 | action = ignore; |
| 949 | 952 | ready = true; |
| 950 | 953 | } else if (strchr("{}[]:,", *p)) { |
| 954 | + lex_state = ls_number; | |
| 951 | 955 | action = reread; |
| 952 | 956 | ready = true; |
| 953 | 957 | } else if (*p == 'e' || *p == 'E') { |
| ... | ... | @@ -971,9 +975,11 @@ JSONParser::getToken() |
| 971 | 975 | if ((*p >= '0') && (*p <= '9')) { |
| 972 | 976 | ++number_after_point; |
| 973 | 977 | } else if (QUtil::is_space(*p)) { |
| 978 | + lex_state = ls_number; | |
| 974 | 979 | action = ignore; |
| 975 | 980 | ready = true; |
| 976 | 981 | } else if (strchr("{}[]:,", *p)) { |
| 982 | + lex_state = ls_number; | |
| 977 | 983 | action = reread; |
| 978 | 984 | ready = true; |
| 979 | 985 | } else if (*p == 'e' || *p == 'E') { |
| ... | ... | @@ -1004,44 +1010,9 @@ JSONParser::getToken() |
| 1004 | 1010 | break; |
| 1005 | 1011 | |
| 1006 | 1012 | case ls_number: |
| 1013 | + // We only get here after we have seen an exponent. | |
| 1007 | 1014 | if ((*p >= '0') && (*p <= '9')) { |
| 1008 | - if (number_saw_e) { | |
| 1009 | 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 | 1016 | } else if (QUtil::is_space(*p)) { |
| 1046 | 1017 | action = ignore; |
| 1047 | 1018 | ready = true; | ... | ... |