FILE *out;
int indent;
- unsigned int postponed_break :1;
+ unsigned int after_close :1;
};
void ul_jsonwrt_init(struct ul_jsonwrt *fmt, FILE *out, int indent);
void ul_jsonwrt_indent(struct ul_jsonwrt *fmt);
void ul_jsonwrt_open(struct ul_jsonwrt *fmt, const char *name, int type);
-void ul_jsonwrt_close(struct ul_jsonwrt *fmt, int type, int islast);
+void ul_jsonwrt_close(struct ul_jsonwrt *fmt, int type);
#define ul_jsonwrt_root_open(_f) ul_jsonwrt_open(_f, NULL, UL_JSON_OBJECT)
-#define ul_jsonwrt_root_close(_f) ul_jsonwrt_close(_f, UL_JSON_OBJECT, 1)
+#define ul_jsonwrt_root_close(_f) ul_jsonwrt_close(_f, UL_JSON_OBJECT)
#define ul_jsonwrt_array_open(_f, _n) ul_jsonwrt_open(_f, _n, UL_JSON_ARRAY)
-#define ul_jsonwrt_array_close(_f, _l) ul_jsonwrt_close(_f, UL_JSON_ARRAY, _l)
+#define ul_jsonwrt_array_close(_f) ul_jsonwrt_close(_f, UL_JSON_ARRAY)
#define ul_jsonwrt_object_open(_f, _n) ul_jsonwrt_open(_f, _n, UL_JSON_OBJECT)
-#define ul_jsonwrt_object_close(_f, _l) ul_jsonwrt_close(_f, UL_JSON_OBJECT, _l)
+#define ul_jsonwrt_object_close(_f) ul_jsonwrt_close(_f, UL_JSON_OBJECT)
#define ul_jsonwrt_value_open(_f, _n) ul_jsonwrt_open(_f, _n, UL_JSON_VALUE)
-#define ul_jsonwrt_value_close(_f, _l) ul_jsonwrt_close(_f, UL_JSON_VALUE, _l)
+#define ul_jsonwrt_value_close(_f) ul_jsonwrt_close(_f, UL_JSON_VALUE)
void ul_jsonwrt_value_raw(struct ul_jsonwrt *fmt,
- const char *name, const char *data, int islast);
+ const char *name, const char *data);
void ul_jsonwrt_value_s(struct ul_jsonwrt *fmt,
- const char *name, const char *data, int islast);
+ const char *name, const char *data);
void ul_jsonwrt_value_u64(struct ul_jsonwrt *fmt,
- const char *name, uint64_t data, int islast);
+ const char *name, uint64_t data);
void ul_jsonwrt_value_boolean(struct ul_jsonwrt *fmt,
- const char *name, int data, int islast);
+ const char *name, int data);
#endif /* UTIL_LINUX_JSONWRT_H */
{
fmt->out = out;
fmt->indent = indent;
+ fmt->after_close = 0;
}
void ul_jsonwrt_indent(struct ul_jsonwrt *fmt)
void ul_jsonwrt_open(struct ul_jsonwrt *fmt, const char *name, int type)
{
- if (fmt->postponed_break && !name)
- ;
- else {
+ if (name) {
+ if (fmt->after_close)
+ fputs(",\n", fmt->out);
ul_jsonwrt_indent(fmt);
- if (name)
- fputs_quoted_json_lower(name, fmt->out);
+ fputs_quoted_json_lower(name, fmt->out);
+ } else {
+ if (fmt->after_close)
+ fputs(",", fmt->out);
+ else
+ ul_jsonwrt_indent(fmt);
}
switch (type) {
fputs(name ? ": " : " ", fmt->out);
break;
}
- fmt->postponed_break = 0;
+ fmt->after_close = 0;
}
-void ul_jsonwrt_close(struct ul_jsonwrt *fmt, int type, int islast)
+void ul_jsonwrt_close(struct ul_jsonwrt *fmt, int type)
{
- if (fmt->indent == 0) {
- fputs("}\n", fmt->out);
+ if (fmt->indent == 1) {
+ fputs("\n}\n", fmt->out);
fmt->indent--;
+ fmt->after_close = 1;
return;
}
assert(fmt->indent > 0);
switch (type) {
case UL_JSON_OBJECT:
fmt->indent--;
+ fputc('\n', fmt->out);
ul_jsonwrt_indent(fmt);
- fputs(islast ? "}" : "},", fmt->out);
+ fputs("}", fmt->out);
break;
case UL_JSON_ARRAY:
fmt->indent--;
+ fputc('\n', fmt->out);
ul_jsonwrt_indent(fmt);
- fputs(islast ? "]" : "],", fmt->out);
+ fputs("]", fmt->out);
break;
case UL_JSON_VALUE:
- if (!islast)
- fputc(',', fmt->out);
break;
}
- if (!islast && (type == UL_JSON_OBJECT || type == UL_JSON_ARRAY))
- fmt->postponed_break = 1;
- else {
- fputc('\n', fmt->out);
- fmt->postponed_break = 0;
- }
+ fmt->after_close = 1;
}
void ul_jsonwrt_value_raw(struct ul_jsonwrt *fmt,
- const char *name, const char *data, int islast)
+ const char *name, const char *data)
{
ul_jsonwrt_value_open(fmt, name);
if (data && *data)
fputs(data, fmt->out);
else
fputs("null", fmt->out);
- ul_jsonwrt_value_close(fmt, islast);
+ ul_jsonwrt_value_close(fmt);
}
void ul_jsonwrt_value_s(struct ul_jsonwrt *fmt,
- const char *name, const char *data, int islast)
+ const char *name, const char *data)
{
ul_jsonwrt_value_open(fmt, name);
if (data && *data)
fputs_quoted_json(data, fmt->out);
else
fputs("null", fmt->out);
- ul_jsonwrt_value_close(fmt, islast);
+ ul_jsonwrt_value_close(fmt);
}
void ul_jsonwrt_value_u64(struct ul_jsonwrt *fmt,
- const char *name, uint64_t data, int islast)
+ const char *name, uint64_t data)
{
ul_jsonwrt_value_open(fmt, name);
fprintf(fmt->out, "%"PRIu64, data);
- ul_jsonwrt_value_close(fmt, islast);
+ ul_jsonwrt_value_close(fmt);
}
void ul_jsonwrt_value_boolean(struct ul_jsonwrt *fmt,
- const char *name, int data, int islast)
+ const char *name, int data)
{
ul_jsonwrt_value_open(fmt, name);
fputs(data ? "true" : "false", fmt->out);
- ul_jsonwrt_value_close(fmt, islast);
+ ul_jsonwrt_value_close(fmt);
}
-
list_for_each(h, &dp->headers) {
struct fdisk_scriptheader *fi = list_entry(h, struct fdisk_scriptheader, headers);
const char *name = fi->name;
- int num = 0, islast = 0;
+ int num = 0;
if (strcmp(name, "first-lba") == 0) {
name = "firstlba";
} else if (strcmp(name, "label-id") == 0)
name = "id";
- if ((fi == list_last_entry(&dp->headers, struct fdisk_scriptheader, headers))
- && (!dp->table || fdisk_table_is_empty(dp->table)))
- islast = 1;
-
if (num)
- ul_jsonwrt_value_raw(&json, name, fi->data, islast);
+ ul_jsonwrt_value_raw(&json, name, fi->data);
else
- ul_jsonwrt_value_s(&json, name, fi->data, islast);
+ ul_jsonwrt_value_s(&json, name, fi->data);
if (strcmp(name, "device") == 0)
devname = fi->data;
p = fdisk_partname(devname, pa->partno + 1);
if (p) {
DBG(SCRIPT, ul_debugobj(dp, "write %s entry", p));
- ul_jsonwrt_value_s(&json, "node", p, 0);
+ ul_jsonwrt_value_s(&json, "node", p);
free(p);
}
if (fdisk_partition_has_start(pa))
- ul_jsonwrt_value_u64(&json, "start", (uintmax_t)pa->start, 0);
+ ul_jsonwrt_value_u64(&json, "start", (uintmax_t)pa->start);
if (fdisk_partition_has_size(pa))
- ul_jsonwrt_value_u64(&json, "size", (uintmax_t)pa->size, 0);
+ ul_jsonwrt_value_u64(&json, "size", (uintmax_t)pa->size);
if (pa->type && fdisk_parttype_get_string(pa->type))
- ul_jsonwrt_value_s(&json, "type", fdisk_parttype_get_string(pa->type), 0);
+ ul_jsonwrt_value_s(&json, "type", fdisk_parttype_get_string(pa->type));
else if (pa->type) {
ul_jsonwrt_value_open(&json, "type");
fprintf(f, "\"%x\"", fdisk_parttype_get_code(pa->type));
- ul_jsonwrt_value_close(&json, 0);
+ ul_jsonwrt_value_close(&json);
}
if (pa->uuid)
- ul_jsonwrt_value_s(&json, "uuid", pa->uuid, 0);
+ ul_jsonwrt_value_s(&json, "uuid", pa->uuid);
if (pa->name && *pa->name)
- ul_jsonwrt_value_s(&json, "name", pa->name, 0);
+ ul_jsonwrt_value_s(&json, "name", pa->name);
/* for MBR attr=80 means bootable */
if (pa->attrs) {
struct fdisk_label *lb = script_get_label(dp);
if (!lb || fdisk_label_get_type(lb) != FDISK_DISKLABEL_DOS)
- ul_jsonwrt_value_s(&json, "attrs", pa->attrs, 0);
+ ul_jsonwrt_value_s(&json, "attrs", pa->attrs);
}
- ul_jsonwrt_value_boolean(&json, "bootable", fdisk_partition_is_bootable(pa), 1);
- ul_jsonwrt_object_close(&json, (size_t)ct >= fdisk_table_get_nents(dp->table));
+ ul_jsonwrt_value_boolean(&json, "bootable", fdisk_partition_is_bootable(pa));
+ ul_jsonwrt_object_close(&json);
}
- ul_jsonwrt_array_close(&json, 1);
+ ul_jsonwrt_array_close(&json);
done:
- ul_jsonwrt_object_close(&json, 1);
+ ul_jsonwrt_object_close(&json);
ul_jsonwrt_root_close(&json);
DBG(SCRIPT, ul_debugobj(dp, "write script done"));
ul_jsonwrt_init(&tb->json, tb->out, 0);
ul_jsonwrt_root_open(&tb->json);
ul_jsonwrt_array_open(&tb->json, tb->name);
- ul_jsonwrt_array_close(&tb->json, 1);
+ ul_jsonwrt_array_close(&tb->json);
ul_jsonwrt_root_close(&tb->json);
} else if (is_empty)
*is_empty = 1;
rc = __scols_print_table(tb, buf);
if (scols_table_is_json(tb)) {
- ul_jsonwrt_array_close(&tb->json, 1);
+ ul_jsonwrt_array_close(&tb->json);
ul_jsonwrt_root_close(&tb->json);
}
done:
static void print_json_data(struct libscols_table *tb,
struct libscols_column *cl,
const char *name,
- char *data,
- int is_last)
+ char *data)
{
switch (cl->json_type) {
case SCOLS_JSON_STRING:
/* name: "aaa" */
- ul_jsonwrt_value_s(&tb->json, name, data, is_last);
+ ul_jsonwrt_value_s(&tb->json, name, data);
break;
case SCOLS_JSON_NUMBER:
/* name: 123 */
- ul_jsonwrt_value_raw(&tb->json, name, data, is_last);
+ ul_jsonwrt_value_raw(&tb->json, name, data);
break;
case SCOLS_JSON_BOOLEAN:
/* name: true|false */
ul_jsonwrt_value_boolean(&tb->json, name,
!*data ? 0 :
*data == '0' ? 0 :
- *data == 'N' || *data == 'n' ? 0 : 1,
- is_last);
+ *data == 'N' || *data == 'n' ? 0 : 1);
break;
case SCOLS_JSON_ARRAY_STRING:
case SCOLS_JSON_ARRAY_NUMBER:
ul_jsonwrt_array_open(&tb->json, name);
if (!scols_column_is_customwrap(cl))
- ul_jsonwrt_value_s(&tb->json, NULL, data, 1);
+ ul_jsonwrt_value_s(&tb->json, NULL, data);
else do {
char *next = cl->wrap_nextchunk(cl, data, cl->wrapfunc_data);
if (cl->json_type == SCOLS_JSON_ARRAY_STRING)
- ul_jsonwrt_value_s(&tb->json, NULL, data, next ? 0 : 1);
+ ul_jsonwrt_value_s(&tb->json, NULL, data);
else
- ul_jsonwrt_value_raw(&tb->json, NULL, data, next ? 0 : 1);
+ ul_jsonwrt_value_raw(&tb->json, NULL, data);
data = next;
} while (data);
- ul_jsonwrt_array_close(&tb->json, is_last);
+ ul_jsonwrt_array_close(&tb->json);
break;
}
}
return 0;
case SCOLS_FMT_JSON:
- print_json_data(tb, cl, name, data, is_last);
+ print_json_data(tb, cl, name, data);
return 0;
case SCOLS_FMT_HUMAN:
rc = print_line(tb, ln, buf);
if (scols_table_is_json(tb))
- ul_jsonwrt_object_close(&tb->json, last);
+ ul_jsonwrt_object_close(&tb->json);
else if (last == 0 && tb->no_linesep == 0) {
fputs(linesep(tb), tb->out);
tb->termlines_used++;
last = (is_child(ln) && is_last_child(ln)) ||
(is_tree_root(ln) && is_last_tree_root(tb, ln));
- ul_jsonwrt_object_close(&tb->json, last);
+ ul_jsonwrt_object_close(&tb->json);
if (last && is_child(ln))
- ul_jsonwrt_array_close(&tb->json, last);
+ ul_jsonwrt_array_close(&tb->json);
ln = ln->parent;
} while(ln && last);