Module: wine Branch: master Commit: 6122c2ba37a8871c6118d0596e9576b17660f581 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6122c2ba37a8871c6118d0596e...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Dec 30 16:55:42 2013 +0100
msvcrt: Convert data to multibyte encoding in ungetwc if needed.
---
dlls/msvcrt/file.c | 29 +++++++++++++++++++++++++---- 1 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 3796482..4665e6b 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4730,18 +4730,39 @@ int CDECL MSVCRT_ungetc(int c, MSVCRT_FILE * file) MSVCRT_wint_t CDECL MSVCRT_ungetwc(MSVCRT_wint_t wc, MSVCRT_FILE * file) { MSVCRT_wchar_t mwc = wc; - unsigned char * pp = (unsigned char *)&mwc; - int i;
if (wc == MSVCRT_WEOF) return MSVCRT_WEOF;
MSVCRT__lock_file(file); - for(i=sizeof(MSVCRT_wchar_t)-1;i>=0;i--) { - if(pp[i] != MSVCRT_ungetc(pp[i],file)) { + + if((msvcrt_get_ioinfo(file->_file)->exflag & (EF_UTF8 | EF_UTF16)) + || !(msvcrt_get_ioinfo(file->_file)->wxflag & WX_TEXT)) { + unsigned char * pp = (unsigned char *)&mwc; + int i; + + for(i=sizeof(MSVCRT_wchar_t)-1;i>=0;i--) { + if(pp[i] != MSVCRT_ungetc(pp[i],file)) { + MSVCRT__unlock_file(file); + return MSVCRT_WEOF; + } + } + }else { + char mbs[MSVCRT_MB_LEN_MAX]; + int len; + + len = MSVCRT_wctomb(mbs, mwc); + if(len == -1) { MSVCRT__unlock_file(file); return MSVCRT_WEOF; } + + for(len--; len>=0; len--) { + if(mbs[len] != MSVCRT_ungetc(mbs[len], file)) { + MSVCRT__unlock_file(file); + return MSVCRT_WEOF; + } + } }
MSVCRT__unlock_file(file);