optimize printing the index of an array with the -n option - json2tsv - JSON to TSV converter
 (HTM) git clone git://git.codemadness.org/json2tsv
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 7c6507b10767029b3d4585e3e65d231f66fa904b
 (DIR) parent 18215ba6f1a9f2c76ffceded0670eb2b2f466792
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Fri, 24 Sep 2021 14:27:38 +0200
       
       optimize printing the index of an array with the -n option
       
       Diffstat:
         M json2tsv.c                          |      35 +++++++++++++++++++++++++------
       
       1 file changed, 29 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/json2tsv.c b/json2tsv.c
       @@ -1,5 +1,7 @@
        #include <ctype.h>
        #include <errno.h>
       +#include <limits.h>
       +#include <stdint.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
       @@ -48,6 +50,29 @@ rs_printvalue(const char *s)
                }
        }
        
       +/* optimized printing an unsigned number (compared to printf("%zu"); */
       +void
       +printnum(uintmax_t x)
       +{
       +        char buf[64], *s, *e;
       +        unsigned long y;
       +
       +        if (!x) {
       +                putchar('0');
       +                return;
       +        }
       +
       +        s = e = buf + sizeof(buf) - 1;
       +
       +        for (; x > ULONG_MAX; x /= 10)
       +                *--s = '0' + x % 10;
       +        for (y = x; y; y /= 10)
       +                *--s = '0' + y % 10;
       +
       +        for (; s < e; s++)
       +                putchar(*s);
       +}
       +
        void
        processnode(struct json_node *nodes, size_t depth, const char *value)
        {
       @@ -64,12 +89,10 @@ processnode(struct json_node *nodes, size_t depth, const char *value)
                        if (nodes[i].type == JSON_TYPE_OBJECT) {
                                putchar('.');
                        } else if (nodes[i].type == JSON_TYPE_ARRAY) {
       -                        if (nflag) {
       -                                printf("[%zu]", nodes[i].index);
       -                        } else {
       -                                putchar('[');
       -                                putchar(']');
       -                        }
       +                        putchar('[');
       +                        if (nflag)
       +                                printnum(nodes[i].index);
       +                        putchar(']');
                        }
                }