]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/jsonwrt: remove 'islast' from API
authorKarel Zak <kzak@redhat.com>
Thu, 6 May 2021 13:58:02 +0000 (15:58 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 6 May 2021 13:58:02 +0000 (15:58 +0200)
The code should be able to keep track about previous content and print
JSON objects separator automatically.

Signed-off-by: Karel Zak <kzak@redhat.com>
include/jsonwrt.h
lib/jsonwrt.c
libfdisk/src/script.c
libsmartcols/src/print-api.c
libsmartcols/src/print.c

index 04ef49e6ff648c66c9d9ad0c6ceec76a1f1f148f..5be2d70cd6ee25c7d70df088f6fba426dcda5b82 100644 (file)
@@ -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 */
index 94b4a5dda8d69e2f01c90cbe90f4db7cf577363c..61b328920019eeddfc98a855d4e0c2a3d6019649 100644 (file)
@@ -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);
 }
-
index 3005a3ccbbfd92f032bc7fe67e3d5362a5a56afb..5e82d52078e3f24649e93413e0f9e085c3c08e03 100644 (file)
@@ -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"));
index 89dd3bf9b0f7f4a0db0ecbda5285067e04a0f3d8..50df96416f7d48d1e0996b5f2bf82ed85bbc00d5 100644 (file)
@@ -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:
index 931d33194a23573148d29c2c78ab951f3c19530e..9f60148481e8e65f431d4c7ee4039131821be23d 100644 (file)
@@ -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);