Output delimiters for minifyCallbacks

This commit is contained in:
2025-05-16 16:11:28 -04:00
parent 3c646732ac
commit 01e04ca166

View File

@@ -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);
} }
} }