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