Piotr Caban : msvcrt: Convert data to multibyte encoding in ungetwc if needed.

Alexandre Julliard julliard at winehq.org
Mon Dec 30 13:06:00 CST 2013


Module: wine
Branch: master
Commit: 6122c2ba37a8871c6118d0596e9576b17660f581
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6122c2ba37a8871c6118d0596e9576b17660f581

Author: Piotr Caban <piotr at 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);




More information about the wine-cvs mailing list