Piotr Caban : msvcrt: Added support for unicode open mode in msvcrt_get_flags function.
Alexandre Julliard
julliard at winehq.org
Thu Jan 10 13:36:10 CST 2013
Module: wine
Branch: master
Commit: 96be6eb570cdf0da9e085e70d1bbb2e59b5b920f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=96be6eb570cdf0da9e085e70d1bbb2e59b5b920f
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Jan 10 11:42:15 2013 +0100
msvcrt: Added support for unicode open mode in msvcrt_get_flags function.
---
dlls/msvcrt/file.c | 61 +++++++++++++++++++++++++++++++++++++++++++++----
dlls/msvcrt/msvcrt.h | 3 ++
2 files changed, 59 insertions(+), 5 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index e59a10c..a9f0d87 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -1245,6 +1245,8 @@ static int msvcrt_get_flags(const MSVCRT_wchar_t* mode, int *open_flags, int* st
{
int plus = strchrW(mode, '+') != NULL;
+ TRACE("%s\n", debugstr_w(mode));
+
switch(*mode++)
{
case 'R': case 'r':
@@ -1260,12 +1262,11 @@ static int msvcrt_get_flags(const MSVCRT_wchar_t* mode, int *open_flags, int* st
*stream_flags = plus ? MSVCRT__IORW : MSVCRT__IOWRT;
break;
default:
- MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0);
- *MSVCRT__errno() = MSVCRT_EINVAL;
+ MSVCRT_INVALID_PMT(0, MSVCRT_EINVAL);
return -1;
}
- while (*mode)
+ while (*mode && *mode!=',')
switch (*mode++)
{
case 'B': case 'b':
@@ -1286,8 +1287,54 @@ static int msvcrt_get_flags(const MSVCRT_wchar_t* mode, int *open_flags, int* st
case ' ':
break;
default:
- FIXME(":unknown flag %c not supported\n",mode[-1]);
+ MSVCRT_INVALID_PMT(0, MSVCRT_EINVAL);
+ return -1;
+ }
+
+ if(*mode == ',')
+ {
+ static const WCHAR ccs[] = {'c','c','s'};
+ static const WCHAR utf8[] = {'u','t','f','-','8'};
+ static const WCHAR utf16le[] = {'u','t','f','-','1','6','l','e'};
+ static const WCHAR unicode[] = {'u','n','i','c','o','d','e'};
+
+ mode++;
+ while(*mode == ' ') mode++;
+ if(!MSVCRT_CHECK_PMT(!strncmpW(ccs, mode, sizeof(ccs)/sizeof(ccs[0]))))
+ return -1;
+ mode += sizeof(ccs)/sizeof(ccs[0]);
+ while(*mode == ' ') mode++;
+ if(!MSVCRT_CHECK_PMT(*mode == '='))
+ return -1;
+ mode++;
+ while(*mode == ' ') mode++;
+
+ if(!strncmpiW(utf8, mode, sizeof(utf8)/sizeof(utf8[0])))
+ {
+ *open_flags |= MSVCRT__O_U8TEXT;
+ mode += sizeof(utf8)/sizeof(utf8[0]);
+ }
+ else if(!strncmpiW(utf16le, mode, sizeof(utf16le)/sizeof(utf16le[0])))
+ {
+ *open_flags |= MSVCRT__O_U16TEXT;
+ mode += sizeof(utf16le)/sizeof(utf16le[0]);
+ }
+ else if(!strncmpiW(unicode, mode, sizeof(unicode)/sizeof(unicode[0])))
+ {
+ *open_flags |= MSVCRT__O_WTEXT;
+ mode += sizeof(unicode)/sizeof(unicode[0]);
}
+ else
+ {
+ MSVCRT_INVALID_PMT(0, MSVCRT_EINVAL);
+ return -1;
+ }
+
+ while(*mode == ' ') mode++;
+ }
+
+ if(!MSVCRT_CHECK_PMT(*mode == 0))
+ return -1;
return 0;
}
@@ -1623,6 +1670,9 @@ static unsigned split_oflags(unsigned oflags)
if (oflags & MSVCRT__O_APPEND) wxflags |= WX_APPEND;
if (oflags & MSVCRT__O_BINARY) {/* Nothing to do */}
else if (oflags & MSVCRT__O_TEXT) wxflags |= WX_TEXT;
+ else if (oflags & MSVCRT__O_WTEXT) wxflags |= WX_TEXT;
+ else if (oflags & MSVCRT__O_U16TEXT) wxflags |= WX_TEXT;
+ else if (oflags & MSVCRT__O_U8TEXT) wxflags |= WX_TEXT;
else if (*__p__fmode() & MSVCRT__O_BINARY) {/* Nothing to do */}
else wxflags |= WX_TEXT; /* default to TEXT*/
if (oflags & MSVCRT__O_NOINHERIT) wxflags |= WX_DONTINHERIT;
@@ -1632,7 +1682,8 @@ static unsigned split_oflags(unsigned oflags)
MSVCRT__O_TRUNC|MSVCRT__O_EXCL|MSVCRT__O_CREAT|
MSVCRT__O_RDWR|MSVCRT__O_WRONLY|MSVCRT__O_TEMPORARY|
MSVCRT__O_NOINHERIT|
- MSVCRT__O_SEQUENTIAL|MSVCRT__O_RANDOM|MSVCRT__O_SHORT_LIVED
+ MSVCRT__O_SEQUENTIAL|MSVCRT__O_RANDOM|MSVCRT__O_SHORT_LIVED|
+ MSVCRT__O_WTEXT|MSVCRT__O_U16TEXT|MSVCRT__O_U8TEXT
)))
ERR(":unsupported oflags 0x%04x\n",unsupp);
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 096f77a..30779bc 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -750,6 +750,9 @@ struct MSVCRT__stat64 {
#define MSVCRT__O_TEXT 0x4000
#define MSVCRT__O_BINARY 0x8000
#define MSVCRT__O_RAW MSVCRT__O_BINARY
+#define MSVCRT__O_WTEXT 0x10000
+#define MSVCRT__O_U16TEXT 0x20000
+#define MSVCRT__O_U8TEXT 0x40000
/* _statusfp bit flags */
#define MSVCRT__SW_INEXACT 0x00000001 /* inexact (precision) */
More information about the wine-cvs
mailing list