youtube: make util function from format printing thousand separated numbers - frontends - front-ends for some sites (experiment)
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit a9e2584bc6c2b314c4f1b6d6a5f4715161d64bc5
 (DIR) parent 634c895fbf8796d04bea2c0fef6615110c9ef951
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Tue,  7 Mar 2023 19:32:47 +0100
       
       youtube: make util function from format printing thousand separated numbers
       
       In other programs print views this way too.
       
       Diffstat:
         M util.c                              |      26 ++++++++++++++++++++++++++
         M util.h                              |       1 +
         M youtube/cgi.c                       |       7 ++++---
         M youtube/cli.c                       |       5 +++--
         M youtube/gopher.c                    |      30 ++----------------------------
       
       5 files changed, 36 insertions(+), 33 deletions(-)
       ---
 (DIR) diff --git a/util.c b/util.c
       @@ -221,3 +221,29 @@ durationstr(long secs, char *buf, size_t bufsiz)
        
                return r;
        }
       +
       +/* print views with thousand separators */
       +void
       +printnumsep(const char *s)
       +{
       +        const char *p;
       +        int ndigits = 0;
       +
       +        /* first count all digits */
       +        for (p = s; *p; p++)
       +                if (*p >= '0' && *p <= '9')
       +                        ndigits++;
       +
       +        for (p = s; *p; p++) {
       +                if (!(*p >= '0' && *p <= '9'))
       +                        continue;
       +
       +                putchar(*p);
       +                ndigits--;
       +
       +                /* show separator on every 3 digits and when there are
       +                   digits remaining */
       +                if ((ndigits % 3) == 0 && ndigits > 0)
       +                        putchar(',');
       +        }
       +}
 (DIR) diff --git a/util.h b/util.h
       @@ -14,6 +14,7 @@ int friendlytime(time_t now, time_t t);
        char *getparam(const char *query, const char *s);
        void gophertext(FILE *fp, const char *s, size_t len);
        int hexdigit(int c);
       +void printnumsep(const char *s);
        int uriencode(const char *s, char *buf, size_t bufsiz);
        int utf8pad(char *buf, size_t bufsiz, const char *s, size_t len, int pad);
        void xmlencode(const char *s);
 (DIR) diff --git a/youtube/cgi.c b/youtube/cgi.c
       @@ -281,9 +281,9 @@ render_search(struct search_response *r)
                                        OUT("</span><br/>\n");
                                }
                                OUT("                <span class=\"stats\">");
       -                        OUT(v->viewcount);
       +                        printnumsep(v->viewcount);
                                OUT(
       -                                "</span><br/>\n"
       +                                " views</span><br/>\n"
                                        "        </td>\n"
                                        "        <td align=\"right\" class=\"a-r\">\n"
                                        "                <span class=\"duration\">");
       @@ -366,7 +366,8 @@ render_video(struct video_response *r)
                }
        
                OUT("<tr><td><b>Views:</b></td><td>");
       -        printf("%ld", r->viewcount);
       +        snprintf(buf, sizeof(buf), "%ld", r->viewcount);
       +        printnumsep(buf);
                OUT("</td></tr>\n");
        
                if (r->publishdate[0]) {
 (DIR) diff --git a/youtube/cli.c b/youtube/cli.c
       @@ -149,7 +149,7 @@ render_search(struct search_response *r)
                        }
                        if (v->viewcount[0]) {
                                OUT("Views:     ");
       -                        OUTESCAPE(v->viewcount);
       +                        printnumsep(v->viewcount);
                                OUT("\n");
                        }
                        OUT("\n");
       @@ -182,7 +182,8 @@ render_video(struct video_response *r)
                }
        
                OUT("Views:     ");
       -        printf("%ld", r->viewcount);
       +        snprintf(buf, sizeof(buf), "%ld", r->viewcount);
       +        printnumsep(buf);
                OUT("\n");
        
                if (r->publishdate[0]) {
 (DIR) diff --git a/youtube/gopher.c b/youtube/gopher.c
       @@ -42,32 +42,6 @@ info(const char *s)
                line('i', s, "");
        }
        
       -/* print views with thousand separators */
       -static void
       -printviews(const char *s)
       -{
       -        const char *p;
       -        int ndigits = 0;
       -
       -        /* first count all digits */
       -        for (p = s; *p; p++)
       -                if (*p >= '0' && *p <= '9')
       -                        ndigits++;
       -
       -        for (p = s; *p; p++) {
       -                if (!(*p >= '0' && *p <= '9'))
       -                        continue;
       -
       -                putchar(*p);
       -                ndigits--;
       -
       -                /* show separator on every 3 digits and when there are
       -                   digits remaining */
       -                if ((ndigits % 3) == 0 && ndigits > 0)
       -                        putchar(',');
       -        }
       -}
       -
        void
        header(void)
        {
       @@ -177,7 +151,7 @@ render_search(struct search_response *r)
                        }
                        if (v->viewcount[0]) {
                                OUT("iViews:         ");
       -                        printviews(v->viewcount);
       +                        printnumsep(v->viewcount);
                                printf("\t%s\t%s\t%s\r\n", "", host, port);
                        }
                }
       @@ -238,7 +212,7 @@ render_video(struct video_response *r)
        
                OUT("iViews:     ");
                snprintf(buf, sizeof(buf), "%ld", r->viewcount);
       -        printviews(buf);
       +        printnumsep(buf);
                printf("\t%s\t%s\t%s\r\n", "", host, port);
        
                if (r->publishdate[0]) {