cio

a simple irc client
Download | Log | Files | Refs | README | LICENSE

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:
Mcio.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; }