From 01e04ca166ac4879da0401b8ffe72967824f3a0e Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 16 May 2025 16:11:28 -0400 Subject: [PATCH] Output delimiters for minifyCallbacks --- src/test.cpp | 103 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 81 insertions(+), 22 deletions(-) diff --git a/src/test.cpp b/src/test.cpp index 0ae4276..54d9e9d 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -863,23 +863,84 @@ Callbacks printCallbacks() { 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 stack; +}; + Callbacks minifyCallbacks() { Callbacks result; - result.on_begin_object = +[](void *) { printf("{"); }; - result.on_end_object = +[](void *) { printf("}\n"); }; - result.on_begin_string = +[](void *) { printf("\""); }; + result.on_begin_object = +[](void *p) { + auto *state = (MinifyState *)p; + 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 = +[](void *, const char *buf, int len) { printf("%.*s", len, buf); }; - result.on_end_string = +[](void *) { printf("\""); }; - result.on_begin_array = +[](void *) { printf("["); }; - result.on_end_array = +[](void *) { printf("]\n"); }; - result.on_begin_number = +[](void *) {}; + result.on_end_string = +[](void *p) { printf("\""); }; + result.on_begin_array = +[](void *p) { + auto *state = (MinifyState *)p; + 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 = +[](void *, const char *buf, int len) { printf("%.*s", len, buf); }; result.on_end_number = +[](void *) {}; - result.on_true_literal = +[](void *) { printf("true"); }; - result.on_false_literal = +[](void *) { printf("false"); }; - result.on_null_literal = +[](void *) { printf("null"); }; + result.on_true_literal = +[](void *p) { + auto *state = (MinifyState *)p; + 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; } @@ -887,23 +948,27 @@ Callbacks minifyCallbacks() { TEST_CASE("parser1") { Callbacks c = minifyCallbacks(); + MinifyState state; { auto copy = json; - Parser1 parser(copy.data(), copy.length(), &c, nullptr); + Parser1 parser(copy.data(), copy.length(), &c, &state); CHECK(parser.parse()); + puts(""); } { std::string copy = "{\"x\": [], \"y\": {}}"; - Parser1 parser(copy.data(), copy.length(), &c, nullptr); + Parser1 parser(copy.data(), copy.length(), &c, &state); CHECK(parser.parse()); + puts(""); } } TEST_CASE("parser2") { Callbacks c = minifyCallbacks(); + MinifyState state; { auto copy = json; - Parser2 parser(&c, nullptr); + Parser2 parser(&c, &state); int i = 0; for (; i < copy.length() - 1; ++i) { parser.prime(copy.data() + i, 1); @@ -911,20 +976,14 @@ TEST_CASE("parser2") { } parser.prime(copy.data() + i, 1); CHECK(parser.parse() == Parser2::S_OK); + puts(""); } { std::string copy = "{\"x\": [], \"y\": {}}"; - Parser2 parser(&c, nullptr); + Parser2 parser(&c, &state); parser.prime(copy.data(), copy.length()); CHECK(parser.parse() == Parser2::S_OK); - } - { - 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); + puts(""); } }