blobmsg_json: support indenting of output data
This commit is contained in:
parent
bdf6363777
commit
ed9b5c986b
2 changed files with 51 additions and 8 deletions
|
@ -98,6 +98,8 @@ struct strbuf {
|
|||
|
||||
blobmsg_json_format_t custom_format;
|
||||
void *priv;
|
||||
bool indent;
|
||||
int indent_level;
|
||||
};
|
||||
|
||||
static bool blobmsg_puts(struct strbuf *s, const char *c, int len)
|
||||
|
@ -116,6 +118,29 @@ static bool blobmsg_puts(struct strbuf *s, const char *c, int len)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void add_separator(struct strbuf *s)
|
||||
{
|
||||
static char indent_chars[17] = "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
|
||||
static const char indent_space = ' ';
|
||||
int indent;
|
||||
char *start;
|
||||
|
||||
if (!s->indent) {
|
||||
blobmsg_puts(s, &indent_space, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
indent = s->indent_level;
|
||||
if (indent > 16)
|
||||
indent = 16;
|
||||
|
||||
start = &indent_chars[sizeof(indent_chars) - indent - 1];
|
||||
*start = '\n';
|
||||
blobmsg_puts(s, start, indent + 1);
|
||||
*start = '\t';
|
||||
}
|
||||
|
||||
|
||||
static void blobmsg_format_string(struct strbuf *s, const char *str)
|
||||
{
|
||||
const char *p, *last = str, *end = str + strlen(str);
|
||||
|
@ -185,7 +210,7 @@ static void blobmsg_format_element(struct strbuf *s, struct blob_attr *attr, boo
|
|||
|
||||
if (!array && blobmsg_name(attr)[0]) {
|
||||
blobmsg_format_string(s, blobmsg_name(attr));
|
||||
blobmsg_puts(s, ":", 1);
|
||||
blobmsg_puts(s, ": ", 2);
|
||||
}
|
||||
if (head) {
|
||||
data = blob_data(attr);
|
||||
|
@ -233,18 +258,24 @@ static void blobmsg_format_json_list(struct strbuf *s, struct blob_attr *attr, i
|
|||
bool first = true;
|
||||
int rem = len;
|
||||
|
||||
blobmsg_puts(s, (array ? "[ " : "{ "), 2);
|
||||
blobmsg_puts(s, (array ? "[" : "{" ), 1);
|
||||
s->indent_level++;
|
||||
add_separator(s);
|
||||
__blob_for_each_attr(pos, attr, rem) {
|
||||
if (!first)
|
||||
blobmsg_puts(s, ", ", 2);
|
||||
if (!first) {
|
||||
blobmsg_puts(s, ",", 1);
|
||||
add_separator(s);
|
||||
}
|
||||
|
||||
blobmsg_format_element(s, pos, array, false);
|
||||
first = false;
|
||||
}
|
||||
blobmsg_puts(s, (array ? " ]" : " }"), 2);
|
||||
s->indent_level--;
|
||||
add_separator(s);
|
||||
blobmsg_puts(s, (array ? "]" : "}"), 1);
|
||||
}
|
||||
|
||||
char *blobmsg_format_json_with_cb(struct blob_attr *attr, bool list, blobmsg_json_format_t cb, void *priv)
|
||||
char *blobmsg_format_json_with_cb(struct blob_attr *attr, bool list, blobmsg_json_format_t cb, void *priv, int indent)
|
||||
{
|
||||
struct strbuf s;
|
||||
|
||||
|
@ -253,6 +284,12 @@ char *blobmsg_format_json_with_cb(struct blob_attr *attr, bool list, blobmsg_jso
|
|||
s.pos = 0;
|
||||
s.custom_format = cb;
|
||||
s.priv = priv;
|
||||
s.indent = false;
|
||||
|
||||
if (indent >= 0) {
|
||||
s.indent = true;
|
||||
s.indent_level = indent;
|
||||
}
|
||||
|
||||
if (list)
|
||||
blobmsg_format_json_list(&s, blob_data(attr), blob_len(attr), false);
|
||||
|
|
|
@ -26,11 +26,17 @@ bool blobmsg_add_json_from_string(struct blob_buf *b, const char *str);
|
|||
typedef const char *(*blobmsg_json_format_t)(void *priv, struct blob_attr *attr);
|
||||
|
||||
char *blobmsg_format_json_with_cb(struct blob_attr *attr, bool list,
|
||||
blobmsg_json_format_t cb, void *priv);
|
||||
blobmsg_json_format_t cb, void *priv,
|
||||
int indent);
|
||||
|
||||
static inline char *blobmsg_format_json(struct blob_attr *attr, bool list)
|
||||
{
|
||||
return blobmsg_format_json_with_cb(attr, list, NULL, NULL);
|
||||
return blobmsg_format_json_with_cb(attr, list, NULL, NULL, -1);
|
||||
}
|
||||
|
||||
static inline char *blobmsg_format_json_indent(struct blob_attr *attr, bool list, int indent)
|
||||
{
|
||||
return blobmsg_format_json_with_cb(attr, list, NULL, NULL, indent);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue