add a print utf-8 function that can directly print the data - sfeed_curses - sfeed curses UI (now part of sfeed, development is in sfeed)
 (HTM) git clone git://git.codemadness.org/sfeed_curses
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit a9deda50bcc3a23a8876237cd72b69c62ac21db0
 (DIR) parent a8843881faa9f53eaa614a162e8e3e89094f92c5
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Tue, 16 Mar 2021 18:03:12 +0100
       
       add a print utf-8 function that can directly print the data
       
       This avoids unnecesary buffering and an empty line when the line is very long.
       
       Diffstat:
         M sfeed_curses.c                      |      60 +++++++++++++++++++++++++++++--
       
       1 file changed, 57 insertions(+), 3 deletions(-)
       ---
 (DIR) diff --git a/sfeed_curses.c b/sfeed_curses.c
       @@ -430,12 +430,66 @@ utf8pad(char *buf, size_t bufsiz, const char *s, size_t len, int pad)
                return 0;
        }
        
       +/* print `len' columns of characters. If string is shorter pad the rest with
       + * characters `pad`. */
       +void
       +printutf8pad(FILE *fp, const char *s, size_t len, int pad)
       +{
       +        wchar_t wc;
       +        size_t col = 0, i, slen;
       +        int inc, rl, w;
       +
       +        if (!len)
       +                return;
       +
       +        slen = strlen(s);
       +        for (i = 0; i < slen; i += inc) {
       +                inc = 1; /* next byte */
       +                if ((unsigned char)s[i] < 32) {
       +                        continue; /* skip control characters */
       +                } else if ((unsigned char)s[i] >= 127) {
       +                        rl = mbtowc(&wc, s + i, slen - i < 4 ? slen - i : 4);
       +                        inc = rl;
       +                        if (rl < 0) {
       +                                mbtowc(NULL, NULL, 0); /* reset state */
       +                                inc = 1; /* invalid, seek next byte */
       +                                w = 1; /* replacement char is one width */
       +                        } else if ((w = wcwidth(wc)) == -1) {
       +                                continue;
       +                        }
       +
       +                        if (col + w > len || (col + w == len && s[i + inc])) {
       +                                fputs("\xe2\x80\xa6", fp); /* ellipsis */
       +                                col++;
       +                                break;
       +                        } else if (rl < 0) {
       +                                fputs("\xef\xbf\xbd", fp); /* replacement */
       +                                col++;
       +                                continue;
       +                        }
       +                        fwrite(&s[i], 1, rl, fp);
       +                        col += w;
       +                } else {
       +                        /* optimization: simple ASCII character */
       +                        if (col + 1 > len || (col + 1 == len && s[i + 1])) {
       +                                fputs("\xe2\x80\xa6", fp); /* ellipsis */
       +                                col++;
       +                                break;
       +                        }
       +                        putc(s[i], fp);
       +                        col++;
       +                }
       +
       +        }
       +        for (; col < len; ++col)
       +                putc(pad, fp);
       +}
       +
        void
        printpad(const char *s, int width)
        {
       -        char buf[1024];
       -        if (utf8pad(buf, sizeof(buf), s, width, ' ') != -1)
       -                ttywrite(buf);
       +        printutf8pad(stdout, s, width, ' ');
       +        fflush(stdout);
        }
        
        void