imbsprint: fix character encoding errors handling - sacc - sacc(omys), simple console gopher client Err bitreich.org 70 hgit clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ URL:git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ bitreich.org 70 1Log /scm/sacc/log.gph bitreich.org 70 1Files /scm/sacc/files.gph bitreich.org 70 1Refs /scm/sacc/refs.gph bitreich.org 70 1Tags /scm/sacc/tag bitreich.org 70 1LICENSE /scm/sacc/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit cd386e712b7587740115c0fb0815a43052758ae2 /scm/sacc/commit/cd386e712b7587740115c0fb0815a43052758ae2.gph bitreich.org 70 1parent 0a5b9f60e25411cf2fbd6688e8be5a7326f2b28d /scm/sacc/commit/0a5b9f60e25411cf2fbd6688e8be5a7326f2b28d.gph bitreich.org 70 hAuthor: Quentin Rameau URL:mailto:quinq@fifth.space bitreich.org 70 iDate: Sun, 24 Jan 2021 14:53:06 +0100 Err bitreich.org 70 i Err bitreich.org 70 imbsprint: fix character encoding errors handling Err bitreich.org 70 i Err bitreich.org 70 iWe were not advancing the input string correctly in case of error. Err bitreich.org 70 iNow we do that and print in a slightly more unified way. Err bitreich.org 70 i Err bitreich.org 70 iSend remarks to Hiltjo@melikenobugs.tk Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M sacc.c | 22 +++++++++++++--------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 13 insertions(+), 9 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/sacc.c b/sacc.c /scm/sacc/file/sacc.c.gph bitreich.org 70 i@@ -103,7 +103,8 @@ mbsprint(const char *s, size_t len) Err bitreich.org 70 i { Err bitreich.org 70 i wchar_t wc; Err bitreich.org 70 i size_t col = 0, i, slen; Err bitreich.org 70 i- int rl, w; Err bitreich.org 70 i+ const char *p; Err bitreich.org 70 i+ int rl, pl, w; Err bitreich.org 70 i Err bitreich.org 70 i if (!len) Err bitreich.org 70 i return col; Err bitreich.org 70 i@@ -112,20 +113,23 @@ mbsprint(const char *s, size_t len) Err bitreich.org 70 i for (i = 0; i < slen; i += rl) { Err bitreich.org 70 i rl = mbtowc(&wc, s + i, slen - i < 4 ? slen - i : 4); Err bitreich.org 70 i if (rl == -1) { Err bitreich.org 70 i- mbtowc(NULL, NULL, 0); /* reset state */ Err bitreich.org 70 i- fputs("\xef\xbf\xbd", stdout); /* replacement character */ Err bitreich.org 70 i- col++; Err bitreich.org 70 i- rl = 1; Err bitreich.org 70 i- continue; Err bitreich.org 70 i+ /* reset state */ Err bitreich.org 70 i+ mbtowc(NULL, NULL, 0); Err bitreich.org 70 i+ p = "\xef\xbf\xbd"; /* replacement character */ Err bitreich.org 70 i+ pl = 3; Err bitreich.org 70 i+ rl = w = 1; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ if ((w = wcwidth(wc)) == -1) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ pl = rl; Err bitreich.org 70 i+ p = s + i; Err bitreich.org 70 i } Err bitreich.org 70 i- if ((w = wcwidth(wc)) == -1) Err bitreich.org 70 i- continue; Err bitreich.org 70 i if (col + w > len || (col + w == len && s[i + rl])) { Err bitreich.org 70 i fputs("\xe2\x80\xa6", stdout); /* ellipsis */ Err bitreich.org 70 i col++; Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i- fwrite(s + i, 1, rl, stdout); Err bitreich.org 70 i+ fwrite(p, 1, pl, stdout); Err bitreich.org 70 i col += w; Err bitreich.org 70 i } Err bitreich.org 70 i return col; Err bitreich.org 70 .