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,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;