Packages
glazer
0.5.1
0.5.17
0.5.16
0.5.15
0.5.14
retired
0.5.13
retired
0.5.12
retired
0.5.11
retired
0.5.10
retired
0.5.9
retired
0.5.8
retired
0.5.7
retired
0.5.6
retired
0.5.5
retired
0.5.4
retired
0.5.3
retired
0.5.2
retired
0.5.1
retired
0.5.0
retired
0.3.2
retired
0.3.0
retired
0.2.6
retired
0.2.5
retired
0.2.4
retired
0.2.3
retired
0.2.2
retired
0.2.1
retired
0.2.0
retired
0.1.7
retired
0.1.6
retired
0.1.5
retired
0.1.4
retired
Erlang NIF JSON encoder/decoder using the glaze C++ library
Retired package: Deprecated - Deprecated
Current section
Files
Jump to
Current section
Files
c_src/glazer_json_format.hpp
// Standalone JSON prettify / minify
#pragma once
#include <string>
#include <string_view>
#include <vector>
namespace glz {
// Returns a prettified copy of `in` (2-space indent, assumes valid JSON).
inline std::string prettify_json(std::string_view in)
{
std::string out;
out.reserve(in.size() * 2);
int indent = 0;
bool in_str = false;
bool escape = false;
auto newline = [&] {
out += '\n';
for (int i = 0; i < indent * 3; ++i) out += ' ';
};
for (size_t i = 0; i < in.size(); ++i) {
char c = in[i];
if (escape) { out += c; escape = false; continue; }
if (in_str) {
out += c;
if (c == '\\') escape = true;
else if (c == '"') in_str = false;
continue;
}
switch (c) {
case '"':
out += c; in_str = true;
break;
case '{': case '[':
out += c;
// peek: if immediately closed, emit on same line
{
size_t j = i + 1;
while (j < in.size() && (in[j] == ' ' || in[j] == '\t' || in[j] == '\r' || in[j] == '\n')) ++j;
if (j < in.size() && (in[j] == '}' || in[j] == ']')) break;
}
++indent;
newline();
break;
case '}': case ']':
--indent;
newline();
out += c;
break;
case ',':
out += c;
newline();
break;
case ':':
out += ':'; out += ' ';
break;
case ' ': case '\t': case '\r': case '\n':
// strip existing whitespace outside strings
break;
default:
out += c;
break;
}
}
return out;
}
// Returns a minified copy of `in` (assumes valid JSON).
inline std::string minify_json(std::string in)
{
std::string out;
out.reserve(in.size());
bool in_str = false;
bool escape = false;
for (char c : in) {
if (escape) { out += c; escape = false; continue; }
if (in_str) {
out += c;
if (c == '\\') escape = true;
else if (c == '"') in_str = false;
continue;
}
if (c == '"') { out += c; in_str = true; continue; }
if (c == ' ' || c == '\t' || c == '\r' || c == '\n') continue;
out += c;
}
return out;
}
} // namespace glz