msvcp60: Added __Fiopen implementation.

This commit is contained in:
Piotr Caban 2012-10-05 14:54:00 +02:00 committed by Alexandre Julliard
parent 9b0f49264e
commit 66d35c4048
2 changed files with 80 additions and 2 deletions

View File

@ -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)

View File

@ -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