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,6 +649,7 @@ namespace | ||
| 649 | ls_number, | 649 | ls_number, |
| 650 | ls_number_minus, | 650 | ls_number_minus, |
| 651 | ls_number_leading_zero, | 651 | ls_number_leading_zero, |
| 652 | + ls_number_before_point, | ||
| 652 | ls_alpha, | 653 | ls_alpha, |
| 653 | ls_string, | 654 | ls_string, |
| 654 | ls_backslash, | 655 | ls_backslash, |
| @@ -820,7 +821,7 @@ JSONParser::numberError() | @@ -820,7 +821,7 @@ JSONParser::numberError() | ||
| 820 | "JSON: offset " + std::to_string(offset) + | 821 | "JSON: offset " + std::to_string(offset) + |
| 821 | ": numeric literal: e already seen"); | 822 | ": numeric literal: e already seen"); |
| 822 | } else if ((*p == '+') || (*p == '-')) { | 823 | } else if ((*p == '+') || (*p == '-')) { |
| 823 | - // QTC::TC("libtests", "JSON parse unexpected sign"); | 824 | + QTC::TC("libtests", "JSON parse unexpected sign"); |
| 824 | throw std::runtime_error( | 825 | throw std::runtime_error( |
| 825 | "JSON: offset " + std::to_string(offset) + | 826 | "JSON: offset " + std::to_string(offset) + |
| 826 | ": numeric literal: unexpected sign"); | 827 | ": numeric literal: unexpected sign"); |
| @@ -870,7 +871,7 @@ JSONParser::getToken() | @@ -870,7 +871,7 @@ JSONParser::getToken() | ||
| 870 | number_saw_point = false; | 871 | number_saw_point = false; |
| 871 | number_saw_e = false; | 872 | number_saw_e = false; |
| 872 | } else if ((*p >= '1') && (*p <= '9')) { | 873 | } else if ((*p >= '1') && (*p <= '9')) { |
| 873 | - lex_state = ls_number; | 874 | + lex_state = ls_number_before_point; |
| 874 | number_before_point = 1; | 875 | number_before_point = 1; |
| 875 | number_after_point = 0; | 876 | number_after_point = 0; |
| 876 | number_after_e = 0; | 877 | number_after_e = 0; |
| @@ -903,7 +904,7 @@ JSONParser::getToken() | @@ -903,7 +904,7 @@ JSONParser::getToken() | ||
| 903 | case ls_number_minus: | 904 | case ls_number_minus: |
| 904 | if ((*p >= '1') && (*p <= '9')) { | 905 | if ((*p >= '1') && (*p <= '9')) { |
| 905 | ++number_before_point; | 906 | ++number_before_point; |
| 906 | - lex_state = ls_number; | 907 | + lex_state = ls_number_before_point; |
| 907 | } else if (*p == '0') { | 908 | } else if (*p == '0') { |
| 908 | ++number_before_point; | 909 | ++number_before_point; |
| 909 | lex_state = ls_number_leading_zero; | 910 | lex_state = ls_number_leading_zero; |
| @@ -934,6 +935,26 @@ JSONParser::getToken() | @@ -934,6 +935,26 @@ JSONParser::getToken() | ||
| 934 | } | 935 | } |
| 935 | break; | 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 | case ls_number: | 958 | case ls_number: |
| 938 | if ((*p >= '0') && (*p <= '9')) { | 959 | if ((*p >= '0') && (*p <= '9')) { |
| 939 | if (number_saw_e) { | 960 | if (number_saw_e) { |
| @@ -970,7 +991,6 @@ JSONParser::getToken() | @@ -970,7 +991,6 @@ JSONParser::getToken() | ||
| 970 | if (number_saw_e && (number_after_e == 0)) { | 991 | if (number_saw_e && (number_after_e == 0)) { |
| 971 | // okay | 992 | // okay |
| 972 | } else { | 993 | } else { |
| 973 | - QTC::TC("libtests", "JSON parse unexpected sign"); | ||
| 974 | throw std::runtime_error( | 994 | throw std::runtime_error( |
| 975 | "JSON: offset " + std::to_string(offset) + | 995 | "JSON: offset " + std::to_string(offset) + |
| 976 | ": numeric literal: unexpected sign"); | 996 | ": numeric literal: unexpected sign"); |
| @@ -1062,6 +1082,7 @@ JSONParser::getToken() | @@ -1062,6 +1082,7 @@ JSONParser::getToken() | ||
| 1062 | throw std::logic_error("tok_start set in ls_top while parsing"); | 1082 | throw std::logic_error("tok_start set in ls_top while parsing"); |
| 1063 | break; | 1083 | break; |
| 1064 | 1084 | ||
| 1085 | + case ls_number_before_point: | ||
| 1065 | case ls_number: | 1086 | case ls_number: |
| 1066 | case ls_number_minus: | 1087 | case ls_number_minus: |
| 1067 | case ls_number_leading_zero: | 1088 | case ls_number_leading_zero: |
| @@ -1137,6 +1158,7 @@ JSONParser::handleToken() | @@ -1137,6 +1158,7 @@ JSONParser::handleToken() | ||
| 1137 | } | 1158 | } |
| 1138 | break; | 1159 | break; |
| 1139 | 1160 | ||
| 1161 | + case ls_number_before_point: | ||
| 1140 | case ls_number: | 1162 | case ls_number: |
| 1141 | case ls_number_minus: | 1163 | case ls_number_minus: |
| 1142 | case ls_number_leading_zero: | 1164 | case ls_number_leading_zero: |