Piotr Caban : msvcp60: Added __Fiopen implementation.

Alexandre Julliard julliard at winehq.org
Mon Oct 8 13:39:56 CDT 2012


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Oct  5 14:54:00 2012 +0200

msvcp60: Added __Fiopen implementation.

---

 dlls/msvcp60/ios.c        |   78 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/msvcp60/msvcp60.spec |    4 +-
 2 files changed, 80 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcp60/ios.c b/dlls/msvcp60/ios.c
index f09abc2..cf3620a 100644
--- a/dlls/msvcp60/ios.c
+++ b/dlls/msvcp60/ios.c
@@ -2413,6 +2413,84 @@ MSVCP_bool __thiscall basic_filebuf_char_is_open(const basic_filebuf_char *this)
     return this->file != NULL;
 }
 
+/* ?_Fiopen at std@@YAPAU_iobuf@@PB_WHH at Z */
+/* ?_Fiopen at std@@YAPEAU_iobuf@@PEB_WHH at Z */
+static FILE* _Fiopen_wchar(const wchar_t *name, int mode, int prot)
+{
+    static const wchar_t rW[] = {'r',0};
+    static const struct {
+        int mode;
+        const wchar_t str[4];
+        const wchar_t str_bin[4];
+    } str_mode[] = {
+        {OPENMODE_out,                            {'w',0},     {'w','b',0}},
+        {OPENMODE_out|OPENMODE_app,               {'a',0},     {'a','b',0}},
+        {OPENMODE_app,                            {'a',0},     {'a','b',0}},
+        {OPENMODE_out|OPENMODE_trunc,             {'w',0},     {'w','b',0}},
+        {OPENMODE_in,                             {'r',0},     {'r','b',0}},
+        {OPENMODE_in|OPENMODE_out,                {'r','+',0}, {'r','+','b',0}},
+        {OPENMODE_in|OPENMODE_out|OPENMODE_trunc, {'w','+',0}, {'w','+','b',0}},
+        {OPENMODE_in|OPENMODE_out|OPENMODE_app,   {'a','+',0}, {'a','+','b',0}},
+        {OPENMODE_in|OPENMODE_app,                {'a','+',0}, {'a','+','b',0}}
+    };
+
+    int real_mode = mode & ~(OPENMODE_ate|OPENMODE__Nocreate|OPENMODE__Noreplace|OPENMODE_binary);
+    int mode_idx;
+    FILE *f = NULL;
+
+    TRACE("(%s %d %d)\n", debugstr_w(name), mode, prot);
+
+    for(mode_idx=0; mode_idx<sizeof(str_mode)/sizeof(str_mode[0]); mode_idx++)
+        if(str_mode[mode_idx].mode == real_mode)
+            break;
+    if(mode_idx == sizeof(str_mode)/sizeof(str_mode[0]))
+        return NULL;
+
+    if((mode & OPENMODE__Nocreate) && !(f = _wfopen(name, rW)))
+        return NULL;
+    else if(f)
+        fclose(f);
+
+    if((mode & OPENMODE__Noreplace) && (mode & (OPENMODE_out|OPENMODE_app))
+            && (f = _wfopen(name, rW))) {
+        fclose(f);
+        return NULL;
+    }
+
+    f = _wfsopen(name, (mode & OPENMODE_binary) ? str_mode[mode_idx].str_bin
+            : str_mode[mode_idx].str, prot);
+    if(!f)
+        return NULL;
+
+    if((mode & OPENMODE_ate) && fseek(f, 0, SEEK_END)) {
+        fclose(f);
+        return NULL;
+    }
+
+    return f;
+}
+
+/* ?_Fiopen at std@@YAPAU_iobuf@@PBDHH at Z */
+/* ?_Fiopen at std@@YAPEAU_iobuf@@PEBDHH at Z */
+static FILE* _Fiopen(const char *name, int mode, int prot)
+{
+    wchar_t nameW[FILENAME_MAX];
+
+    TRACE("(%s %d %d)\n", name, mode, prot);
+
+    if(mbstowcs_s(NULL, nameW, FILENAME_MAX, name, FILENAME_MAX-1) != 0)
+        return NULL;
+    return _Fiopen_wchar(nameW, mode, prot);
+}
+
+/* ?__Fiopen at std@@YAPAU_iobuf@@PBDH at Z */
+/* ?__Fiopen at std@@YAPEAU_iobuf@@PEBDH at Z */
+FILE* __cdecl ___Fiopen(const char *name, int mode)
+{
+    TRACE("(%p %d)\n", name, mode);
+    return _Fiopen(name, mode, _SH_DENYNO);
+}
+
 /* ?overflow@?$basic_filebuf at DU?$char_traits at D@std@@@std@@MAEHH at Z */
 /* ?overflow@?$basic_filebuf at DU?$char_traits at D@std@@@std@@MEAAHH at Z */
 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_overflow, 8)
diff --git a/dlls/msvcp60/msvcp60.spec b/dlls/msvcp60/msvcp60.spec
index 3e36ca9..e6bf596 100644
--- a/dlls/msvcp60/msvcp60.spec
+++ b/dlls/msvcp60/msvcp60.spec
@@ -2396,8 +2396,8 @@
 @ stub -arch=win64 ?_Xl@?BN@???$_Fabs at N@std@@YANAEBV?$complex at N@1 at PEAH@Z at 4NB
 @ cdecl ?_Xlen at std@@YAXXZ() _Xlen
 @ cdecl ?_Xran at std@@YAXXZ() _Xran
-@ stub -arch=win32 ?__Fiopen at std@@YAPAU_iobuf@@PBDH at Z
-@ stub -arch=win64 ?__Fiopen at std@@YAPEAU_iobuf@@PEBDH at Z
+@ cdecl -arch=win32 ?__Fiopen at std@@YAPAU_iobuf@@PBDH at Z(str long) ___Fiopen
+@ cdecl -arch=win64 ?__Fiopen at std@@YAPEAU_iobuf@@PEBDH at Z(str long) ___Fiopen
 @ stub -arch=win32 ?abs at std@@YAMABV?$complex at M@1@@Z
 @ stub -arch=win64 ?abs at std@@YAMAEBV?$complex at M@1@@Z
 @ stub -arch=win32 ?abs at std@@YANABV?$complex at N@1@@Z




More information about the wine-cvs mailing list