diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2018-03-11 22:02:30 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2018-03-11 22:18:50 +0100 |
| commit | d0efde07da335310b2e9da3bb9a690c2123fbc5e (patch) | |
| tree | 47f4b2e3181cb45ec865a6122fbbf840f4698532 /text-util.c | |
| parent | fdb56b003c9e0a00ded2878b0c174a7780bb39b2 (diff) | |
| download | vis-d0efde07da335310b2e9da3bb9a690c2123fbc5e.tar.gz vis-d0efde07da335310b2e9da3bb9a690c2123fbc5e.tar.xz | |
Reset parsing state after mbrtowc(3) failure
The standard says "if an encoding error occurs ... the conversion state
is unspecified".
Diffstat (limited to 'text-util.c')
| -rw-r--r-- | text-util.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/text-util.c b/text-util.c index 4936d92..3cc994e 100644 --- a/text-util.c +++ b/text-util.c @@ -63,6 +63,7 @@ int text_char_count(const char *data, size_t len) { wchar_t wc; size_t wclen = mbrtowc(&wc, data, len, &ps); if (wclen == (size_t)-1 && errno == EILSEQ) { + ps = (mbstate_t){0}; count++; while (!ISUTF8(*data)) data++, len--; @@ -93,6 +94,7 @@ int text_string_width(const char *data, size_t len) { wchar_t wc; size_t wclen = mbrtowc(&wc, s, len, &ps); if (wclen == (size_t)-1 && errno == EILSEQ) { + ps = (mbstate_t){0}; /* assume a replacement symbol will be displayed */ width++; wclen = 1; |
