From: Karel Zak Date: Thu, 6 May 2021 13:58:02 +0000 (+0200) Subject: lib/jsonwrt: remove 'islast' from API X-Git-Tag: v2.37-rc2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d124a780348a7123a92b9138cba2c4982e1b7491;p=thirdparty%2Futil-linux.git lib/jsonwrt: remove 'islast' from API The code should be able to keep track about previous content and print JSON objects separator automatically. Signed-off-by: Karel Zak --- diff --git a/include/jsonwrt.h b/include/jsonwrt.h index 04ef49e6ff..5be2d70cd6 100644 --- a/include/jsonwrt.h +++ b/include/jsonwrt.h @@ -11,34 +11,34 @@ struct ul_jsonwrt { 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 */ diff --git a/lib/jsonwrt.c b/lib/jsonwrt.c index 94b4a5dda8..61b3289200 100644 --- a/lib/jsonwrt.c +++ b/lib/jsonwrt.c @@ -18,6 +18,7 @@ void ul_jsonwrt_init(struct ul_jsonwrt *fmt, FILE *out, int indent) { fmt->out = out; fmt->indent = indent; + fmt->after_close = 0; } void ul_jsonwrt_indent(struct ul_jsonwrt *fmt) @@ -30,12 +31,16 @@ 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) { @@ -51,14 +56,15 @@ void ul_jsonwrt_open(struct ul_jsonwrt *fmt, const char *name, int 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); @@ -66,63 +72,57 @@ void ul_jsonwrt_close(struct ul_jsonwrt *fmt, int type, int islast) 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); } - diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c index 3005a3ccbb..5e82d52078 100644 --- a/libfdisk/src/script.c +++ b/libfdisk/src/script.c @@ -568,7 +568,7 @@ static int write_file_json(struct fdisk_script *dp, FILE *f) 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"; @@ -582,14 +582,10 @@ static int write_file_json(struct fdisk_script *dp, FILE *f) } 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; @@ -615,45 +611,45 @@ static int write_file_json(struct fdisk_script *dp, FILE *f) 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")); diff --git a/libsmartcols/src/print-api.c b/libsmartcols/src/print-api.c index 89dd3bf9b0..50df96416f 100644 --- a/libsmartcols/src/print-api.c +++ b/libsmartcols/src/print-api.c @@ -120,7 +120,7 @@ static int do_print_table(struct libscols_table *tb, int *is_empty) 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; @@ -150,7 +150,7 @@ static int do_print_table(struct libscols_table *tb, int *is_empty) 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: diff --git a/libsmartcols/src/print.c b/libsmartcols/src/print.c index 931d33194a..9f60148481 100644 --- a/libsmartcols/src/print.c +++ b/libsmartcols/src/print.c @@ -512,25 +512,23 @@ err: 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: @@ -538,18 +536,18 @@ static void print_json_data(struct libscols_table *tb, 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; } } @@ -600,7 +598,7 @@ static int print_data(struct libscols_table *tb, 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: @@ -976,7 +974,7 @@ int __scols_print_range(struct libscols_table *tb, 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++; @@ -1036,9 +1034,9 @@ static int print_tree_line(struct libscols_table *tb, 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);