diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index e59a10c83e1..a9f0d87018c 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 096f77a0c86..30779bca7d2 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) */