FIX: json decoder bug jdec was crashing when string had spaces
This commit is contained in:
parent
c84fd4a614
commit
795655edda
@ -49,6 +49,8 @@ struct json_dec_t {
|
|||||||
size_t pairs =0;
|
size_t pairs =0;
|
||||||
char* begin = nullptr;
|
char* begin = nullptr;
|
||||||
int s =0;
|
int s =0;
|
||||||
|
bool str_value = false; // flag to indicate the value is string
|
||||||
|
|
||||||
for (size_t i=0 ; i<size ; ++i) {
|
for (size_t i=0 ; i<size ; ++i) {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case ST:
|
case ST:
|
||||||
@ -99,26 +101,46 @@ struct json_dec_t {
|
|||||||
valid_ = false;
|
valid_ = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!begin && std::isspace(buffer[i]))
|
if (!begin && std::isspace(buffer[i])) // consume pre-spaces
|
||||||
continue;
|
continue;
|
||||||
else if (!begin && !std::isspace(buffer[i]))
|
else if (!begin && !std::isspace(buffer[i])) { // first character
|
||||||
begin = (buffer[i] != '\"') ? (char*)&buffer[i] : (char*)&buffer[i+1];
|
if (buffer[i] == '\"') {
|
||||||
else if (begin && (std::isspace(buffer[i]) || buffer[i] == ',' || buffer[i] == '}')) {
|
begin = (char*)&buffer[i+1];
|
||||||
s = (char*)&buffer[i] - begin;
|
str_value = true;
|
||||||
s -= (buffer[i-1] == '\"') ? 1:0;
|
}
|
||||||
if (s > 0)
|
else {
|
||||||
pairs_[pairs].value = std::string_view{begin, (size_t)s};
|
begin = (char*)&buffer[i];
|
||||||
else
|
str_value = false;
|
||||||
pairs_[pairs].value = std::string_view{};
|
}
|
||||||
++pairs;
|
}
|
||||||
begin =nullptr;
|
else if (begin) {
|
||||||
s =0;
|
if (str_value && (buffer[i] == '\"')) {
|
||||||
if (std::isspace(buffer[i]))
|
s = (char*)&buffer[i] - begin;
|
||||||
|
if (s > 0)
|
||||||
|
pairs_[pairs].value = std::string_view{begin, (size_t)s};
|
||||||
|
else
|
||||||
|
pairs_[pairs].value = std::string_view{};
|
||||||
|
++pairs;
|
||||||
|
begin =nullptr;
|
||||||
|
s =0;
|
||||||
state = SP;
|
state = SP;
|
||||||
else if (buffer[i] == ',')
|
}
|
||||||
state = KEY;
|
else if (!str_value && (std::isspace(buffer[i]) || buffer[i] == ',' || buffer[i] == '}')) {
|
||||||
else if (buffer[i] == '}')
|
s = (char*)&buffer[i] - begin;
|
||||||
return;
|
if (s > 0)
|
||||||
|
pairs_[pairs].value = std::string_view{begin, (size_t)s};
|
||||||
|
else
|
||||||
|
pairs_[pairs].value = std::string_view{};
|
||||||
|
++pairs;
|
||||||
|
begin =nullptr;
|
||||||
|
s =0;
|
||||||
|
if (std::isspace(buffer[i]))
|
||||||
|
state = SP;
|
||||||
|
else if (buffer[i] == ',')
|
||||||
|
state = KEY;
|
||||||
|
else if (buffer[i] == '}')
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user