#include <string.h>
#include <string>
#include <map>
#include <vector>
namespace dyld3 {
namespace json {
struct Node
{
std::string value;
std::map<std::string, Node> map;
std::vector<Node> array;
};
static inline std::string hex(uint64_t value) {
char buff[64];
sprintf(buff, "0x%llX", value);
return buff;
}
static inline std::string hex4(uint64_t value) {
char buff[64];
sprintf(buff, "0x%04llX", value);
return buff;
}
static inline std::string hex8(uint64_t value) {
char buff[64];
sprintf(buff, "0x%08llX", value);
return buff;
}
static inline std::string decimal(uint64_t value) {
char buff[64];
sprintf(buff, "%llu", value);
return buff;
}
static inline void indentBy(uint32_t spaces, FILE* out) {
for (int i=0; i < spaces; ++i) {
fprintf(out, " ");
}
}
static inline void printJSON(const Node& node, uint32_t indent, FILE* out)
{
if ( !node.map.empty() ) {
fprintf(out, "{");
bool needComma = false;
for (const auto& entry : node.map) {
if ( needComma )
fprintf(out, ",");
fprintf(out, "\n");
indentBy(indent+2, out);
fprintf(out, "\"%s\": ", entry.first.c_str());
printJSON(entry.second, indent+2, out);
needComma = true;
}
fprintf(out, "\n");
indentBy(indent, out);
fprintf(out, "}");
}
else if ( !node.array.empty() ) {
fprintf(out, "[");
bool needComma = false;
for (const auto& entry : node.array) {
if ( needComma )
fprintf(out, ",");
fprintf(out, "\n");
indentBy(indent+2, out);
printJSON(entry, indent+2, out);
needComma = true;
}
fprintf(out, "\n");
indentBy(indent, out);
fprintf(out, "]");
}
else {
fprintf(out, "\"%s\"", node.value.c_str());
}
if ( indent == 0 )
fprintf(out, "\n");
}
} }