mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-02 10:01:11 +02:00
20845: fix mbstate_t usage in getrestchar
This commit is contained in:
parent
85b63c0c03
commit
70f9279060
3 changed files with 14 additions and 13 deletions
|
@ -1,3 +1,9 @@
|
|||
2005-02-23 Andrey Borzenkov <bor@zsh.org>
|
||||
|
||||
* 20845: Src/Zle/zle_main.c, Src/Zle/zle_utils.c: fix
|
||||
multibyte input in getrestchar; fix cursor position in
|
||||
zlelineasstring when cs == ll.
|
||||
|
||||
2005-02-22 Peter Stephenson <pws@csr.com>
|
||||
|
||||
* 20843: Doc/Zsh/expn.yo, Src/utils.c: named directories always
|
||||
|
|
|
@ -749,10 +749,10 @@ mod_export ZLE_INT_T
|
|||
getrestchar(int inchar)
|
||||
{
|
||||
/* char cnull = '\0'; */
|
||||
char buf[MB_CUR_MAX], *ptr;
|
||||
char c = inchar;
|
||||
wchar_t outchar;
|
||||
int ret;
|
||||
mbstate_t ps;
|
||||
static mbstate_t ps;
|
||||
|
||||
/*
|
||||
* We are guaranteed to set a valid wide last character,
|
||||
|
@ -764,28 +764,23 @@ getrestchar(int inchar)
|
|||
if (inchar == EOF)
|
||||
return lastchar_wide = WEOF;
|
||||
|
||||
/* reset shift state by converting null */
|
||||
/* mbrtowc(&outchar, &cnull, 1, &ps); */
|
||||
memset (&ps, '\0', sizeof (ps));
|
||||
|
||||
ptr = buf;
|
||||
*ptr++ = inchar;
|
||||
/*
|
||||
* Return may be zero if we have a NULL; handle this like
|
||||
* any other character.
|
||||
*/
|
||||
while ((ret = mbrtowc(&outchar, buf, ptr - buf, &ps)) < 0) {
|
||||
while ((ret = mbrtowc(&outchar, &c, 1, &ps)) < 0) {
|
||||
if (ret == -1) {
|
||||
/*
|
||||
* Invalid input. Hmm, what's the right thing to do here?
|
||||
*/
|
||||
return lastchar_wide = WEOF;
|
||||
}
|
||||
|
||||
/* No timeout here as we really need the character. */
|
||||
inchar = getbyte(0);
|
||||
if (inchar == EOF)
|
||||
return lastchar_wide = WEOF;
|
||||
*ptr++ = inchar;
|
||||
c = inchar;
|
||||
}
|
||||
return lastchar_wide = (ZLE_INT_T)outchar;
|
||||
}
|
||||
|
|
|
@ -116,8 +116,8 @@ zlelineasstring(ZLE_STRING_T instr, int inll, int incs, int *outll,
|
|||
|
||||
s = zalloc(inll * MB_CUR_MAX + 1);
|
||||
|
||||
for(i=0; i < inll; i++) {
|
||||
if (outcs != NULL && i == incs)
|
||||
for(i=0; i < inll; i++, incs--) {
|
||||
if (outcs != NULL && incs == 0)
|
||||
*outcs = mb_len;
|
||||
j = wctomb(s + mb_len, instr[i]);
|
||||
if (j == -1) {
|
||||
|
@ -206,7 +206,7 @@ stringaszleline(unsigned char *instr, int *outll, int *outsz)
|
|||
wchar_t *outptr = outstr;
|
||||
|
||||
/* mbrtowc(outstr, &cnull, 1, &ps); */
|
||||
memset(&ps, \0, sizeof(ps));
|
||||
memset(&ps, '\0', sizeof(ps));
|
||||
|
||||
while (ll) {
|
||||
size_t ret = mbrtowc(outptr, inptr, ll, &ps);
|
||||
|
|
Loading…
Reference in a new issue