commit 4bfb9d8a59bbb4e10db58e6847b01e6b7ec9ba19
parent 08a5e9d6448773b5dff7eb91ef3bf776ef0ca5f9
Author: Andrew Kloet <andrew@kloet.net>
Date: Fri, 1 May 2026 13:51:15 -0400
pushl: wrap characters instead of words
This feature added significant complexity with a double pass lookup of
words to determine if they would go over the line length. This feature
may be added back as an optional patch.
Diffstat:
| M | cio.c | | | 50 | ++++++++++++++++---------------------------------- |
1 file changed, 16 insertions(+), 34 deletions(-)
diff --git a/cio.c b/cio.c
@@ -374,43 +374,25 @@ pushl(char *p, char *e)
if (!eol) eol = e;
mbtowc(NULL, NULL, 0);
while (p < eol) {
- char *word_end = p;
- int word_width = 0;
- while (word_end < eol) {
- wchar_t wwc;
- int wn = mbtowc(&wwc, word_end, eol - word_end);
- if (wn <= 0 || iswspace(wwc)) break;
- int wcl = wcwidth(wwc);
- if (wcl > 0) word_width += wcl;
- word_end += wn;
+ if ((n = mbtowc(&wc, p, eol - p)) <= 0) {
+ mbtowc(NULL, NULL, 0);
+ wc = L'?'; n = 1;
}
- if (x + word_width >= scr.x && word_width < (scr.x - INDENT)) {
- waddch(scr.mw, '\n');
- for (x = 0; x < INDENT; x++) waddch(scr.mw, ' ');
- while (p < eol && iswspace(*p)) p++;
- }
- while (p < eol) {
- if ((n = mbtowc(&wc, p, eol - p)) <= 0) {
- mbtowc(NULL, NULL, 0);
- wc = L'?'; n = 1;
- }
- if (iswcntrl(wc)) {
- p += n;
- continue;
- }
- cl = wcwidth(wc);
- if (cl < 0) cl = 0;
- if (x + cl >= (size_t)scr.x) {
- waddch(scr.mw, '\n');
- for (x = 0; x < INDENT; x++)
- waddch(scr.mw, ' ');
- }
- setcchar(&cc, &wc, 0, 0, 0);
- wadd_wch(scr.mw, &cc);
- x += cl;
+ if (iswcntrl(wc)) {
p += n;
- if (iswspace(wc)) break;
+ continue;
+ }
+ cl = wcwidth(wc);
+ if (cl < 0) cl = 0;
+ if (x + cl >= (size_t)scr.x) {
+ waddch(scr.mw, '\n');
+ for (x = 0; x < INDENT; x++)
+ waddch(scr.mw, ' ');
}
+ setcchar(&cc, &wc, 0, 0, 0);
+ wadd_wch(scr.mw, &cc);
+ x += cl;
+ p += n;
}
return (eol < e) ? eol + 1 : e;
}