|
|
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) |
|
|
 |
git clone git://git.codemadness.org/sfeed_curses (git://git.codemadness.org) |
|
|
 |
Log |
|
|
 |
Files |
|
|
 |
Refs |
|
|
 |
README |
|
|
 |
LICENSE |
|
|
|
--- |
|
|
 |
commit a9deda50bcc3a23a8876237cd72b69c62ac21db0 |
|
|
 |
parent a8843881faa9f53eaa614a162e8e3e89094f92c5 |
|
|
 |
Author: Hiltjo Posthuma <hiltjo@codemadness.org> (mailto://) |
application/vnd.lotus-organizer |
|
|
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(-) |
|
|
|
--- |
|
|
 |
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 |
|