Piotr Caban : msvcrt: Added unicode modes support _setmode function.

Alexandre Julliard julliard at winehq.org
Thu Jan 10 13:36:11 CST 2013


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Jan 10 11:44:48 2013 +0100

msvcrt: Added unicode modes support _setmode function.

---

 dlls/msvcrt/file.c |   31 ++++++++++++++++++++++++-------
 1 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 0b028bd..0818f8e 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -2232,14 +2232,31 @@ int CDECL MSVCRT__read(int fd, void *buf, unsigned int count)
  */
 int CDECL MSVCRT__setmode(int fd,int mode)
 {
-  int ret = msvcrt_get_ioinfo(fd)->wxflag & WX_TEXT ? MSVCRT__O_TEXT : MSVCRT__O_BINARY;
-  if (mode & (~(MSVCRT__O_TEXT|MSVCRT__O_BINARY)))
-    FIXME("fd (%d) mode (0x%08x) unknown\n",fd,mode);
-  if ((mode & MSVCRT__O_TEXT) == MSVCRT__O_TEXT)
+    int ret = msvcrt_get_ioinfo(fd)->wxflag & WX_TEXT ? MSVCRT__O_TEXT : MSVCRT__O_BINARY;
+    if(ret==MSVCRT__O_TEXT && (msvcrt_get_ioinfo(fd)->exflag & (EF_UTF8|EF_UTF16)))
+        ret = MSVCRT__O_WTEXT;
+
+    if(mode!=MSVCRT__O_TEXT && mode!=MSVCRT__O_BINARY && mode!=MSVCRT__O_WTEXT
+                && mode!=MSVCRT__O_U16TEXT && mode!=MSVCRT__O_U8TEXT) {
+        *MSVCRT__errno() = MSVCRT_EINVAL;
+        return -1;
+    }
+
+    if(mode == MSVCRT__O_BINARY) {
+        msvcrt_get_ioinfo(fd)->wxflag &= ~WX_TEXT;
+        msvcrt_get_ioinfo(fd)->exflag &= ~(EF_UTF8|EF_UTF16);
+        return ret;
+    }
+
     msvcrt_get_ioinfo(fd)->wxflag |= WX_TEXT;
-  else
-    msvcrt_get_ioinfo(fd)->wxflag &= ~WX_TEXT;
-  return ret;
+    if(mode == MSVCRT__O_TEXT)
+        msvcrt_get_ioinfo(fd)->exflag &= ~(EF_UTF8|EF_UTF16);
+    else if(mode == MSVCRT__O_U8TEXT)
+        msvcrt_get_ioinfo(fd)->exflag = (msvcrt_get_ioinfo(fd)->exflag & ~EF_UTF16) | EF_UTF8;
+    else
+        msvcrt_get_ioinfo(fd)->exflag = (msvcrt_get_ioinfo(fd)->exflag & ~EF_UTF8) | EF_UTF16;
+
+    return ret;
 }
 
 /*********************************************************************




More information about the wine-cvs mailing list