aboutsummaryrefslogtreecommitdiff
path: root/text-motions.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2018-03-11 22:02:30 +0100
committerMarc André Tanner <mat@brain-dump.org>2018-03-11 22:18:50 +0100
commitd0efde07da335310b2e9da3bb9a690c2123fbc5e (patch)
tree47f4b2e3181cb45ec865a6122fbbf840f4698532 /text-motions.c
parentfdb56b003c9e0a00ded2878b0c174a7780bb39b2 (diff)
downloadvis-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-motions.c')
-rw-r--r--text-motions.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/text-motions.c b/text-motions.c
index d44e623..68f43b5 100644
--- a/text-motions.c
+++ b/text-motions.c
@@ -199,6 +199,7 @@ int text_line_width_get(Text *txt, size_t pos) {
wchar_t wc;
size_t wclen = mbrtowc(&wc, buf, len, &ps);
if (wclen == (size_t)-1 && errno == EILSEQ) {
+ ps = (mbstate_t){0};
/* assume a replacement symbol will be displayed */
width++;
} else if (wclen == (size_t)-2) {
@@ -236,6 +237,7 @@ size_t text_line_width_set(Text *txt, size_t pos, int width) {
wchar_t wc;
size_t wclen = mbrtowc(&wc, buf, len, &ps);
if (wclen == (size_t)-1 && errno == EILSEQ) {
+ ps = (mbstate_t){0};
/* assume a replacement symbol will be displayed */
cur_width++;
} else if (wclen == (size_t)-2) {