@@ -138,7 +138,7 @@ class JSON_Parser
138
138
bool signed_number;
139
139
};
140
140
141
- JsonParseStatus GetNextToken (Token &);
141
+ void GetNextToken (Token &, JsonParseStatus &);
142
142
143
143
web::json::value ParseValue (typename JSON_Parser<CharType>::Token &first, JsonParseStatus& parseStatus)
144
144
{
@@ -901,16 +901,14 @@ bool JSON_StringParser<CharType>::finish_parsing_string_with_unescape_char(typen
901
901
}
902
902
903
903
template <typename CharType>
904
- JsonParseStatus JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharType>::Token& result)
904
+ void JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharType>::Token& result, JsonParseStatus& parseStatus )
905
905
{
906
- JsonParseStatus parseSucceed;
907
-
908
906
try_again:
909
907
CharType ch = EatWhitespace ();
910
908
911
909
CreateToken (result, Token::TKN_EOF);
912
910
913
- if (ch == this ->m_eof ) return parseSucceed ;
911
+ if (ch == this ->m_eof ) return ;
914
912
915
913
switch (ch)
916
914
{
@@ -919,8 +917,8 @@ JsonParseStatus JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharTyp
919
917
{
920
918
if (++m_currentParsingDepth > JSON_Parser<CharType>::maxParsingDepth)
921
919
{
922
- parseSucceed .didSucceed = false ;
923
- parseSucceed .errorMsg = _XPLATSTR (" Nesting too deep!" );
920
+ parseStatus .didSucceed = false ;
921
+ parseStatus .errorMsg = _XPLATSTR (" Nesting too deep!" );
924
922
break ;
925
923
}
926
924
@@ -933,8 +931,8 @@ JsonParseStatus JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharTyp
933
931
{
934
932
if ((signed int )(--m_currentParsingDepth) < 0 )
935
933
{
936
- parseSucceed .didSucceed = false ;
937
- parseSucceed .errorMsg = _XPLATSTR (" Mismatched braces!" );
934
+ parseStatus .didSucceed = false ;
935
+ parseStatus .errorMsg = _XPLATSTR (" Mismatched braces!" );
938
936
break ;
939
937
}
940
938
@@ -953,38 +951,38 @@ JsonParseStatus JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharTyp
953
951
case ' t' :
954
952
if (!CompleteKeywordTrue (result))
955
953
{
956
- parseSucceed .didSucceed = false ;
957
- parseSucceed .errorMsg = _XPLATSTR (" Malformed literal" );
954
+ parseStatus .didSucceed = false ;
955
+ parseStatus .errorMsg = _XPLATSTR (" Malformed literal" );
958
956
}
959
957
break ;
960
958
case ' f' :
961
959
if (!CompleteKeywordFalse (result))
962
960
{
963
- parseSucceed .didSucceed = false ;
964
- parseSucceed .errorMsg = _XPLATSTR (" Malformed literal" );
961
+ parseStatus .didSucceed = false ;
962
+ parseStatus .errorMsg = _XPLATSTR (" Malformed literal" );
965
963
}
966
964
break ;
967
965
case ' n' :
968
966
if (!CompleteKeywordNull (result))
969
967
{
970
- parseSucceed .didSucceed = false ;
971
- parseSucceed .errorMsg = _XPLATSTR (" Malformed literal" );
968
+ parseStatus .didSucceed = false ;
969
+ parseStatus .errorMsg = _XPLATSTR (" Malformed literal" );
972
970
}
973
971
break ;
974
972
case ' /' :
975
973
if (!CompleteComment (result))
976
974
{
977
- parseSucceed .didSucceed = false ;
978
- parseSucceed .errorMsg = _XPLATSTR (" Malformed comment" );
975
+ parseStatus .didSucceed = false ;
976
+ parseStatus .errorMsg = _XPLATSTR (" Malformed comment" );
979
977
break ;
980
978
}
981
979
// For now, we're ignoring comments.
982
980
goto try_again;
983
981
case ' "' :
984
982
if (!CompleteStringLiteral (result))
985
983
{
986
- parseSucceed .didSucceed = false ;
987
- parseSucceed .errorMsg = _XPLATSTR (" Malformed string literal" );
984
+ parseStatus .didSucceed = false ;
985
+ parseStatus .errorMsg = _XPLATSTR (" Malformed string literal" );
988
986
}
989
987
break ;
990
988
@@ -1001,27 +999,22 @@ JsonParseStatus JSON_Parser<CharType>::GetNextToken(typename JSON_Parser<CharTyp
1001
999
case ' 9' :
1002
1000
if (!CompleteNumberLiteral (ch, result))
1003
1001
{
1004
- parseSucceed .didSucceed = false ;
1005
- parseSucceed .errorMsg = _XPLATSTR (" Malformed numeric literal" );
1002
+ parseStatus .didSucceed = false ;
1003
+ parseStatus .errorMsg = _XPLATSTR (" Malformed numeric literal" );
1006
1004
}
1007
1005
break ;
1008
1006
default :
1009
- parseSucceed .didSucceed = false ;
1010
- parseSucceed .errorMsg = _XPLATSTR (" Malformed token" );
1007
+ parseStatus .didSucceed = false ;
1008
+ parseStatus .errorMsg = _XPLATSTR (" Malformed token" );
1011
1009
break ;
1012
1010
}
1013
-
1014
- return parseSucceed;
1015
1011
}
1016
1012
1017
1013
template <typename CharType>
1018
1014
std::unique_ptr<web::json::details::_Object> JSON_Parser<CharType>::_ParseObject(typename JSON_Parser<CharType>::Token &tkn, JsonParseStatus& parseStatus)
1019
1015
{
1020
- parseStatus = GetNextToken (tkn);
1021
- if (!parseStatus.didSucceed )
1022
- {
1023
- return nullptr ;
1024
- }
1016
+ GetNextToken (tkn, parseStatus);
1017
+ if (!parseStatus.didSucceed ) return nullptr ;
1025
1018
1026
1019
auto obj = utility::details::make_unique<web::json::details::_Object>(g_keep_json_object_unsorted);
1027
1020
auto & elems = obj->m_object .m_elements ;
@@ -1043,20 +1036,21 @@ std::unique_ptr<web::json::details::_Object> JSON_Parser<CharType>::_ParseObject
1043
1036
goto error;
1044
1037
}
1045
1038
1046
- parseStatus = GetNextToken (tkn);
1047
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1039
+ GetNextToken (tkn, parseStatus );
1040
+ if (!parseStatus.didSucceed ) return nullptr ;
1048
1041
1049
1042
// State 2: Looking for a colon.
1050
1043
1051
1044
if ( tkn.kind != JSON_Parser<CharType>::Token::TKN_Colon ) goto done;
1052
1045
1053
- parseStatus = GetNextToken (tkn);
1054
- if (!parseStatus.didSucceed ) goto getNextTokenError;
1046
+ GetNextToken (tkn, parseStatus);
1047
+ if (!parseStatus.didSucceed ) return nullptr ;
1048
+
1055
1049
// State 3: Looking for an expression.
1056
1050
#ifdef ENABLE_JSON_VALUE_VISUALIZER
1057
1051
auto fieldValue = _ParseValue (tkn, parseStatus);
1058
1052
1059
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1053
+ if (!parseStatus.didSucceed ) return nullptr ;
1060
1054
auto type = fieldValue->type ();
1061
1055
1062
1056
elems.emplace_back (utility::conversions::to_string_t (std::move (fieldName)), json::value (std::move (fieldValue), type));
@@ -1069,8 +1063,8 @@ std::unique_ptr<web::json::details::_Object> JSON_Parser<CharType>::_ParseObject
1069
1063
switch (tkn.kind )
1070
1064
{
1071
1065
case JSON_Parser<CharType>::Token::TKN_Comma:
1072
- parseStatus = GetNextToken (tkn);
1073
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1066
+ GetNextToken (tkn, parseStatus );
1067
+ if (!parseStatus.didSucceed ) return nullptr ;
1074
1068
break ;
1075
1069
case JSON_Parser<CharType>::Token::TKN_CloseBrace:
1076
1070
goto done;
@@ -1082,8 +1076,8 @@ std::unique_ptr<web::json::details::_Object> JSON_Parser<CharType>::_ParseObject
1082
1076
1083
1077
done:
1084
1078
1085
- GetNextToken (tkn);
1086
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1079
+ GetNextToken (tkn, parseStatus );
1080
+ if (!parseStatus.didSucceed ) return nullptr ;
1087
1081
1088
1082
if (!g_keep_json_object_unsorted) {
1089
1083
::std::sort (elems.begin(), elems.end(), json::object::compare_pairs);
@@ -1095,15 +1089,12 @@ std::unique_ptr<web::json::details::_Object> JSON_Parser<CharType>::_ParseObject
1095
1089
parseStatus.didSucceed = false ;
1096
1090
parseStatus.errorMsg = _XPLATSTR (" Malformed object literal" );
1097
1091
return nullptr ;
1098
-
1099
- getNextTokenError:
1100
- return nullptr ;
1101
1092
}
1102
1093
1103
1094
template <typename CharType>
1104
1095
std::unique_ptr<web::json::details::_Array> JSON_Parser<CharType>::_ParseArray(typename JSON_Parser<CharType>::Token &tkn, JsonParseStatus& parseStatus)
1105
1096
{
1106
- parseStatus = GetNextToken (tkn);
1097
+ GetNextToken (tkn, parseStatus );
1107
1098
if (!parseStatus.didSucceed )
1108
1099
{
1109
1100
return nullptr ;
@@ -1117,20 +1108,20 @@ std::unique_ptr<web::json::details::_Array> JSON_Parser<CharType>::_ParseArray(t
1117
1108
{
1118
1109
// State 1: Looking for an expression.
1119
1110
auto value = ParseValue (tkn, parseStatus);
1120
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1111
+ if (!parseStatus.didSucceed ) return nullptr ;
1121
1112
1122
1113
result->m_array .m_elements .emplace_back (value);
1123
1114
1124
1115
// State 4: Looking for a comma or a closing bracket
1125
1116
switch (tkn.kind )
1126
1117
{
1127
1118
case JSON_Parser<CharType>::Token::TKN_Comma:
1128
- parseStatus = GetNextToken (tkn);
1129
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1119
+ GetNextToken (tkn, parseStatus );
1120
+ if (!parseStatus.didSucceed ) return nullptr ;
1130
1121
break ;
1131
1122
case JSON_Parser<CharType>::Token::TKN_CloseBracket:
1132
- parseStatus = GetNextToken (tkn);
1133
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1123
+ GetNextToken (tkn, parseStatus );
1124
+ if (!parseStatus.didSucceed ) return nullptr ;
1134
1125
1135
1126
return result;
1136
1127
default :
@@ -1142,13 +1133,10 @@ std::unique_ptr<web::json::details::_Array> JSON_Parser<CharType>::_ParseArray(t
1142
1133
}
1143
1134
}
1144
1135
1145
- parseStatus = GetNextToken (tkn);
1146
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1136
+ GetNextToken (tkn, parseStatus );
1137
+ if (!parseStatus.didSucceed ) return nullptr ;
1147
1138
1148
1139
return result;
1149
-
1150
- getNextTokenError:
1151
- return nullptr ;
1152
1140
}
1153
1141
1154
1142
template <typename CharType>
@@ -1167,8 +1155,8 @@ std::unique_ptr<web::json::details::_Value> JSON_Parser<CharType>::_ParseValue(t
1167
1155
case JSON_Parser<CharType>::Token::TKN_StringLiteral:
1168
1156
{
1169
1157
auto value = utility::details::make_unique<web::json::details::_String>(std::move (tkn.string_val ), tkn.has_unescape_symbol );
1170
- parseStatus = GetNextToken (tkn);
1171
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1158
+ GetNextToken (tkn, parseStatus );
1159
+ if (!parseStatus.didSucceed ) return nullptr ;
1172
1160
return std::move (value);
1173
1161
}
1174
1162
case JSON_Parser<CharType>::Token::TKN_IntegerLiteral:
@@ -1179,40 +1167,37 @@ std::unique_ptr<web::json::details::_Value> JSON_Parser<CharType>::_ParseValue(t
1179
1167
else
1180
1168
value = utility::details::make_unique<web::json::details::_Number>(tkn.uint64_val );
1181
1169
1182
- parseStatus = GetNextToken (tkn);
1183
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1170
+ GetNextToken (tkn, parseStatus );
1171
+ if (!parseStatus.didSucceed ) return nullptr ;
1184
1172
return std::move (value);
1185
1173
}
1186
1174
case JSON_Parser<CharType>::Token::TKN_NumberLiteral:
1187
1175
{
1188
1176
auto value = utility::details::make_unique<web::json::details::_Number>(tkn.double_val );
1189
- parseStatus = GetNextToken (tkn);
1190
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1177
+ GetNextToken (tkn, parseStatus );
1178
+ if (!parseStatus.didSucceed ) return nullptr ;
1191
1179
return std::move (value);
1192
1180
}
1193
1181
case JSON_Parser<CharType>::Token::TKN_BooleanLiteral:
1194
1182
{
1195
1183
auto value = utility::details::make_unique<web::json::details::_Boolean>(tkn.boolean_val );
1196
- parseStatus = GetNextToken (tkn);
1197
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1184
+ GetNextToken (tkn, parseStatus );
1185
+ if (!parseStatus.didSucceed ) return nullptr ;
1198
1186
return std::move (value);
1199
1187
}
1200
1188
case JSON_Parser<CharType>::Token::TKN_NullLiteral:
1201
1189
{
1202
- parseStatus = GetNextToken (tkn);
1203
- if (!parseStatus.didSucceed ) goto getNextTokenError ;
1190
+ GetNextToken (tkn, parseStatus );
1191
+ if (!parseStatus.didSucceed ) return nullptr ;
1204
1192
return utility::details::make_unique<web::json::details::_Null>();
1205
1193
}
1206
1194
default :
1207
1195
{
1208
1196
parseStatus.didSucceed = false ;
1209
1197
parseStatus.errorMsg = _XPLATSTR (" Unexpected token" );
1210
- goto getNextTokenError ;
1198
+ return nullptr ;
1211
1199
}
1212
1200
}
1213
-
1214
- getNextTokenError:
1215
- return nullptr ;
1216
1201
}
1217
1202
1218
1203
}}}
@@ -1222,7 +1207,8 @@ static web::json::value _parse_stream(utility::istream_t &stream)
1222
1207
web::json::details::JSON_StreamParser<utility::char_t > parser (stream);
1223
1208
1224
1209
web::json::details::JSON_Parser<utility::char_t >::Token tkn;
1225
- auto parseStatus = parser.GetNextToken (tkn);
1210
+ web::json::details::JsonParseStatus parseStatus;
1211
+ parser.GetNextToken (tkn, parseStatus);
1226
1212
1227
1213
if (!parseStatus.didSucceed )
1228
1214
{
@@ -1249,7 +1235,9 @@ static web::json::value _parse_narrow_stream(std::istream &stream)
1249
1235
web::json::details::JSON_StreamParser<char > parser (stream);
1250
1236
1251
1237
web::json::details::JSON_StreamParser<char >::Token tkn;
1252
- auto parseStatus = parser.GetNextToken (tkn);
1238
+
1239
+ web::json::details::JsonParseStatus parseStatus;
1240
+ parser.GetNextToken (tkn, parseStatus);
1253
1241
1254
1242
if (!parseStatus.didSucceed )
1255
1243
{
@@ -1276,7 +1264,8 @@ web::json::value web::json::value::parse(const utility::string_t& str)
1276
1264
web::json::details::JSON_StringParser<utility::char_t > parser (str);
1277
1265
1278
1266
web::json::details::JSON_Parser<utility::char_t >::Token tkn;
1279
- auto parseStatus = parser.GetNextToken (tkn);
1267
+ web::json::details::JsonParseStatus parseStatus;
1268
+ parser.GetNextToken (tkn, parseStatus);
1280
1269
1281
1270
if (!parseStatus.didSucceed )
1282
1271
{
@@ -1302,7 +1291,9 @@ web::json::value web::json::value::parse(const utility::string_t& str, std::erro
1302
1291
web::json::details::JSON_StringParser<utility::char_t > parser (str);
1303
1292
1304
1293
web::json::details::JSON_Parser<utility::char_t >::Token tkn;
1305
- auto parseStatus = parser.GetNextToken (tkn);
1294
+ web::json::details::JsonParseStatus parseStatus;
1295
+ parser.GetNextToken (tkn, parseStatus);
1296
+
1306
1297
web::json::value returnObject;
1307
1298
1308
1299
if (parseStatus.didSucceed )
0 commit comments