imbsprint: improve printing output when it has invalid UTF data - 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 edab539b23594219bbfc83729822da917a18a243 /scm/sacc/commit/edab539b23594219bbfc83729822da917a18a243.gph bitreich.org 70 1parent c416c8c73d0a33eb8c428b1a9b9eaaffc098ee5b /scm/sacc/commit/c416c8c73d0a33eb8c428b1a9b9eaaffc098ee5b.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Tue, 5 Jan 2021 21:21:03 +0100 Err bitreich.org 70 i Err bitreich.org 70 imbsprint: improve printing output when it has invalid UTF data Err bitreich.org 70 i Err bitreich.org 70 iReset the decode state when mbtowc returns -1. The OpenBSD mbtowc(3) Err bitreich.org 70 iman page says: "If a call to mbtowc() resulted in an undefined internal Err bitreich.org 70 istate, mbtowc() must be called with s set to NULL to reset the internal Err bitreich.org 70 istate before it can safely be used again." Err bitreich.org 70 i Err bitreich.org 70 iPrint the UTF replacement character (codepoint 0xfffd) for the invalid Err bitreich.org 70 icodepoint or incomplete sequence and continue printing the line Err bitreich.org 70 i(instead of stopping). Err bitreich.org 70 i Err bitreich.org 70 iRemove the 0 return code as it can't happen because we're already Err bitreich.org 70 ichecking the string length in the loop. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M sacc.c | 12 +++++++++--- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 9 insertions(+), 3 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@@ -110,12 +110,18 @@ mbsprint(const char *s, size_t len) Err bitreich.org 70 i Err bitreich.org 70 i slen = strlen(s); Err bitreich.org 70 i for (i = 0; i < slen; i += rl) { Err bitreich.org 70 i- if ((rl = mbtowc(&wc, s + i, slen - i < 4 ? slen - i : 4)) <= 0) Err bitreich.org 70 i- break; 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+ } 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); 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 .