Output delimiters for minifyCallbacks
This commit is contained in:
103
src/test.cpp
103
src/test.cpp
@@ -863,23 +863,84 @@ Callbacks printCallbacks() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct MinifyState {
|
||||||
|
bool isKey = false;
|
||||||
|
struct Cursor {
|
||||||
|
int index;
|
||||||
|
bool isObject;
|
||||||
|
};
|
||||||
|
void on_begin_value() {
|
||||||
|
if (!stack.empty()) {
|
||||||
|
auto &back = stack.back();
|
||||||
|
if (back.isObject && back.index % 2 == 0 && back.index > 0) {
|
||||||
|
printf(",");
|
||||||
|
}
|
||||||
|
if (back.isObject && back.index % 2 == 1 && back.index > 0) {
|
||||||
|
printf(":");
|
||||||
|
}
|
||||||
|
if (!back.isObject && back.index > 0) {
|
||||||
|
printf(",");
|
||||||
|
}
|
||||||
|
++back.index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::vector<Cursor> stack;
|
||||||
|
};
|
||||||
|
|
||||||
Callbacks minifyCallbacks() {
|
Callbacks minifyCallbacks() {
|
||||||
Callbacks result;
|
Callbacks result;
|
||||||
result.on_begin_object = +[](void *) { printf("{"); };
|
result.on_begin_object = +[](void *p) {
|
||||||
result.on_end_object = +[](void *) { printf("}\n"); };
|
auto *state = (MinifyState *)p;
|
||||||
result.on_begin_string = +[](void *) { printf("\""); };
|
state->on_begin_value();
|
||||||
|
state->stack.push_back({0, true});
|
||||||
|
printf("{");
|
||||||
|
};
|
||||||
|
result.on_end_object = +[](void *p) {
|
||||||
|
auto *state = (MinifyState *)p;
|
||||||
|
state->stack.pop_back();
|
||||||
|
printf("}");
|
||||||
|
};
|
||||||
|
result.on_begin_string = +[](void *p) {
|
||||||
|
auto *state = (MinifyState *)p;
|
||||||
|
state->on_begin_value();
|
||||||
|
printf("\"");
|
||||||
|
};
|
||||||
result.on_string_data =
|
result.on_string_data =
|
||||||
+[](void *, const char *buf, int len) { printf("%.*s", len, buf); };
|
+[](void *, const char *buf, int len) { printf("%.*s", len, buf); };
|
||||||
result.on_end_string = +[](void *) { printf("\""); };
|
result.on_end_string = +[](void *p) { printf("\""); };
|
||||||
result.on_begin_array = +[](void *) { printf("["); };
|
result.on_begin_array = +[](void *p) {
|
||||||
result.on_end_array = +[](void *) { printf("]\n"); };
|
auto *state = (MinifyState *)p;
|
||||||
result.on_begin_number = +[](void *) {};
|
state->on_begin_value();
|
||||||
|
state->stack.push_back({0, false});
|
||||||
|
printf("[");
|
||||||
|
};
|
||||||
|
result.on_end_array = +[](void *p) {
|
||||||
|
auto *state = (MinifyState *)p;
|
||||||
|
state->stack.pop_back();
|
||||||
|
printf("]");
|
||||||
|
};
|
||||||
|
result.on_begin_number = +[](void *p) {
|
||||||
|
auto *state = (MinifyState *)p;
|
||||||
|
state->on_begin_value();
|
||||||
|
};
|
||||||
result.on_number_data =
|
result.on_number_data =
|
||||||
+[](void *, const char *buf, int len) { printf("%.*s", len, buf); };
|
+[](void *, const char *buf, int len) { printf("%.*s", len, buf); };
|
||||||
result.on_end_number = +[](void *) {};
|
result.on_end_number = +[](void *) {};
|
||||||
result.on_true_literal = +[](void *) { printf("true"); };
|
result.on_true_literal = +[](void *p) {
|
||||||
result.on_false_literal = +[](void *) { printf("false"); };
|
auto *state = (MinifyState *)p;
|
||||||
result.on_null_literal = +[](void *) { printf("null"); };
|
state->on_begin_value();
|
||||||
|
printf("true");
|
||||||
|
};
|
||||||
|
result.on_false_literal = +[](void *p) {
|
||||||
|
auto *state = (MinifyState *)p;
|
||||||
|
state->on_begin_value();
|
||||||
|
printf("false");
|
||||||
|
};
|
||||||
|
result.on_null_literal = +[](void *p) {
|
||||||
|
auto *state = (MinifyState *)p;
|
||||||
|
state->on_begin_value();
|
||||||
|
printf("null");
|
||||||
|
};
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -887,23 +948,27 @@ Callbacks minifyCallbacks() {
|
|||||||
|
|
||||||
TEST_CASE("parser1") {
|
TEST_CASE("parser1") {
|
||||||
Callbacks c = minifyCallbacks();
|
Callbacks c = minifyCallbacks();
|
||||||
|
MinifyState state;
|
||||||
{
|
{
|
||||||
auto copy = json;
|
auto copy = json;
|
||||||
Parser1 parser(copy.data(), copy.length(), &c, nullptr);
|
Parser1 parser(copy.data(), copy.length(), &c, &state);
|
||||||
CHECK(parser.parse());
|
CHECK(parser.parse());
|
||||||
|
puts("");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::string copy = "{\"x\": [], \"y\": {}}";
|
std::string copy = "{\"x\": [], \"y\": {}}";
|
||||||
Parser1 parser(copy.data(), copy.length(), &c, nullptr);
|
Parser1 parser(copy.data(), copy.length(), &c, &state);
|
||||||
CHECK(parser.parse());
|
CHECK(parser.parse());
|
||||||
|
puts("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("parser2") {
|
TEST_CASE("parser2") {
|
||||||
Callbacks c = minifyCallbacks();
|
Callbacks c = minifyCallbacks();
|
||||||
|
MinifyState state;
|
||||||
{
|
{
|
||||||
auto copy = json;
|
auto copy = json;
|
||||||
Parser2 parser(&c, nullptr);
|
Parser2 parser(&c, &state);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (; i < copy.length() - 1; ++i) {
|
for (; i < copy.length() - 1; ++i) {
|
||||||
parser.prime(copy.data() + i, 1);
|
parser.prime(copy.data() + i, 1);
|
||||||
@@ -911,20 +976,14 @@ TEST_CASE("parser2") {
|
|||||||
}
|
}
|
||||||
parser.prime(copy.data() + i, 1);
|
parser.prime(copy.data() + i, 1);
|
||||||
CHECK(parser.parse() == Parser2::S_OK);
|
CHECK(parser.parse() == Parser2::S_OK);
|
||||||
|
puts("");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::string copy = "{\"x\": [], \"y\": {}}";
|
std::string copy = "{\"x\": [], \"y\": {}}";
|
||||||
Parser2 parser(&c, nullptr);
|
Parser2 parser(&c, &state);
|
||||||
parser.prime(copy.data(), copy.length());
|
parser.prime(copy.data(), copy.length());
|
||||||
CHECK(parser.parse() == Parser2::S_OK);
|
CHECK(parser.parse() == Parser2::S_OK);
|
||||||
}
|
puts("");
|
||||||
{
|
|
||||||
std::string copy = "true";
|
|
||||||
Parser2 parser(&c, nullptr);
|
|
||||||
parser.prime(copy.data(), 2);
|
|
||||||
CHECK(parser.parse() == Parser2::S_AGAIN);
|
|
||||||
parser.prime(copy.data() + 2, 2);
|
|
||||||
CHECK(parser.parse() == Parser2::S_OK);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user