Commit 8fd6e1c5b24d0fc804c25004f398b39b5041b034

Authored by m-holger
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;
... ...