Module: wine Branch: master Commit: 66d35c4048882f5d8d63f53460908ed672d7a658 URL: http://source.winehq.org/git/wine.git/?a=commit;h=66d35c4048882f5d8d63f53460...
Author: Piotr Caban piotr@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@std@@YAPAU_iobuf@@PB_WHH@Z */ +/* ?_Fiopen@std@@YAPEAU_iobuf@@PEB_WHH@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@std@@YAPAU_iobuf@@PBDHH@Z */ +/* ?_Fiopen@std@@YAPEAU_iobuf@@PEBDHH@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@std@@YAPAU_iobuf@@PBDH@Z */ +/* ?__Fiopen@std@@YAPEAU_iobuf@@PEBDH@Z */ +FILE* __cdecl ___Fiopen(const char *name, int mode) +{ + TRACE("(%p %d)\n", name, mode); + return _Fiopen(name, mode, _SH_DENYNO); +} + /* ?overflow@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAEHH@Z */ /* ?overflow@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAAHH@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@N@std@@YANAEBV?$complex@N@1@PEAH@Z@4NB @ cdecl ?_Xlen@std@@YAXXZ() _Xlen @ cdecl ?_Xran@std@@YAXXZ() _Xran -@ stub -arch=win32 ?__Fiopen@std@@YAPAU_iobuf@@PBDH@Z -@ stub -arch=win64 ?__Fiopen@std@@YAPEAU_iobuf@@PEBDH@Z +@ cdecl -arch=win32 ?__Fiopen@std@@YAPAU_iobuf@@PBDH@Z(str long) ___Fiopen +@ cdecl -arch=win64 ?__Fiopen@std@@YAPEAU_iobuf@@PEBDH@Z(str long) ___Fiopen @ stub -arch=win32 ?abs@std@@YAMABV?$complex@M@1@@Z @ stub -arch=win64 ?abs@std@@YAMAEBV?$complex@M@1@@Z @ stub -arch=win32 ?abs@std@@YANABV?$complex@N@1@@Z