pw-dump: simplify the state handling

Fixes first \n
This commit is contained in:
Wim Taymans 2020-12-15 18:12:21 +01:00
parent 13cb51efbd
commit 0e9ba69d3a

View file

@ -39,7 +39,6 @@
#include <extensions/metadata.h> #include <extensions/metadata.h>
#define INDENT 2 #define INDENT 2
#define FLAG_SIMPLE (1<<0)
static bool colors = false; static bool colors = false;
@ -67,9 +66,12 @@ struct data {
FILE *out; FILE *out;
int level; int level;
int in_key; #define STATE_KEY (1<<0)
int comma; #define STATE_COMMA (1<<1)
int simple; #define STATE_FIRST (1<<2)
#define STATE_MASK 0xffff0000
#define STATE_SIMPLE (1<<16)
uint32_t state;
}; };
struct param { struct param {
@ -190,67 +192,45 @@ static void object_destroy(struct object *o)
free(o); free(o);
} }
static void put_key(struct data *d, const char *key);
static SPA_PRINTF_FUNC(3,4) void put_fmt(struct data *d, const char *key, const char *fmt, ...)
{
va_list va;
if (key)
put_key(d, key);
fprintf(d->out, "%s%s%*s",
d->state & STATE_COMMA ? "," : "",
d->state & (STATE_MASK | STATE_KEY) ? " " : d->state & STATE_FIRST ? "" : "\n",
d->state & (STATE_MASK | STATE_KEY) ? 0 : d->level, "");
va_start(va, fmt);
vfprintf(d->out, fmt, va);
va_end(va);
d->state = (d->state & STATE_MASK) + STATE_COMMA;
}
static void put_key(struct data *d, const char *key) static void put_key(struct data *d, const char *key)
{ {
int size = (strlen(key) + 1) * 4; int size = (strlen(key) + 1) * 4;
char *str = alloca(size); char *str = alloca(size);
spa_json_encode_string(str, size, key); spa_json_encode_string(str, size, key);
fprintf(d->out, "%s%s%*s%s%s%s:", put_fmt(d, NULL, "%s%s%s:", KEY, str, NORMAL);
d->comma ? "," : "", d->state = (d->state & STATE_MASK) + STATE_KEY;
d->simple ? " " : "\n",
d->simple ? 0 : d->level, "",
KEY, str, NORMAL);
d->in_key = true;
d->comma = false;
} }
static void put_begin(struct data *d, const char *key, const char *type, uint32_t flags) static void put_begin(struct data *d, const char *key, const char *type, uint32_t flags)
{ {
int simple = flags & FLAG_SIMPLE; put_fmt(d, key, "%s", type);
if (key)
put_key(d, key);
fprintf(d->out, "%s%s%*s%s",
d->comma ? "," : "",
d->in_key ? " " : "\n",
d->in_key ? 0 : d->level, "",
type);
d->level += INDENT; d->level += INDENT;
if (simple) d->state = (d->state & STATE_MASK) + (flags & STATE_SIMPLE);
d->simple++;
d->in_key = false;
d->comma = false;
} }
static void put_end(struct data *d, const char *type, uint32_t flags) static void put_end(struct data *d, const char *type, uint32_t flags)
{ {
int simple = flags & FLAG_SIMPLE;
d->level -= INDENT; d->level -= INDENT;
fprintf(d->out, "%s%*s%s", d->state = d->state & STATE_MASK;
simple ? " " : "\n", put_fmt(d, NULL, "%s", type);
simple ? 0 : d->level, "", d->state = (d->state & STATE_MASK) + STATE_COMMA - (flags & STATE_SIMPLE);
type);
if (simple)
d->simple--;
d->in_key = false;
d->comma = true;
}
static SPA_PRINTF_FUNC(3,4) void put_fmt(struct data *d, const char *key, const char *fmt, ...)
{
int simple;
va_list va;
if (key)
put_key(d, key);
simple = d->simple || d->in_key;
fprintf(d->out, "%s%s%*s",
d->comma ? "," : "",
simple ? " " : "\n",
simple ? 0 : d->level, "");
va_start(va, fmt);
vfprintf(d->out, fmt, va);
va_end(va);
d->in_key = false;
d->comma = true;
} }
static void put_string(struct data *d, const char *key, const char *val) static void put_string(struct data *d, const char *key, const char *val)
@ -338,19 +318,19 @@ static void put_pod_value(struct data *d, const char *key, const struct spa_type
case SPA_TYPE_Rectangle: case SPA_TYPE_Rectangle:
{ {
struct spa_rectangle *r = (struct spa_rectangle *)body; struct spa_rectangle *r = (struct spa_rectangle *)body;
put_begin(d, NULL, "{", FLAG_SIMPLE); put_begin(d, NULL, "{", STATE_SIMPLE);
put_int(d, "width", r->width); put_int(d, "width", r->width);
put_int(d, "height", r->height); put_int(d, "height", r->height);
put_end(d, "}", FLAG_SIMPLE); put_end(d, "}", STATE_SIMPLE);
break; break;
} }
case SPA_TYPE_Fraction: case SPA_TYPE_Fraction:
{ {
struct spa_fraction *f = (struct spa_fraction *)body; struct spa_fraction *f = (struct spa_fraction *)body;
put_begin(d, NULL, "{", FLAG_SIMPLE); put_begin(d, NULL, "{", STATE_SIMPLE);
put_int(d, "num", f->num); put_int(d, "num", f->num);
put_int(d, "denom", f->denom); put_int(d, "denom", f->denom);
put_end(d, "}", FLAG_SIMPLE); put_end(d, "}", STATE_SIMPLE);
break; break;
} }
case SPA_TYPE_Array: case SPA_TYPE_Array:
@ -358,10 +338,10 @@ static void put_pod_value(struct data *d, const char *key, const struct spa_type
struct spa_pod_array_body *b = (struct spa_pod_array_body *)body; struct spa_pod_array_body *b = (struct spa_pod_array_body *)body;
void *p; void *p;
info = info && info->values ? info->values: info; info = info && info->values ? info->values: info;
put_begin(d, NULL, "[", FLAG_SIMPLE); put_begin(d, NULL, "[", STATE_SIMPLE);
SPA_POD_ARRAY_BODY_FOREACH(b, size, p) SPA_POD_ARRAY_BODY_FOREACH(b, size, p)
put_pod_value(d, NULL, info, b->child.type, p, b->child.size); put_pod_value(d, NULL, info, b->child.type, p, b->child.size);
put_end(d, "]", FLAG_SIMPLE); put_end(d, "]", STATE_SIMPLE);
break; break;
} }
case SPA_TYPE_Choice: case SPA_TYPE_Choice:
@ -474,7 +454,7 @@ static void put_params(struct data *d, const char *key,
struct param *p; struct param *p;
uint32_t flags; uint32_t flags;
flags = pi->flags & SPA_PARAM_INFO_READ ? 0 : FLAG_SIMPLE; flags = pi->flags & SPA_PARAM_INFO_READ ? 0 : STATE_SIMPLE;
put_begin(d, spa_debug_type_find_short_name(spa_type_param, pi->id), put_begin(d, spa_debug_type_find_short_name(spa_type_param, pi->id),
"[", flags); "[", flags);
@ -496,12 +476,12 @@ static void put_flags(struct data *d, const char *key,
uint64_t flags, struct flags_info *info) uint64_t flags, struct flags_info *info)
{ {
uint32_t i; uint32_t i;
put_begin(d, key, "[", FLAG_SIMPLE); put_begin(d, key, "[", STATE_SIMPLE);
for (i = 0; info[i].name != NULL; i++) { for (i = 0; info[i].name != NULL; i++) {
if (info[i].mask & flags) if (info[i].mask & flags)
put_string(d, NULL, info[i].name); put_string(d, NULL, info[i].name);
} }
put_end(d, "]", FLAG_SIMPLE); put_end(d, "]", STATE_SIMPLE);
} }
/* core */ /* core */
@ -1219,6 +1199,7 @@ static void dump_objects(struct data *d)
{ "m", PW_PERM_M }, { "m", PW_PERM_M },
{ NULL, }, { NULL, },
}; };
d->state = STATE_FIRST;
put_begin(d, NULL, "[", 0); put_begin(d, NULL, "[", 0);
spa_list_for_each(o, &d->object_list, link) { spa_list_for_each(o, &d->object_list, link) {
if (d->id != SPA_ID_INVALID && d->id != o->id) if (d->id != SPA_ID_INVALID && d->id != o->id)