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