Index: enter.c =================================================================== RCS file: /home/roessler/cvs/mutt/enter.c,v retrieving revision 2.30 retrieving revision 2.31 diff -u -r2.30 -r2.31 --- enter.c 2001/01/08 23:09:30 2.30 +++ enter.c 2001/04/09 14:37:26 2.31 @@ -198,8 +198,11 @@ wchar_t *tempbuf = 0; size_t templen = 0; history_class_t hclass; + wchar_t wc; + mbstate_t mbstate; int rv = 0; + memset (&mbstate, 0, sizeof (mbstate)); if (state->wbuf) { @@ -611,14 +614,34 @@ /* use the raw keypress */ ch = LastKey; + /* this probably shouldn't happen */ + if (ch & ~0xff) + continue; + + /* gather the octets into a wide character */ + { + char c; + size_t k; + + c = ch; + k = mbrtowc (&wc, &c, 1, &mbstate); + if (k == (size_t)(-2)) + continue; + else if (k && k != 1) + { + memset (&mbstate, 0, sizeof (mbstate)); + continue; + } + } + if (first && (flags & M_CLEAR)) { first = 0; - if (IsWPrint (ch)) /* why? */ + if (IsWPrint (wc)) /* why? */ state->curpos = state->lastchar = 0; } - if (CI_is_return (ch)) + if (wc == '\r' || wc == '\n') { /* Convert from wide characters */ my_wcstombs (buf, buflen, state->wbuf, state->lastchar); @@ -637,7 +660,7 @@ rv = 0; goto bye; } - else if (ch && (ch < ' ' || IsWPrint (ch))) /* why? */ + else if (wc && (wc < ' ' || IsWPrint (wc))) /* why? */ { if (state->lastchar >= state->wbuflen) { @@ -645,7 +668,7 @@ safe_realloc ((void **) &state->wbuf, state->wbuflen * sizeof (wchar_t)); } memmove (state->wbuf + state->curpos + 1, state->wbuf + state->curpos, (state->lastchar - state->curpos) * sizeof (wchar_t)); - state->wbuf[state->curpos++] = ch; + state->wbuf[state->curpos++] = wc; state->lastchar++; } else