Commit bfda62aeeb72355b5e8b6fbcdc94c50afaa366ab
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: | ... | ... |