mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 09:31:44 +00:00
[MSVCRT_WINETEST]
- Sync to Wine 1.3.32 svn path=/trunk/; revision=54296
This commit is contained in:
parent
c5eb6b4cdf
commit
e2d5a05b09
12 changed files with 2978 additions and 120 deletions
|
@ -180,7 +180,7 @@ static void* do_call_func2(void *func, void *_this, const void* arg)
|
|||
|
||||
/* Some exports are only available in later versions */
|
||||
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(hMsvcrt,y)
|
||||
#define SET(x,y) SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y)
|
||||
#define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0)
|
||||
|
||||
static void InitFunctionPtrs(void)
|
||||
{
|
||||
|
@ -190,8 +190,16 @@ static void InitFunctionPtrs(void)
|
|||
ok(hMsvcrt != 0, "GetModuleHandleA failed\n");
|
||||
if (hMsvcrt)
|
||||
{
|
||||
SETNOFAIL(poperator_new, "??_U@YAPAXI@Z");
|
||||
SETNOFAIL(poperator_delete, "??_V@YAXPAX@Z");
|
||||
if (sizeof(void *) > sizeof(int)) /* 64-bit has different names */
|
||||
{
|
||||
SETNOFAIL(poperator_new, "??_U@YAPEAX_K@Z");
|
||||
SETNOFAIL(poperator_delete, "??_V@YAXPEAX@Z");
|
||||
}
|
||||
else
|
||||
{
|
||||
SETNOFAIL(poperator_new, "??_U@YAPAXI@Z");
|
||||
SETNOFAIL(poperator_delete, "??_V@YAXPAX@Z");
|
||||
}
|
||||
SET(pmalloc, "malloc");
|
||||
SET(pfree, "free");
|
||||
|
||||
|
@ -802,7 +810,8 @@ static void test_rtti(void)
|
|||
void *casted;
|
||||
|
||||
if (bAncientVersion ||
|
||||
!p__RTCastToVoid || !p__RTtypeid || !pexception_ctor || !pbad_typeid_ctor || !p__RTDynamicCast)
|
||||
!p__RTCastToVoid || !p__RTtypeid || !pexception_ctor || !pbad_typeid_ctor
|
||||
|| !p__RTDynamicCast || !pexception_dtor || !pbad_typeid_dtor)
|
||||
return;
|
||||
|
||||
call_func2(pexception_ctor, &e, &e_name);
|
||||
|
@ -826,6 +835,9 @@ static void test_rtti(void)
|
|||
/* dynamic_cast down */
|
||||
casted = p__RTDynamicCast(&e, 0, NULL, bti, 0);
|
||||
ok (casted == NULL, "Cast succeeded\n");
|
||||
|
||||
call_func1(pexception_dtor, &e);
|
||||
call_func1(pbad_typeid_dtor, &b);
|
||||
}
|
||||
|
||||
struct _demangle {
|
||||
|
@ -856,7 +868,8 @@ static void test_demangle_datatype(void)
|
|||
ok(name != NULL && !strcmp(name,demangle[i].result), "Got name \"%s\" for %d\n", name, i);
|
||||
else
|
||||
todo_wine ok(name != NULL && !strcmp(name,demangle[i].result), "Got name %s for %d\n", name, i);
|
||||
|
||||
if(name)
|
||||
pfree(name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1038,6 +1051,14 @@ static void test_demangle(void)
|
|||
/* 116 */ {"?vswprintf@@YAHPAGIPBGPAD@Z", "int __cdecl vswprintf(unsigned short *,unsigned int,unsigned short const *,char *)"},
|
||||
/* 117 */ {"?vswprintf@@YAHPA_WIPB_WPAD@Z", "int __cdecl vswprintf(wchar_t *,unsigned int,wchar_t const *,char *)"},
|
||||
/* 118 */ {"?swprintf@@YAHPA_WIPB_WZZ", "int __cdecl swprintf(wchar_t *,unsigned int,wchar_t const *,...)"},
|
||||
/* 119 */ {"??Xstd@@YAAEAV?$complex@M@0@AEAV10@AEBV10@@Z", "class std::complex<float> & __ptr64 __cdecl std::operator*=(class std::complex<float> & __ptr64,class std::complex<float> const & __ptr64)"},
|
||||
/* 120 */ {"?_Doraise@bad_cast@std@@MEBAXXZ", "protected: virtual void __cdecl std::bad_cast::_Doraise(void)const __ptr64"},
|
||||
/* 121 */ {"??$?DM@std@@YA?AV?$complex@M@0@ABMABV10@@Z",
|
||||
"class std::complex<float> __cdecl std::operator*<float>(float const &,class std::complex<float> const &)",
|
||||
"??$?DM@std@@YA?AV?$complex@M@0@ABMABV10@@Z"},
|
||||
/* 122 */ {"?_R2@?BN@???$_Fabs@N@std@@YANAEBV?$complex@N@1@PEAH@Z@4NB",
|
||||
"double const `double __cdecl std::_Fabs<double>(class std::complex<double> const & __ptr64,int * __ptr64)'::`29'::_R2",
|
||||
"?_R2@?BN@???$_Fabs@N@std@@YANAEBV?$complex@N@1@PEAH@Z@4NB"},
|
||||
|
||||
};
|
||||
int i, num_test = (sizeof(test)/sizeof(test[0]));
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
typedef void (__cdecl *_INITTERMFUN)(void);
|
||||
static void (__cdecl *p_initterm)(_INITTERMFUN *start, _INITTERMFUN *end);
|
||||
|
||||
static int (__cdecl *p_get_pgmptr)(char **p);
|
||||
|
||||
static int callbacked;
|
||||
|
||||
static void __cdecl initcallback(void)
|
||||
|
@ -108,6 +110,20 @@ static void test_initvar( HMODULE hmsvcrt )
|
|||
osplatform, osvi.dwPlatformId);
|
||||
}
|
||||
|
||||
static void test_get_pgmptr(void)
|
||||
{
|
||||
char *pgm = NULL;
|
||||
int res;
|
||||
|
||||
if (!p_get_pgmptr)
|
||||
return;
|
||||
|
||||
res = p_get_pgmptr(&pgm);
|
||||
|
||||
ok( res == 0, "Wrong _get_pgmptr return value %d expected 0\n", res);
|
||||
ok( pgm != NULL, "_get_pgmptr returned a NULL pointer\n" );
|
||||
}
|
||||
|
||||
START_TEST(data)
|
||||
{
|
||||
HMODULE hmsvcrt;
|
||||
|
@ -116,7 +132,11 @@ START_TEST(data)
|
|||
if (!hmsvcrt)
|
||||
hmsvcrt = GetModuleHandleA("msvcrtd.dll");
|
||||
if (hmsvcrt)
|
||||
{
|
||||
p_initterm=(void*)GetProcAddress(hmsvcrt, "_initterm");
|
||||
p_get_pgmptr=(void*)GetProcAddress(hmsvcrt, "_get_pgmptr");
|
||||
}
|
||||
test_initterm();
|
||||
test_initvar(hmsvcrt);
|
||||
test_get_pgmptr();
|
||||
}
|
||||
|
|
|
@ -42,6 +42,25 @@ static const char *a_very_long_env_string =
|
|||
"/usr/lib/mingw32/3.4.2/;"
|
||||
"/usr/lib/";
|
||||
|
||||
void __cdecl __getmainargs(int *, char ***, char ***, int, int *);
|
||||
void __cdecl __wgetmainargs(int *, wchar_t ***, wchar_t ***, int, int *);
|
||||
|
||||
static char ***(__cdecl *p__p__environ)(void);
|
||||
static WCHAR ***(__cdecl *p__p__wenviron)(void);
|
||||
|
||||
static char ***p_environ;
|
||||
static WCHAR ***p_wenviron;
|
||||
|
||||
static void init(void)
|
||||
{
|
||||
HMODULE hmod = GetModuleHandleA("msvcrt.dll");
|
||||
|
||||
p__p__environ = (void *)GetProcAddress(hmod, "__p__environ");
|
||||
p__p__wenviron = (void *)GetProcAddress(hmod, "__p__wenviron");
|
||||
p_environ = (void *)GetProcAddress(hmod, "_environ");
|
||||
p_wenviron = (void *)GetProcAddress(hmod, "_wenviron");
|
||||
}
|
||||
|
||||
static void test_system(void)
|
||||
{
|
||||
int ret = system(NULL);
|
||||
|
@ -51,7 +70,145 @@ static void test_system(void)
|
|||
ok(ret == 0, "Expected system to return 0, got %d\n", ret);
|
||||
}
|
||||
|
||||
START_TEST(environ)
|
||||
static void test__environ(void)
|
||||
{
|
||||
int argc;
|
||||
char **argv, **envp = NULL;
|
||||
int i, mode = 0;
|
||||
|
||||
ok( p_environ != NULL, "Expected the pointer to _environ to be non-NULL\n" );
|
||||
if (p_environ)
|
||||
ok( *p_environ != NULL, "Expected _environ to be initialized on startup\n" );
|
||||
|
||||
if (!p_environ || !*p_environ)
|
||||
{
|
||||
skip( "_environ pointers are not valid\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
/* Examine the returned pointer from __p__environ(), if available. */
|
||||
if (p__p__environ)
|
||||
{
|
||||
ok( *p__p__environ() == *p_environ,
|
||||
"Expected _environ pointers to be identical\n" );
|
||||
}
|
||||
else
|
||||
win_skip( "__p__environ() is not available\n" );
|
||||
|
||||
/* Note that msvcrt from Windows versions older than Vista
|
||||
* expects the mode pointer parameter to be valid.*/
|
||||
__getmainargs(&argc, &argv, &envp, 0, &mode);
|
||||
|
||||
ok( envp != NULL, "Expected initial environment block pointer to be non-NULL\n" );
|
||||
if (!envp)
|
||||
{
|
||||
skip( "Initial environment block pointer is not valid\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; ; i++)
|
||||
{
|
||||
if ((*p_environ)[i])
|
||||
{
|
||||
ok( envp[i] != NULL, "Expected environment block pointer element to be non-NULL\n" );
|
||||
ok( !strcmp((*p_environ)[i], envp[i]),
|
||||
"Expected _environ and environment block pointer strings (%s vs. %s) to match\n",
|
||||
(*p_environ)[i], envp[i] );
|
||||
}
|
||||
else
|
||||
{
|
||||
ok( !envp[i], "Expected environment block pointer element to be NULL, got %p\n", envp[i] );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void test__wenviron(void)
|
||||
{
|
||||
static const WCHAR cat_eq_dogW[] = {'c','a','t','=','d','o','g',0};
|
||||
static const WCHAR cat_eqW[] = {'c','a','t','=',0};
|
||||
|
||||
int argc;
|
||||
char **argv, **envp = NULL;
|
||||
WCHAR **wargv, **wenvp = NULL;
|
||||
int i, mode = 0;
|
||||
|
||||
ok( p_wenviron != NULL, "Expected the pointer to _wenviron to be non-NULL\n" );
|
||||
if (p_wenviron)
|
||||
ok( *p_wenviron == NULL, "Expected _wenviron to be NULL, got %p\n", *p_wenviron );
|
||||
else
|
||||
{
|
||||
win_skip( "Pointer to _wenviron is not valid\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
/* Examine the returned pointer from __p__wenviron(), if available. */
|
||||
if (p__p__wenviron)
|
||||
{
|
||||
ok( *p__p__wenviron() == NULL,
|
||||
"Expected _wenviron pointers to be NULL\n" );
|
||||
}
|
||||
else
|
||||
win_skip( "__p__wenviron() is not available\n" );
|
||||
|
||||
/* __getmainargs doesn't initialize _wenviron. */
|
||||
__getmainargs(&argc, &argv, &envp, 0, &mode);
|
||||
|
||||
ok( *p_wenviron == NULL, "Expected _wenviron to be NULL, got %p\n", *p_wenviron);
|
||||
ok( envp != NULL, "Expected initial environment block pointer to be non-NULL\n" );
|
||||
if (!envp)
|
||||
{
|
||||
skip( "Initial environment block pointer is not valid\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
/* Neither does calling the non-Unicode environment manipulation functions. */
|
||||
ok( _putenv("cat=dog") == 0, "failed setting cat=dog\n" );
|
||||
ok( *p_wenviron == NULL, "Expected _wenviron to be NULL, got %p\n", *p_wenviron);
|
||||
ok( _putenv("cat=") == 0, "failed deleting cat\n" );
|
||||
|
||||
/* _wenviron isn't initialized until __wgetmainargs is called or
|
||||
* one of the Unicode environment manipulation functions is called. */
|
||||
ok( _wputenv(cat_eq_dogW) == 0, "failed setting cat=dog\n" );
|
||||
ok( *p_wenviron != NULL, "Expected _wenviron to be non-NULL\n" );
|
||||
ok( _wputenv(cat_eqW) == 0, "failed deleting cat\n" );
|
||||
|
||||
__wgetmainargs(&argc, &wargv, &wenvp, 0, &mode);
|
||||
|
||||
ok( *p_wenviron != NULL, "Expected _wenviron to be non-NULL\n" );
|
||||
ok( wenvp != NULL, "Expected initial environment block pointer to be non-NULL\n" );
|
||||
if (!wenvp)
|
||||
{
|
||||
skip( "Initial environment block pointer is not valid\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
/* Examine the returned pointer from __p__wenviron(),
|
||||
* if available, after _wenviron is initialized. */
|
||||
if (p__p__wenviron)
|
||||
{
|
||||
ok( *p__p__wenviron() == *p_wenviron,
|
||||
"Expected _wenviron pointers to be identical\n" );
|
||||
}
|
||||
|
||||
for (i = 0; ; i++)
|
||||
{
|
||||
if ((*p_wenviron)[i])
|
||||
{
|
||||
ok( wenvp[i] != NULL, "Expected environment block pointer element to be non-NULL\n" );
|
||||
ok( !winetest_strcmpW((*p_wenviron)[i], wenvp[i]),
|
||||
"Expected _wenviron and environment block pointer strings (%s vs. %s) to match\n",
|
||||
wine_dbgstr_w((*p_wenviron)[i]), wine_dbgstr_w(wenvp[i]) );
|
||||
}
|
||||
else
|
||||
{
|
||||
ok( !wenvp[i], "Expected environment block pointer element to be NULL, got %p\n", wenvp[i] );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void test_environment_manipulation(void)
|
||||
{
|
||||
ok( _putenv("cat=") == 0, "_putenv failed on deletion of nonexistent environment variable\n" );
|
||||
ok( _putenv("cat=dog") == 0, "failed setting cat=dog\n" );
|
||||
|
@ -63,6 +220,16 @@ START_TEST(environ)
|
|||
ok( _putenv(a_very_long_env_string) == 0, "_putenv failed for long environment string\n");
|
||||
|
||||
ok( getenv("nonexistent") == NULL, "getenv should fail with nonexistent var name\n" );
|
||||
}
|
||||
|
||||
START_TEST(environ)
|
||||
{
|
||||
init();
|
||||
|
||||
/* The environ tests should always be run first, as they assume
|
||||
* that the process has not manipulated the environment. */
|
||||
test__environ();
|
||||
test__wenviron();
|
||||
test_environment_manipulation();
|
||||
test_system();
|
||||
}
|
||||
|
|
|
@ -36,6 +36,17 @@
|
|||
|
||||
static HANDLE proc_handles[2];
|
||||
|
||||
static int (__cdecl *p_fopen_s)(FILE**, const char*, const char*);
|
||||
static int (__cdecl *p__wfopen_s)(FILE**, const wchar_t*, const wchar_t*);
|
||||
|
||||
static void init(void)
|
||||
{
|
||||
HMODULE hmod = GetModuleHandleA("msvcrt.dll");
|
||||
|
||||
p_fopen_s = (void*)GetProcAddress(hmod, "fopen_s");
|
||||
p__wfopen_s = (void*)GetProcAddress(hmod, "_wfopen_s");
|
||||
}
|
||||
|
||||
static void test_filbuf( void )
|
||||
{
|
||||
FILE *fp;
|
||||
|
@ -95,54 +106,59 @@ static void test_fileops( void )
|
|||
int fd;
|
||||
FILE *file;
|
||||
fpos_t pos;
|
||||
int i, c;
|
||||
int i, c, bufmode;
|
||||
static const int bufmodes[] = {_IOFBF,_IONBF};
|
||||
|
||||
fd = open ("fdopen.tst", O_WRONLY | O_CREAT | O_BINARY, _S_IREAD |_S_IWRITE);
|
||||
write (fd, outbuffer, sizeof (outbuffer));
|
||||
close (fd);
|
||||
|
||||
fd = open ("fdopen.tst", O_RDONLY | O_BINARY);
|
||||
file = fdopen (fd, "rb");
|
||||
ok(strlen(outbuffer) == (sizeof(outbuffer)-1),"strlen/sizeof error\n");
|
||||
ok(fgets(buffer,sizeof(buffer),file) !=0,"fgets failed unexpected\n");
|
||||
ok(fgets(buffer,sizeof(buffer),file) ==0,"fgets didn't signal EOF\n");
|
||||
ok(feof(file) !=0,"feof doesn't signal EOF\n");
|
||||
rewind(file);
|
||||
ok(fgets(buffer,strlen(outbuffer),file) !=0,"fgets failed unexpected\n");
|
||||
ok(lstrlenA(buffer) == lstrlenA(outbuffer) -1,"fgets didn't read right size\n");
|
||||
ok(fgets(buffer,sizeof(outbuffer),file) !=0,"fgets failed unexpected\n");
|
||||
ok(strlen(buffer) == 1,"fgets dropped chars\n");
|
||||
ok(buffer[0] == outbuffer[strlen(outbuffer)-1],"fgets exchanged chars\n");
|
||||
|
||||
rewind(file);
|
||||
for (i = 0, c = EOF; i < sizeof(outbuffer); i++)
|
||||
for (bufmode=0; bufmode < sizeof(bufmodes)/sizeof(bufmodes[0]); bufmode++)
|
||||
{
|
||||
ok((c = fgetc(file)) == outbuffer[i], "fgetc returned wrong data\n");
|
||||
fd = open ("fdopen.tst", O_RDONLY | O_BINARY);
|
||||
file = fdopen (fd, "rb");
|
||||
setvbuf(file,NULL,bufmodes[bufmode],2048);
|
||||
ok(strlen(outbuffer) == (sizeof(outbuffer)-1),"strlen/sizeof error for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(fgets(buffer,sizeof(buffer),file) !=0,"fgets failed unexpected for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(fgets(buffer,sizeof(buffer),file) ==0,"fgets didn't signal EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(feof(file) !=0,"feof doesn't signal EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
rewind(file);
|
||||
ok(fgets(buffer,strlen(outbuffer),file) !=0,"fgets failed unexpected for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(lstrlenA(buffer) == lstrlenA(outbuffer) -1,"fgets didn't read right size for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(fgets(buffer,sizeof(outbuffer),file) !=0,"fgets failed unexpected for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(strlen(buffer) == 1,"fgets dropped chars for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(buffer[0] == outbuffer[strlen(outbuffer)-1],"fgets exchanged chars for bufmode=%x\n", bufmodes[bufmode]);
|
||||
|
||||
rewind(file);
|
||||
for (i = 0; i < sizeof(outbuffer); i++)
|
||||
{
|
||||
ok(fgetc(file) == outbuffer[i], "fgetc returned wrong data for bufmode=%x\n", bufmodes[bufmode]);
|
||||
}
|
||||
ok((c = fgetc(file)) == EOF, "getc did not return EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(feof(file), "feof did not return EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(ungetc(c, file) == EOF, "ungetc(EOF) did not return EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(feof(file), "feof after ungetc(EOF) did not return EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(fgetc(file) == EOF, "getc did not return EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
c = outbuffer[sizeof(outbuffer) - 1];
|
||||
ok(ungetc(c, file) == c, "ungetc did not return its input for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(!feof(file), "feof after ungetc returned EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok((c = fgetc(file)) != EOF, "getc after ungetc returned EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(c == outbuffer[sizeof(outbuffer) - 1],
|
||||
"getc did not return ungetc'd data for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(!feof(file), "feof after getc returned EOF prematurely for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(fgetc(file) == EOF, "getc did not return EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(feof(file), "feof after getc did not return EOF for bufmode=%x\n", bufmodes[bufmode]);
|
||||
|
||||
rewind(file);
|
||||
ok(fgetpos(file,&pos) == 0, "fgetpos failed unexpected for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(pos == 0, "Unexpected result of fgetpos %x%08x for bufmode=%x\n", (DWORD)(pos >> 32), (DWORD)pos, bufmodes[bufmode]);
|
||||
pos = sizeof (outbuffer);
|
||||
ok(fsetpos(file, &pos) == 0, "fsetpos failed unexpected for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(fgetpos(file,&pos) == 0, "fgetpos failed unexpected for bufmode=%x\n", bufmodes[bufmode]);
|
||||
ok(pos == sizeof (outbuffer), "Unexpected result of fgetpos %x%08x for bufmode=%x\n", (DWORD)(pos >> 32), (DWORD)pos, bufmodes[bufmode]);
|
||||
|
||||
fclose (file);
|
||||
}
|
||||
ok((c = fgetc(file)) == EOF, "getc did not return EOF\n");
|
||||
ok(feof(file), "feof did not return EOF\n");
|
||||
ok(ungetc(c, file) == EOF, "ungetc(EOF) did not return EOF\n");
|
||||
ok(feof(file), "feof after ungetc(EOF) did not return EOF\n");
|
||||
ok((c = fgetc(file)) == EOF, "getc did not return EOF\n");
|
||||
c = outbuffer[sizeof(outbuffer) - 1];
|
||||
ok(ungetc(c, file) == c, "ungetc did not return its input\n");
|
||||
ok(!feof(file), "feof after ungetc returned EOF\n");
|
||||
ok((c = fgetc(file)) != EOF, "getc after ungetc returned EOF\n");
|
||||
ok(c == outbuffer[sizeof(outbuffer) - 1],
|
||||
"getc did not return ungetc'd data\n");
|
||||
ok(!feof(file), "feof after getc returned EOF prematurely\n");
|
||||
ok((c = fgetc(file)) == EOF, "getc did not return EOF\n");
|
||||
ok(feof(file), "feof after getc did not return EOF\n");
|
||||
|
||||
rewind(file);
|
||||
ok(fgetpos(file,&pos) == 0, "fgetpos failed unexpected\n");
|
||||
ok(pos == 0, "Unexpected result of fgetpos %x%08x\n", (DWORD)(pos >> 32), (DWORD)pos);
|
||||
pos = sizeof (outbuffer);
|
||||
ok(fsetpos(file, &pos) == 0, "fsetpos failed unexpected\n");
|
||||
ok(fgetpos(file,&pos) == 0, "fgetpos failed unexpected\n");
|
||||
ok(pos == sizeof (outbuffer), "Unexpected result of fgetpos %x%08x\n", (DWORD)(pos >> 32), (DWORD)pos);
|
||||
|
||||
fclose (file);
|
||||
fd = open ("fdopen.tst", O_RDONLY | O_TEXT);
|
||||
file = fdopen (fd, "rt"); /* open in TEXT mode */
|
||||
ok(fgetws(wbuffer,sizeof(wbuffer)/sizeof(wbuffer[0]),file) !=0,"fgetws failed unexpected\n");
|
||||
|
@ -342,17 +358,21 @@ static void test_asciimode(void)
|
|||
|
||||
fp = fopen("ascii.tst", "r");
|
||||
c= fgetc(fp);
|
||||
ok(c == '0', "fgetc failed, expected '0', got '%c'\n", c);
|
||||
c= fgetc(fp);
|
||||
ok(c == '\n', "fgetc failed, expected '\\n', got '%c'\n", c);
|
||||
fseek(fp,0,SEEK_CUR);
|
||||
for(i=1; i<10; i++) {
|
||||
ok((j = ftell(fp)) == i*3, "ftell fails in TEXT mode\n");
|
||||
fseek(fp,0,SEEK_CUR);
|
||||
ok((c = fgetc(fp)) == '0'+ i, "fgetc after fseek failed in line %d\n", i);
|
||||
c= fgetc(fp);
|
||||
ok(c == '\n', "fgetc failed, expected '\\n', got '%c'\n", c);
|
||||
}
|
||||
/* Show that fseek doesn't skip \\r !*/
|
||||
rewind(fp);
|
||||
c= fgetc(fp);
|
||||
ok(c == '0', "fgetc failed, expected '0', got '%c'\n", c);
|
||||
fseek(fp, 2 ,SEEK_CUR);
|
||||
for(i=1; i<10; i++) {
|
||||
ok((c = fgetc(fp)) == '0'+ i, "fgetc after fseek with pos Offset failed in line %d\n", i);
|
||||
|
@ -360,6 +380,7 @@ static void test_asciimode(void)
|
|||
}
|
||||
fseek(fp, 9*3 ,SEEK_SET);
|
||||
c = fgetc(fp);
|
||||
ok(c == '9', "fgetc failed, expected '9', got '%c'\n", c);
|
||||
fseek(fp, -4 ,SEEK_CUR);
|
||||
for(i= 8; i>=0; i--) {
|
||||
ok((c = fgetc(fp)) == '0'+ i, "fgetc after fseek with neg Offset failed in line %d\n", i);
|
||||
|
@ -1201,6 +1222,82 @@ static void test_fopen_fclose_fcloseall( void )
|
|||
ok(_unlink(fname3) == 0, "Couldn't unlink file named '%s'\n", fname3);
|
||||
}
|
||||
|
||||
static void test_fopen_s( void )
|
||||
{
|
||||
const char name[] = "empty1";
|
||||
char buff[16];
|
||||
FILE *file;
|
||||
int ret;
|
||||
int len;
|
||||
|
||||
if (!p_fopen_s)
|
||||
{
|
||||
win_skip("Skipping fopen_s test\n");
|
||||
return;
|
||||
}
|
||||
/* testing fopen_s */
|
||||
ret = p_fopen_s(&file, name, "w");
|
||||
ok(ret == 0, "fopen_s failed with %d\n", ret);
|
||||
ok(file != 0, "fopen_s failed to return value\n");
|
||||
fwrite(name, sizeof(name), 1, file);
|
||||
|
||||
ret = fclose(file);
|
||||
ok(ret != EOF, "File failed to close\n");
|
||||
|
||||
file = fopen(name, "r");
|
||||
ok(file != 0, "fopen failed\n");
|
||||
len = fread(buff, 1, sizeof(name), file);
|
||||
ok(len == sizeof(name), "File length is %d\n", len);
|
||||
buff[sizeof(name)] = '\0';
|
||||
ok(strcmp(name, buff) == 0, "File content mismatch! Got %s, expected %s\n", buff, name);
|
||||
|
||||
ret = fclose(file);
|
||||
ok(ret != EOF, "File failed to close\n");
|
||||
|
||||
ok(_unlink(name) == 0, "Couldn't unlink file named '%s'\n", name);
|
||||
}
|
||||
|
||||
static void test__wfopen_s( void )
|
||||
{
|
||||
const char name[] = "empty1";
|
||||
const WCHAR wname[] = {
|
||||
'e','m','p','t','y','1',0
|
||||
};
|
||||
const WCHAR wmode[] = {
|
||||
'w',0
|
||||
};
|
||||
char buff[16];
|
||||
FILE *file;
|
||||
int ret;
|
||||
int len;
|
||||
|
||||
if (!p__wfopen_s)
|
||||
{
|
||||
win_skip("Skipping _wfopen_s test\n");
|
||||
return;
|
||||
}
|
||||
/* testing _wfopen_s */
|
||||
ret = p__wfopen_s(&file, wname, wmode);
|
||||
ok(ret == 0, "_wfopen_s failed with %d\n", ret);
|
||||
ok(file != 0, "_wfopen_s failed to return value\n");
|
||||
fwrite(name, sizeof(name), 1, file);
|
||||
|
||||
ret = fclose(file);
|
||||
ok(ret != EOF, "File failed to close\n");
|
||||
|
||||
file = fopen(name, "r");
|
||||
ok(file != 0, "fopen failed\n");
|
||||
len = fread(buff, 1, sizeof(name), file);
|
||||
ok(len == sizeof(name), "File length is %d\n", len);
|
||||
buff[sizeof(name)] = '\0';
|
||||
ok(strcmp(name, buff) == 0, "File content mismatch! Got %s, expected %s\n", buff, name);
|
||||
|
||||
ret = fclose(file);
|
||||
ok(ret != EOF, "File failed to close\n");
|
||||
|
||||
ok(_unlink(name) == 0, "Couldn't unlink file named '%s'\n", name);
|
||||
}
|
||||
|
||||
static void test_get_osfhandle(void)
|
||||
{
|
||||
int fd;
|
||||
|
@ -1213,7 +1310,7 @@ static void test_get_osfhandle(void)
|
|||
WriteFile(handle, "bar", 3, &bytes_written, NULL);
|
||||
_close(fd);
|
||||
fd = _open(fname, _O_RDONLY, 0);
|
||||
ok(fd != -1, "Coudn't open '%s' after _get_osfhanle()\n", fname);
|
||||
ok(fd != -1, "Couldn't open '%s' after _get_osfhandle()\n", fname);
|
||||
|
||||
_close(fd);
|
||||
_unlink(fname);
|
||||
|
@ -1229,13 +1326,15 @@ static void test_stat(void)
|
|||
{
|
||||
int fd;
|
||||
int pipes[2];
|
||||
int ret;
|
||||
struct stat buf;
|
||||
|
||||
/* Tests for a file */
|
||||
fd = open("stat.tst", O_WRONLY | O_CREAT | O_BINARY, _S_IREAD |_S_IWRITE);
|
||||
if (fd >= 0)
|
||||
{
|
||||
ok(fstat(fd, &buf) == 0, "fstat failed: errno=%d\n", errno);
|
||||
ret = fstat(fd, &buf);
|
||||
ok(!ret, "fstat failed: errno=%d\n", errno);
|
||||
ok((buf.st_mode & _S_IFMT) == _S_IFREG, "bad format = %06o\n", buf.st_mode);
|
||||
ok((buf.st_mode & 0777) == 0666, "bad st_mode = %06o\n", buf.st_mode);
|
||||
ok(buf.st_dev == 0, "st_dev is %d, expected 0\n", buf.st_dev);
|
||||
|
@ -1243,7 +1342,8 @@ static void test_stat(void)
|
|||
ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", buf.st_nlink);
|
||||
ok(buf.st_size == 0, "st_size is %d, expected 0\n", buf.st_size);
|
||||
|
||||
ok(stat("stat.tst", &buf) == 0, "stat failed: errno=%d\n", errno);
|
||||
ret = stat("stat.tst", &buf);
|
||||
ok(!ret, "stat failed: errno=%d\n", errno);
|
||||
ok((buf.st_mode & _S_IFMT) == _S_IFREG, "bad format = %06o\n", buf.st_mode);
|
||||
ok((buf.st_mode & 0777) == 0666, "bad st_mode = %06o\n", buf.st_mode);
|
||||
ok(buf.st_dev == buf.st_rdev, "st_dev (%d) and st_rdev (%d) differ\n", buf.st_dev, buf.st_rdev);
|
||||
|
@ -1259,7 +1359,8 @@ static void test_stat(void)
|
|||
/* Tests for a char device */
|
||||
if (_dup2(0, 10) == 0)
|
||||
{
|
||||
ok(fstat(10, &buf) == 0, "fstat(stdin) failed: errno=%d\n", errno);
|
||||
ret = fstat(10, &buf);
|
||||
ok(!ret, "fstat(stdin) failed: errno=%d\n", errno);
|
||||
if ((buf.st_mode & _S_IFMT) == _S_IFCHR)
|
||||
{
|
||||
ok(buf.st_mode == _S_IFCHR, "bad st_mode=%06o\n", buf.st_mode);
|
||||
|
@ -1277,7 +1378,8 @@ static void test_stat(void)
|
|||
/* Tests for pipes */
|
||||
if (_pipe(pipes, 1024, O_BINARY) == 0)
|
||||
{
|
||||
ok(fstat(pipes[0], &buf) == 0, "fstat(pipe) failed: errno=%d\n", errno);
|
||||
ret = fstat(pipes[0], &buf);
|
||||
ok(!ret, "fstat(pipe) failed: errno=%d\n", errno);
|
||||
ok(buf.st_mode == _S_IFIFO, "bad st_mode=%06o\n", buf.st_mode);
|
||||
ok(buf.st_dev == pipes[0], "st_dev is %d, expected %d\n", buf.st_dev, pipes[0]);
|
||||
ok(buf.st_rdev == pipes[0], "st_rdev is %d, expected %d\n", buf.st_rdev, pipes[0]);
|
||||
|
@ -1307,7 +1409,8 @@ static void test_pipes_child(int argc, char** args)
|
|||
}
|
||||
|
||||
fd=atoi(args[3]);
|
||||
ok(close(fd) == 0, "unable to close %d: %d\n", fd, errno);
|
||||
i=close(fd);
|
||||
ok(!i, "unable to close %d: %d\n", fd, errno);
|
||||
|
||||
fd=atoi(args[4]);
|
||||
|
||||
|
@ -1319,7 +1422,8 @@ static void test_pipes_child(int argc, char** args)
|
|||
Sleep(100);
|
||||
}
|
||||
|
||||
ok(close(fd) == 0, "unable to close %d: %d\n", fd, errno);
|
||||
i=close(fd);
|
||||
ok(!i, "unable to close %d: %d\n", fd, errno);
|
||||
}
|
||||
|
||||
static void test_pipes(const char* selfname)
|
||||
|
@ -1347,7 +1451,8 @@ static void test_pipes(const char* selfname)
|
|||
arg_v[4] = str_fdw; sprintf(str_fdw, "%d", pipes[1]);
|
||||
arg_v[5] = NULL;
|
||||
proc_handles[0] = (HANDLE)_spawnvp(_P_NOWAIT, selfname, arg_v);
|
||||
ok(close(pipes[1]) == 0, "unable to close %d: %d\n", pipes[1], errno);
|
||||
i=close(pipes[1]);
|
||||
ok(!i, "unable to close %d: %d\n", pipes[1], errno);
|
||||
|
||||
for (i=0; i<N_TEST_MESSAGES; i++) {
|
||||
r=read(pipes[0], buf, sizeof(buf)-1);
|
||||
|
@ -1359,7 +1464,8 @@ static void test_pipes(const char* selfname)
|
|||
|
||||
r=read(pipes[0], buf, sizeof(buf)-1);
|
||||
ok(r == 0, "expected to read 0 bytes, got %d\n", r);
|
||||
ok(close(pipes[0]) == 0, "unable to close %d: %d\n", pipes[0], errno);
|
||||
i=close(pipes[0]);
|
||||
ok(!i, "unable to close %d: %d\n", pipes[0], errno);
|
||||
|
||||
/* Test reading from a pipe with fread() */
|
||||
if (_pipe(pipes, 1024, O_BINARY) < 0)
|
||||
|
@ -1375,7 +1481,8 @@ static void test_pipes(const char* selfname)
|
|||
arg_v[4] = str_fdw; sprintf(str_fdw, "%d", pipes[1]);
|
||||
arg_v[5] = NULL;
|
||||
proc_handles[1] = (HANDLE)_spawnvp(_P_NOWAIT, selfname, arg_v);
|
||||
ok(close(pipes[1]) == 0, "unable to close %d: %d\n", pipes[1], errno);
|
||||
i=close(pipes[1]);
|
||||
ok(!i, "unable to close %d: %d\n", pipes[1], errno);
|
||||
file=fdopen(pipes[0], "r");
|
||||
|
||||
/* In blocking mode, fread will keep calling read() until it gets
|
||||
|
@ -1398,7 +1505,8 @@ static void test_pipes(const char* selfname)
|
|||
ok(ferror(file) == 0, "got ferror() = %d\n", ferror(file));
|
||||
ok(feof(file), "feof() is false!\n");
|
||||
|
||||
ok(fclose(file) == 0, "unable to close the pipe: %d\n", errno);
|
||||
i=fclose(file);
|
||||
ok(!i, "unable to close the pipe: %d\n", errno);
|
||||
}
|
||||
|
||||
static void test_unlink(void)
|
||||
|
@ -1424,6 +1532,8 @@ START_TEST(file)
|
|||
int arg_c;
|
||||
char** arg_v;
|
||||
|
||||
init();
|
||||
|
||||
arg_c = winetest_get_mainargs( &arg_v );
|
||||
|
||||
/* testing low-level I/O */
|
||||
|
@ -1450,6 +1560,8 @@ START_TEST(file)
|
|||
test_filbuf();
|
||||
test_fdopen();
|
||||
test_fopen_fclose_fcloseall();
|
||||
test_fopen_s();
|
||||
test__wfopen_s();
|
||||
test_fileops();
|
||||
test_asciimode();
|
||||
test_asciimode2();
|
||||
|
|
|
@ -260,6 +260,7 @@ static void test_structs(void)
|
|||
CHECK_FIELD(_stat64, st_atime);
|
||||
CHECK_FIELD(_stat64, st_mtime);
|
||||
CHECK_FIELD(_stat64, st_ctime);
|
||||
CHECK_SIZE(_CRT_FLOAT);
|
||||
}
|
||||
|
||||
/************* Checking defines ***************/
|
||||
|
@ -339,6 +340,8 @@ static void test_defines(void)
|
|||
CHECK_DEF(_FREEENTRY);
|
||||
CHECK_DEF(_USEDENTRY);
|
||||
CHECK_DEF(_OUT_TO_DEFAULT);
|
||||
CHECK_DEF(_OUT_TO_STDERR);
|
||||
CHECK_DEF(_OUT_TO_MSGBOX);
|
||||
CHECK_DEF(_REPORT_ERRMODE);
|
||||
CHECK_DEF(_UPPER);
|
||||
CHECK_DEF(_LOWER);
|
||||
|
@ -425,7 +428,11 @@ static void test_defines(void)
|
|||
CHECK_DEF(_FPE_STACKOVERFLOW);
|
||||
CHECK_DEF(_FPE_STACKUNDERFLOW);
|
||||
CHECK_DEF(_FPE_EXPLICITGEN);
|
||||
#ifdef __i386__
|
||||
CHECK_DEF(_MCW_EM);
|
||||
CHECK_DEF(_MCW_IC);
|
||||
CHECK_DEF(_MCW_RC);
|
||||
CHECK_DEF(_MCW_PC);
|
||||
CHECK_DEF(_MCW_DN);
|
||||
CHECK_DEF(_EM_INVALID);
|
||||
CHECK_DEF(_EM_DENORMAL);
|
||||
CHECK_DEF(_EM_ZERODIVIDE);
|
||||
|
@ -441,7 +448,16 @@ static void test_defines(void)
|
|||
CHECK_DEF(_PC_24);
|
||||
CHECK_DEF(_PC_53);
|
||||
CHECK_DEF(_PC_64);
|
||||
#endif
|
||||
CHECK_DEF(_DN_SAVE);
|
||||
CHECK_DEF(_DN_FLUSH);
|
||||
CHECK_DEF(_DN_FLUSH_OPERANDS_SAVE_RESULTS);
|
||||
CHECK_DEF(_DN_SAVE_OPERANDS_FLUSH_RESULTS);
|
||||
CHECK_DEF(_EM_AMBIGUOUS);
|
||||
CHECK_DEF(_OVERFLOW);
|
||||
CHECK_DEF(_UNDERFLOW);
|
||||
CHECK_DEF(_WRITE_ABORT_MSG);
|
||||
CHECK_DEF(_CALL_REPORTFAULT);
|
||||
CHECK_DEF(_TWO_DIGIT_EXPONENT);
|
||||
}
|
||||
|
||||
#endif /* __WINE_USE_MSVCRT */
|
||||
|
|
|
@ -110,31 +110,32 @@ static void test_setlocale(void)
|
|||
ret = setlocale(LC_ALL, "chinese");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936")
|
||||
ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936")
|
||||
|| broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "chinese-simplified");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936")
|
||||
|| broken(!strcmp(ret, "Chinese_People's Republic of China.936")), "ret = %s\n", ret);
|
||||
ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936")
|
||||
|| broken(!strcmp(ret, "Chinese_People's Republic of China.936"))
|
||||
|| broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "chinese-traditional");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Chinese (Traditional)_Taiwan.950")
|
||||
ok(!strcmp(ret, "Chinese (Traditional)_Taiwan.950")
|
||||
|| broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "chs");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936")
|
||||
ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936")
|
||||
|| broken(!strcmp(ret, "Chinese_People's Republic of China.936")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "cht");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Chinese (Traditional)_Taiwan.950")
|
||||
ok(!strcmp(ret, "Chinese (Traditional)_Taiwan.950")
|
||||
|| broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "csy");
|
||||
|
@ -389,12 +390,14 @@ static void test_setlocale(void)
|
|||
ret = setlocale(LC_ALL, "italian-swiss");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Italian_Switzerland.1252") || broken(!strcmp(ret, "Italian_Italy.1252")), "ret = %s\n", ret);
|
||||
ok(!strcmp(ret, "Italian_Switzerland.1252")
|
||||
|| broken(!strcmp(ret, "Italian_Italy.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "its");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Italian_Switzerland.1252") || broken(!strcmp(ret, "Italian_Italy.1252")), "ret = %s\n", ret);
|
||||
ok(!strcmp(ret, "Italian_Switzerland.1252")
|
||||
|| broken(!strcmp(ret, "Italian_Italy.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "japanese");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
|
@ -430,30 +433,33 @@ static void test_setlocale(void)
|
|||
ret = setlocale(LC_ALL, "non");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok((!strcmp( ret, "Norwegian-Nynorsk_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian (Bokmål)_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian (Nynorsk)_Norway.1252")), "ret = %s\n", ret);
|
||||
ok(!strcmp( ret, "Norwegian-Nynorsk_Norway.1252")
|
||||
|| !strcmp(ret, "Norwegian (Nynorsk)_Norway.1252")
|
||||
|| broken(!strcmp(ret, "Norwegian (Bokm\xe5l)_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian_Norway.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "nor");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Norwegian (Bokmål)_Norway.1252")
|
||||
ok(!strcmp(ret, "Norwegian (Bokm\xe5l)_Norway.1252")
|
||||
|| !strcmp(ret, "Norwegian (Bokmal)_Norway.1252")
|
||||
|| broken(!strcmp(ret, "Norwegian_Norway.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "norwegian-bokmal");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Norwegian (Bokmål)_Norway.1252")
|
||||
ok(!strcmp(ret, "Norwegian (Bokm\xe5l)_Norway.1252")
|
||||
|| !strcmp(ret, "Norwegian (Bokmal)_Norway.1252")
|
||||
|| broken(!strcmp(ret, "Norwegian_Norway.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "norwegian-nynorsk");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Norwegian-Nynorsk_Norway.1252")
|
||||
ok(!strcmp(ret, "Norwegian-Nynorsk_Norway.1252")
|
||||
|| !strcmp(ret, "Norwegian (Nynorsk)_Norway.1252")
|
||||
|| broken(!strcmp(ret, "Norwegian_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian (Nynorsk)_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian (Bokmål)_Norway.1252")), "ret = %s\n", ret);
|
||||
|| broken(!strcmp(ret, "Norwegian (Bokmal)_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian (Bokm\xe5l)_Norway.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "plk");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
|
@ -520,8 +526,8 @@ static void test_setlocale(void)
|
|||
ret = setlocale(LC_ALL, "spanish-modern");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Spanish - Modern Sort_Spain.1252")
|
||||
|| broken(!strcmp(ret, "Spanish_Spain.1252")), "ret = %s\n", ret);
|
||||
ok(!strcmp(ret, "Spanish - Modern Sort_Spain.1252")
|
||||
|| !strcmp(ret, "Spanish_Spain.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "sve");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
|
|
|
@ -20,11 +20,16 @@
|
|||
|
||||
#include "wine/test.h"
|
||||
#include <errno.h>
|
||||
// #include "msvcrt.h"
|
||||
#include "msvcrt.h"
|
||||
|
||||
static int (__cdecl *prand_s)(unsigned int *);
|
||||
static int (__cdecl *pmemcpy_s)(void *, size_t, void*, size_t);
|
||||
static int (__cdecl *pmemcpy_s)(void *, MSVCRT_size_t, void*, MSVCRT_size_t);
|
||||
static int (__cdecl *pI10_OUTPUT)(long double, int, int, void*);
|
||||
static int (__cdecl *pstrerror_s)(char *, MSVCRT_size_t, int);
|
||||
static int (__cdecl *p_get_doserrno)(int *);
|
||||
static int (__cdecl *p_get_errno)(int *);
|
||||
static int (__cdecl *p_set_doserrno)(int);
|
||||
static int (__cdecl *p_set_errno)(int);
|
||||
|
||||
static void init(void)
|
||||
{
|
||||
|
@ -33,6 +38,11 @@ static void init(void)
|
|||
prand_s = (void *)GetProcAddress(hmod, "rand_s");
|
||||
pmemcpy_s = (void*)GetProcAddress(hmod, "memcpy_s");
|
||||
pI10_OUTPUT = (void*)GetProcAddress(hmod, "$I10_OUTPUT");
|
||||
pstrerror_s = (void *)GetProcAddress(hmod, "strerror_s");
|
||||
p_get_doserrno = (void *)GetProcAddress(hmod, "_get_doserrno");
|
||||
p_get_errno = (void *)GetProcAddress(hmod, "_get_errno");
|
||||
p_set_doserrno = (void *)GetProcAddress(hmod, "_set_doserrno");
|
||||
p_set_errno = (void *)GetProcAddress(hmod, "_set_errno");
|
||||
}
|
||||
|
||||
static void test_rand_s(void)
|
||||
|
@ -160,17 +170,28 @@ static const I10_OUTPUT_test I10_OUTPUT_tests[] = {
|
|||
static void test_I10_OUTPUT(void)
|
||||
{
|
||||
I10_OUTPUT_data out;
|
||||
int i, j, ret;
|
||||
int i, j = sizeof(long double), ret;
|
||||
|
||||
if(!pI10_OUTPUT) {
|
||||
win_skip("I10_OUTPUT not available\n");
|
||||
return;
|
||||
}
|
||||
if (j != 12)
|
||||
trace("sizeof(long double) = %d on this machine\n", j);
|
||||
|
||||
for(i=0; i<sizeof(I10_OUTPUT_tests)/sizeof(I10_OUTPUT_test); i++) {
|
||||
memset(out.str, '#', sizeof(out.str));
|
||||
|
||||
ret = pI10_OUTPUT(I10_OUTPUT_tests[i].d, I10_OUTPUT_tests[i].size, I10_OUTPUT_tests[i].flags, &out);
|
||||
if (sizeof(long double) == 12)
|
||||
ret = pI10_OUTPUT(I10_OUTPUT_tests[i].d, I10_OUTPUT_tests[i].size, I10_OUTPUT_tests[i].flags, &out);
|
||||
else {
|
||||
/* MS' "long double" is an 80 bit FP that takes 12 bytes*/
|
||||
typedef struct { ULONG x80[3]; } uld; /* same calling convention */
|
||||
union { long double ld; uld ld12; } fp80;
|
||||
int (__cdecl *pI10_OUTPUT12)(uld, int, int, void*) = (void*)pI10_OUTPUT;
|
||||
fp80.ld = I10_OUTPUT_tests[i].d;
|
||||
ret = pI10_OUTPUT12(fp80.ld12, I10_OUTPUT_tests[i].size, I10_OUTPUT_tests[i].flags, &out);
|
||||
}
|
||||
ok(ret == I10_OUTPUT_tests[i].ret, "%d: ret = %d\n", i, ret);
|
||||
ok(out.pos == I10_OUTPUT_tests[i].out.pos, "%d: out.pos = %hd\n", i, out.pos);
|
||||
ok(out.sign == I10_OUTPUT_tests[i].out.sign, "%d: out.size = %c\n", i, out.sign);
|
||||
|
@ -192,6 +213,155 @@ static void test_I10_OUTPUT(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void test_strerror_s(void)
|
||||
{
|
||||
int ret;
|
||||
char buf[256];
|
||||
|
||||
if (!pstrerror_s)
|
||||
{
|
||||
win_skip("strerror_s is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
errno = EBADF;
|
||||
ret = pstrerror_s(NULL, 0, 0);
|
||||
ok(ret == EINVAL, "Expected strerror_s to return EINVAL, got %d\n", ret);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
errno = EBADF;
|
||||
ret = pstrerror_s(NULL, sizeof(buf), 0);
|
||||
ok(ret == EINVAL, "Expected strerror_s to return EINVAL, got %d\n", ret);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
memset(buf, 'X', sizeof(buf));
|
||||
errno = EBADF;
|
||||
ret = pstrerror_s(buf, 0, 0);
|
||||
ok(ret == EINVAL, "Expected strerror_s to return EINVAL, got %d\n", ret);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
ok(buf[0] == 'X', "Expected output buffer to be untouched\n");
|
||||
|
||||
memset(buf, 'X', sizeof(buf));
|
||||
ret = pstrerror_s(buf, 1, 0);
|
||||
ok(ret == 0, "Expected strerror_s to return 0, got %d\n", ret);
|
||||
ok(strlen(buf) == 0, "Expected output buffer to be null terminated\n");
|
||||
|
||||
memset(buf, 'X', sizeof(buf));
|
||||
ret = pstrerror_s(buf, 2, 0);
|
||||
ok(ret == 0, "Expected strerror_s to return 0, got %d\n", ret);
|
||||
ok(strlen(buf) == 1, "Expected output buffer to be truncated\n");
|
||||
|
||||
memset(buf, 'X', sizeof(buf));
|
||||
ret = pstrerror_s(buf, sizeof(buf), 0);
|
||||
ok(ret == 0, "Expected strerror_s to return 0, got %d\n", ret);
|
||||
|
||||
memset(buf, 'X', sizeof(buf));
|
||||
ret = pstrerror_s(buf, sizeof(buf), -1);
|
||||
ok(ret == 0, "Expected strerror_s to return 0, got %d\n", ret);
|
||||
}
|
||||
|
||||
static void test__get_doserrno(void)
|
||||
{
|
||||
int ret, out;
|
||||
|
||||
if (!p_get_doserrno)
|
||||
{
|
||||
win_skip("_get_doserrno is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
_doserrno = ERROR_INVALID_CMM;
|
||||
errno = EBADF;
|
||||
ret = p_get_doserrno(NULL);
|
||||
ok(ret == EINVAL, "Expected _get_doserrno to return EINVAL, got %d\n", ret);
|
||||
ok(_doserrno == ERROR_INVALID_CMM, "Expected _doserrno to be ERROR_INVALID_CMM, got %d\n", _doserrno);
|
||||
ok(errno == EBADF, "Expected errno to be EBADF, got %d\n", errno);
|
||||
|
||||
_doserrno = ERROR_INVALID_CMM;
|
||||
errno = EBADF;
|
||||
out = 0xdeadbeef;
|
||||
ret = p_get_doserrno(&out);
|
||||
ok(ret == 0, "Expected _get_doserrno to return 0, got %d\n", ret);
|
||||
ok(out == ERROR_INVALID_CMM, "Expected output variable to be ERROR_INVAID_CMM, got %d\n", out);
|
||||
}
|
||||
|
||||
static void test__get_errno(void)
|
||||
{
|
||||
int ret, out;
|
||||
|
||||
if (!p_get_errno)
|
||||
{
|
||||
win_skip("_get_errno is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
errno = EBADF;
|
||||
ret = p_get_errno(NULL);
|
||||
ok(ret == EINVAL, "Expected _get_errno to return EINVAL, got %d\n", ret);
|
||||
ok(errno == EBADF, "Expected errno to be EBADF, got %d\n", errno);
|
||||
|
||||
errno = EBADF;
|
||||
out = 0xdeadbeef;
|
||||
ret = p_get_errno(&out);
|
||||
ok(ret == 0, "Expected _get_errno to return 0, got %d\n", ret);
|
||||
ok(out == EBADF, "Expected output variable to be EBADF, got %d\n", out);
|
||||
}
|
||||
|
||||
static void test__set_doserrno(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!p_set_doserrno)
|
||||
{
|
||||
win_skip("_set_doserrno is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
_doserrno = ERROR_INVALID_CMM;
|
||||
ret = p_set_doserrno(ERROR_FILE_NOT_FOUND);
|
||||
ok(ret == 0, "Expected _set_doserrno to return 0, got %d\n", ret);
|
||||
ok(_doserrno == ERROR_FILE_NOT_FOUND,
|
||||
"Expected _doserrno to be ERROR_FILE_NOT_FOUND, got %d\n", _doserrno);
|
||||
|
||||
_doserrno = ERROR_INVALID_CMM;
|
||||
ret = p_set_doserrno(-1);
|
||||
ok(ret == 0, "Expected _set_doserrno to return 0, got %d\n", ret);
|
||||
ok(_doserrno == -1,
|
||||
"Expected _doserrno to be -1, got %d\n", _doserrno);
|
||||
|
||||
_doserrno = ERROR_INVALID_CMM;
|
||||
ret = p_set_doserrno(0xdeadbeef);
|
||||
ok(ret == 0, "Expected _set_doserrno to return 0, got %d\n", ret);
|
||||
ok(_doserrno == 0xdeadbeef,
|
||||
"Expected _doserrno to be 0xdeadbeef, got %d\n", _doserrno);
|
||||
}
|
||||
|
||||
static void test__set_errno(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!p_set_errno)
|
||||
{
|
||||
win_skip("_set_errno is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
errno = EBADF;
|
||||
ret = p_set_errno(EINVAL);
|
||||
ok(ret == 0, "Expected _set_errno to return 0, got %d\n", ret);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
errno = EBADF;
|
||||
ret = p_set_errno(-1);
|
||||
ok(ret == 0, "Expected _set_errno to return 0, got %d\n", ret);
|
||||
ok(errno == -1, "Expected errno to be -1, got %d\n", errno);
|
||||
|
||||
errno = EBADF;
|
||||
ret = p_set_errno(0xdeadbeef);
|
||||
ok(ret == 0, "Expected _set_errno to return 0, got %d\n", ret);
|
||||
ok(errno == 0xdeadbeef, "Expected errno to be 0xdeadbeef, got %d\n", errno);
|
||||
}
|
||||
|
||||
START_TEST(misc)
|
||||
{
|
||||
init();
|
||||
|
@ -199,4 +369,9 @@ START_TEST(misc)
|
|||
test_rand_s();
|
||||
test_memcpy_s();
|
||||
test_I10_OUTPUT();
|
||||
test_strerror_s();
|
||||
test__get_doserrno();
|
||||
test__get_errno();
|
||||
test__set_doserrno();
|
||||
test__set_errno();
|
||||
}
|
||||
|
|
969
rostests/winetests/msvcrt/msvcrt.h
Normal file
969
rostests/winetests/msvcrt/msvcrt.h
Normal file
|
@ -0,0 +1,969 @@
|
|||
/*
|
||||
* Copyright 2001 Jon Griffiths
|
||||
* Copyright 2004 Dimitrie O. Paun
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*
|
||||
* NOTES
|
||||
* Naming conventions
|
||||
* - Symbols are prefixed with MSVCRT_ if they conflict
|
||||
* with libc symbols
|
||||
* - Internal symbols are usually prefixed by msvcrt_.
|
||||
* - Exported symbols that are not present in the public
|
||||
* headers are usually kept the same as the original.
|
||||
* Other conventions
|
||||
* - To avoid conflicts with the standard C library,
|
||||
* no msvcrt headers are included in the implementation.
|
||||
* - Instead, symbols are duplicated here, prefixed with
|
||||
* MSVCRT_, as explained above.
|
||||
* - To avoid inconsistencies, a test for each symbol is
|
||||
* added into tests/headers.c. Please always add a
|
||||
* corresponding test when you add a new symbol!
|
||||
*/
|
||||
|
||||
#ifndef __WINE_MSVCRT_H
|
||||
#define __WINE_MSVCRT_H
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
|
||||
#define MSVCRT_LONG_MAX 0x7fffffffL
|
||||
#define MSVCRT_ULONG_MAX 0xffffffffUL
|
||||
#define MSVCRT_I64_MAX (((__int64)0x7fffffff << 32) | 0xffffffff)
|
||||
#define MSVCRT_I64_MIN (-MSVCRT_I64_MAX-1)
|
||||
#define MSVCRT_UI64_MAX (((unsigned __int64)0xffffffff << 32) | 0xffffffff)
|
||||
|
||||
#define MSVCRT__MAX_DRIVE 3
|
||||
#define MSVCRT__MAX_DIR 256
|
||||
#define MSVCRT__MAX_FNAME 256
|
||||
#define MSVCRT__MAX_EXT 256
|
||||
|
||||
typedef unsigned short MSVCRT_wchar_t;
|
||||
typedef unsigned short MSVCRT_wint_t;
|
||||
typedef unsigned short MSVCRT_wctype_t;
|
||||
typedef unsigned short MSVCRT__ino_t;
|
||||
typedef unsigned int MSVCRT__fsize_t;
|
||||
typedef int MSVCRT_long;
|
||||
typedef unsigned int MSVCRT_ulong;
|
||||
#ifdef _WIN64
|
||||
typedef unsigned __int64 MSVCRT_size_t;
|
||||
typedef __int64 MSVCRT_intptr_t;
|
||||
typedef unsigned __int64 MSVCRT_uintptr_t;
|
||||
#else
|
||||
typedef unsigned long MSVCRT_size_t;
|
||||
typedef long MSVCRT_intptr_t;
|
||||
typedef unsigned long MSVCRT_uintptr_t;
|
||||
#endif
|
||||
typedef unsigned int MSVCRT__dev_t;
|
||||
typedef int MSVCRT__off_t;
|
||||
typedef int MSVCRT_clock_t;
|
||||
typedef int MSVCRT___time32_t;
|
||||
typedef __int64 DECLSPEC_ALIGN(8) MSVCRT___time64_t;
|
||||
typedef __int64 DECLSPEC_ALIGN(8) MSVCRT_fpos_t;
|
||||
typedef int MSVCRT_mbstate_t;
|
||||
|
||||
typedef void (__cdecl *MSVCRT_terminate_handler)(void);
|
||||
typedef void (__cdecl *MSVCRT_terminate_function)(void);
|
||||
typedef void (__cdecl *MSVCRT_unexpected_handler)(void);
|
||||
typedef void (__cdecl *MSVCRT_unexpected_function)(void);
|
||||
typedef void (__cdecl *MSVCRT__se_translator_function)(unsigned int code, struct _EXCEPTION_POINTERS *info);
|
||||
typedef void (__cdecl *MSVCRT__beginthread_start_routine_t)(void *);
|
||||
typedef unsigned int (__stdcall *MSVCRT__beginthreadex_start_routine_t)(void *);
|
||||
typedef int (__cdecl *MSVCRT__onexit_t)(void);
|
||||
typedef void (__cdecl *MSVCRT_invalid_parameter_handler)(const MSVCRT_wchar_t*, const MSVCRT_wchar_t*, const MSVCRT_wchar_t*, unsigned, MSVCRT_uintptr_t);
|
||||
typedef void (__cdecl *MSVCRT_purecall_handler)(void);
|
||||
typedef void (__cdecl *MSVCRT_security_error_handler)(int, void *);
|
||||
|
||||
typedef struct {ULONG x80[3];} MSVCRT__LDOUBLE; /* Intel 80 bit FP format has sizeof() 12 */
|
||||
|
||||
struct MSVCRT_tm {
|
||||
int tm_sec;
|
||||
int tm_min;
|
||||
int tm_hour;
|
||||
int tm_mday;
|
||||
int tm_mon;
|
||||
int tm_year;
|
||||
int tm_wday;
|
||||
int tm_yday;
|
||||
int tm_isdst;
|
||||
};
|
||||
|
||||
typedef struct MSVCRT_tagLC_ID {
|
||||
unsigned short wLanguage;
|
||||
unsigned short wCountry;
|
||||
unsigned short wCodePage;
|
||||
} MSVCRT_LC_ID, *MSVCRT_LPLC_ID;
|
||||
|
||||
typedef struct MSVCRT_threadlocaleinfostruct {
|
||||
int refcount;
|
||||
unsigned int lc_codepage;
|
||||
unsigned int lc_collate_cp;
|
||||
MSVCRT_ulong lc_handle[6];
|
||||
MSVCRT_LC_ID lc_id[6];
|
||||
struct {
|
||||
char *locale;
|
||||
wchar_t *wlocale;
|
||||
int *refcount;
|
||||
int *wrefcount;
|
||||
} lc_category[6];
|
||||
int lc_clike;
|
||||
int mb_cur_max;
|
||||
int *lconv_intl_refcount;
|
||||
int *lconv_num_refcount;
|
||||
int *lconv_mon_refcount;
|
||||
struct MSVCRT_lconv *lconv;
|
||||
int *ctype1_refcount;
|
||||
unsigned short *ctype1;
|
||||
unsigned short *pctype;
|
||||
unsigned char *pclmap;
|
||||
unsigned char *pcumap;
|
||||
struct MSVCRT___lc_time_data *lc_time_curr;
|
||||
} MSVCRT_threadlocinfo;
|
||||
|
||||
typedef struct MSVCRT_threadmbcinfostruct {
|
||||
int refcount;
|
||||
int mbcodepage;
|
||||
int ismbcodepage;
|
||||
int mblcid;
|
||||
unsigned short mbulinfo[6];
|
||||
unsigned char mbctype[257];
|
||||
unsigned char mbcasemap[256];
|
||||
} MSVCRT_threadmbcinfo;
|
||||
|
||||
typedef struct MSVCRT_threadlocaleinfostruct *MSVCRT_pthreadlocinfo;
|
||||
typedef struct MSVCRT_threadmbcinfostruct *MSVCRT_pthreadmbcinfo;
|
||||
|
||||
typedef struct MSVCRT_localeinfo_struct
|
||||
{
|
||||
MSVCRT_pthreadlocinfo locinfo;
|
||||
MSVCRT_pthreadmbcinfo mbcinfo;
|
||||
} MSVCRT__locale_tstruct, *MSVCRT__locale_t;
|
||||
|
||||
|
||||
/* TLS data */
|
||||
extern DWORD msvcrt_tls_index;
|
||||
|
||||
/* Keep in sync with msvcr90/tests/msvcr90.c */
|
||||
struct __thread_data {
|
||||
DWORD tid;
|
||||
HANDLE handle;
|
||||
int thread_errno;
|
||||
MSVCRT_ulong thread_doserrno;
|
||||
int unk1;
|
||||
unsigned int random_seed; /* seed for rand() */
|
||||
char *strtok_next; /* next ptr for strtok() */
|
||||
MSVCRT_wchar_t *wcstok_next; /* next ptr for wcstok() */
|
||||
unsigned char *mbstok_next; /* next ptr for mbstok() */
|
||||
char *strerror_buffer; /* buffer for strerror */
|
||||
MSVCRT_wchar_t *wcserror_buffer; /* buffer for wcserror */
|
||||
char *tmpnam_buffer; /* buffer for tmpname() */
|
||||
MSVCRT_wchar_t *wtmpnam_buffer; /* buffer for wtmpname() */
|
||||
void *unk2[2];
|
||||
char *asctime_buffer; /* buffer for asctime */
|
||||
MSVCRT_wchar_t *wasctime_buffer; /* buffer for wasctime */
|
||||
struct MSVCRT_tm *time_buffer; /* buffer for localtime/gmtime */
|
||||
char *efcvt_buffer; /* buffer for ecvt/fcvt */
|
||||
int unk3[2];
|
||||
void *unk4[4];
|
||||
int fpecode;
|
||||
MSVCRT_pthreadmbcinfo mbcinfo;
|
||||
MSVCRT_pthreadlocinfo locinfo;
|
||||
BOOL have_locale;
|
||||
int unk5[1];
|
||||
MSVCRT_terminate_function terminate_handler;
|
||||
MSVCRT_unexpected_function unexpected_handler;
|
||||
MSVCRT__se_translator_function se_translator;
|
||||
void *unk6[3];
|
||||
int unk7;
|
||||
EXCEPTION_RECORD *exc_record;
|
||||
void *unk8[100];
|
||||
};
|
||||
|
||||
typedef struct __thread_data thread_data_t;
|
||||
|
||||
extern thread_data_t *msvcrt_get_thread_data(void);
|
||||
|
||||
LCID MSVCRT_locale_to_LCID(const char *);
|
||||
extern MSVCRT__locale_t MSVCRT_locale;
|
||||
extern int MSVCRT___lc_codepage;
|
||||
extern int MSVCRT___lc_collate_cp;
|
||||
extern WORD MSVCRT__ctype [257];
|
||||
|
||||
void msvcrt_set_errno(int);
|
||||
|
||||
void __cdecl _purecall(void);
|
||||
void __cdecl _amsg_exit(int errnum);
|
||||
|
||||
extern char **MSVCRT__environ;
|
||||
extern MSVCRT_wchar_t **MSVCRT__wenviron;
|
||||
|
||||
extern char ** msvcrt_SnapshotOfEnvironmentA(char **);
|
||||
extern MSVCRT_wchar_t ** msvcrt_SnapshotOfEnvironmentW(MSVCRT_wchar_t **);
|
||||
|
||||
MSVCRT_wchar_t *msvcrt_wstrdupa(const char *);
|
||||
|
||||
/* FIXME: This should be declared in new.h but it's not an extern "C" so
|
||||
* it would not be much use anyway. Even for Winelib applications.
|
||||
*/
|
||||
int __cdecl MSVCRT__set_new_mode(int mode);
|
||||
|
||||
void* __cdecl MSVCRT_operator_new(MSVCRT_size_t);
|
||||
void __cdecl MSVCRT_operator_delete(void*);
|
||||
|
||||
typedef void* (__cdecl *malloc_func_t)(MSVCRT_size_t);
|
||||
typedef void (__cdecl *free_func_t)(void*);
|
||||
|
||||
extern char* __cdecl __unDName(char *,const char*,int,malloc_func_t,free_func_t,unsigned short int);
|
||||
extern char* __cdecl __unDNameEx(char *,const char*,int,malloc_func_t,free_func_t,void *,unsigned short int);
|
||||
|
||||
/* Setup and teardown multi threaded locks */
|
||||
extern void msvcrt_init_mt_locks(void);
|
||||
extern void msvcrt_free_mt_locks(void);
|
||||
|
||||
extern BOOL msvcrt_init_locale(void);
|
||||
extern void msvcrt_init_math(void);
|
||||
extern void msvcrt_init_io(void);
|
||||
extern void msvcrt_free_io(void);
|
||||
extern void msvcrt_init_console(void);
|
||||
extern void msvcrt_free_console(void);
|
||||
extern void msvcrt_init_args(void);
|
||||
extern void msvcrt_free_args(void);
|
||||
extern void msvcrt_init_signals(void);
|
||||
extern void msvcrt_free_signals(void);
|
||||
|
||||
extern unsigned msvcrt_create_io_inherit_block(WORD*, BYTE**);
|
||||
|
||||
extern unsigned int __cdecl _control87(unsigned int, unsigned int);
|
||||
|
||||
/* run-time error codes */
|
||||
#define _RT_STACK 0
|
||||
#define _RT_NULLPTR 1
|
||||
#define _RT_FLOAT 2
|
||||
#define _RT_INTDIV 3
|
||||
#define _RT_EXECMEM 5
|
||||
#define _RT_EXECFORM 6
|
||||
#define _RT_EXECENV 7
|
||||
#define _RT_SPACEARG 8
|
||||
#define _RT_SPACEENV 9
|
||||
#define _RT_ABORT 10
|
||||
#define _RT_NPTR 12
|
||||
#define _RT_FPTR 13
|
||||
#define _RT_BREAK 14
|
||||
#define _RT_INT 15
|
||||
#define _RT_THREAD 16
|
||||
#define _RT_LOCK 17
|
||||
#define _RT_HEAP 18
|
||||
#define _RT_OPENCON 19
|
||||
#define _RT_QWIN 20
|
||||
#define _RT_NOMAIN 21
|
||||
#define _RT_NONCONT 22
|
||||
#define _RT_INVALDISP 23
|
||||
#define _RT_ONEXIT 24
|
||||
#define _RT_PUREVIRT 25
|
||||
#define _RT_STDIOINIT 26
|
||||
#define _RT_LOWIOINIT 27
|
||||
#define _RT_HEAPINIT 28
|
||||
#define _RT_DOMAIN 120
|
||||
#define _RT_SING 121
|
||||
#define _RT_TLOSS 122
|
||||
#define _RT_CRNL 252
|
||||
#define _RT_BANNER 255
|
||||
|
||||
struct MSVCRT___timeb32 {
|
||||
MSVCRT___time32_t time;
|
||||
unsigned short millitm;
|
||||
short timezone;
|
||||
short dstflag;
|
||||
};
|
||||
|
||||
struct MSVCRT___timeb64 {
|
||||
MSVCRT___time64_t time;
|
||||
unsigned short millitm;
|
||||
short timezone;
|
||||
short dstflag;
|
||||
};
|
||||
|
||||
struct MSVCRT__iobuf {
|
||||
char* _ptr;
|
||||
int _cnt;
|
||||
char* _base;
|
||||
int _flag;
|
||||
int _file;
|
||||
int _charbuf;
|
||||
int _bufsiz;
|
||||
char* _tmpfname;
|
||||
};
|
||||
|
||||
typedef struct MSVCRT__iobuf MSVCRT_FILE;
|
||||
|
||||
struct MSVCRT_lconv {
|
||||
char* decimal_point;
|
||||
char* thousands_sep;
|
||||
char* grouping;
|
||||
char* int_curr_symbol;
|
||||
char* currency_symbol;
|
||||
char* mon_decimal_point;
|
||||
char* mon_thousands_sep;
|
||||
char* mon_grouping;
|
||||
char* positive_sign;
|
||||
char* negative_sign;
|
||||
char int_frac_digits;
|
||||
char frac_digits;
|
||||
char p_cs_precedes;
|
||||
char p_sep_by_space;
|
||||
char n_cs_precedes;
|
||||
char n_sep_by_space;
|
||||
char p_sign_posn;
|
||||
char n_sign_posn;
|
||||
};
|
||||
|
||||
struct MSVCRT__exception {
|
||||
int type;
|
||||
char* name;
|
||||
double arg1;
|
||||
double arg2;
|
||||
double retval;
|
||||
};
|
||||
|
||||
struct MSVCRT__complex {
|
||||
double x; /* Real part */
|
||||
double y; /* Imaginary part */
|
||||
};
|
||||
|
||||
typedef struct MSVCRT__div_t {
|
||||
int quot; /* quotient */
|
||||
int rem; /* remainder */
|
||||
} MSVCRT_div_t;
|
||||
|
||||
typedef struct MSVCRT__ldiv_t {
|
||||
MSVCRT_long quot; /* quotient */
|
||||
MSVCRT_long rem; /* remainder */
|
||||
} MSVCRT_ldiv_t;
|
||||
|
||||
struct MSVCRT__heapinfo {
|
||||
int* _pentry;
|
||||
MSVCRT_size_t _size;
|
||||
int _useflag;
|
||||
};
|
||||
|
||||
#ifdef __i386__
|
||||
struct MSVCRT___JUMP_BUFFER {
|
||||
unsigned long Ebp;
|
||||
unsigned long Ebx;
|
||||
unsigned long Edi;
|
||||
unsigned long Esi;
|
||||
unsigned long Esp;
|
||||
unsigned long Eip;
|
||||
unsigned long Registration;
|
||||
unsigned long TryLevel;
|
||||
/* Start of new struct members */
|
||||
unsigned long Cookie;
|
||||
unsigned long UnwindFunc;
|
||||
unsigned long UnwindData[6];
|
||||
};
|
||||
#elif defined(__x86_64__)
|
||||
struct MSVCRT__SETJMP_FLOAT128
|
||||
{
|
||||
unsigned __int64 DECLSPEC_ALIGN(16) Part[2];
|
||||
};
|
||||
struct MSVCRT___JUMP_BUFFER
|
||||
{
|
||||
unsigned __int64 Frame;
|
||||
unsigned __int64 Rbx;
|
||||
unsigned __int64 Rsp;
|
||||
unsigned __int64 Rbp;
|
||||
unsigned __int64 Rsi;
|
||||
unsigned __int64 Rdi;
|
||||
unsigned __int64 R12;
|
||||
unsigned __int64 R13;
|
||||
unsigned __int64 R14;
|
||||
unsigned __int64 R15;
|
||||
unsigned __int64 Rip;
|
||||
unsigned __int64 Spare;
|
||||
struct MSVCRT__SETJMP_FLOAT128 Xmm6;
|
||||
struct MSVCRT__SETJMP_FLOAT128 Xmm7;
|
||||
struct MSVCRT__SETJMP_FLOAT128 Xmm8;
|
||||
struct MSVCRT__SETJMP_FLOAT128 Xmm9;
|
||||
struct MSVCRT__SETJMP_FLOAT128 Xmm10;
|
||||
struct MSVCRT__SETJMP_FLOAT128 Xmm11;
|
||||
struct MSVCRT__SETJMP_FLOAT128 Xmm12;
|
||||
struct MSVCRT__SETJMP_FLOAT128 Xmm13;
|
||||
struct MSVCRT__SETJMP_FLOAT128 Xmm14;
|
||||
struct MSVCRT__SETJMP_FLOAT128 Xmm15;
|
||||
};
|
||||
#endif /* __i386__ */
|
||||
|
||||
struct MSVCRT__diskfree_t {
|
||||
unsigned int total_clusters;
|
||||
unsigned int avail_clusters;
|
||||
unsigned int sectors_per_cluster;
|
||||
unsigned int bytes_per_sector;
|
||||
};
|
||||
|
||||
struct MSVCRT__finddata32_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time32_t time_create;
|
||||
MSVCRT___time32_t time_access;
|
||||
MSVCRT___time32_t time_write;
|
||||
MSVCRT__fsize_t size;
|
||||
char name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__finddata32i64_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time32_t time_create;
|
||||
MSVCRT___time32_t time_access;
|
||||
MSVCRT___time32_t time_write;
|
||||
__int64 DECLSPEC_ALIGN(8) size;
|
||||
char name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__finddata64i32_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time64_t time_create;
|
||||
MSVCRT___time64_t time_access;
|
||||
MSVCRT___time64_t time_write;
|
||||
MSVCRT__fsize_t size;
|
||||
char name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__finddata64_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time64_t time_create;
|
||||
MSVCRT___time64_t time_access;
|
||||
MSVCRT___time64_t time_write;
|
||||
__int64 DECLSPEC_ALIGN(8) size;
|
||||
char name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__wfinddata32_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time32_t time_create;
|
||||
MSVCRT___time32_t time_access;
|
||||
MSVCRT___time32_t time_write;
|
||||
MSVCRT__fsize_t size;
|
||||
MSVCRT_wchar_t name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__wfinddata32i64_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time32_t time_create;
|
||||
MSVCRT___time32_t time_access;
|
||||
MSVCRT___time32_t time_write;
|
||||
__int64 DECLSPEC_ALIGN(8) size;
|
||||
MSVCRT_wchar_t name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__wfinddata64i32_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time64_t time_create;
|
||||
MSVCRT___time64_t time_access;
|
||||
MSVCRT___time64_t time_write;
|
||||
MSVCRT__fsize_t size;
|
||||
MSVCRT_wchar_t name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__wfinddata64_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time64_t time_create;
|
||||
MSVCRT___time64_t time_access;
|
||||
MSVCRT___time64_t time_write;
|
||||
__int64 DECLSPEC_ALIGN(8) size;
|
||||
MSVCRT_wchar_t name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT___utimbuf32
|
||||
{
|
||||
MSVCRT___time32_t actime;
|
||||
MSVCRT___time32_t modtime;
|
||||
};
|
||||
|
||||
struct MSVCRT___utimbuf64
|
||||
{
|
||||
MSVCRT___time64_t actime;
|
||||
MSVCRT___time64_t modtime;
|
||||
};
|
||||
|
||||
/* for FreeBSD */
|
||||
#undef st_atime
|
||||
#undef st_ctime
|
||||
#undef st_mtime
|
||||
|
||||
struct MSVCRT__stat32 {
|
||||
MSVCRT__dev_t st_dev;
|
||||
MSVCRT__ino_t st_ino;
|
||||
unsigned short st_mode;
|
||||
short st_nlink;
|
||||
short st_uid;
|
||||
short st_gid;
|
||||
MSVCRT__dev_t st_rdev;
|
||||
MSVCRT__off_t st_size;
|
||||
MSVCRT___time32_t st_atime;
|
||||
MSVCRT___time32_t st_mtime;
|
||||
MSVCRT___time32_t st_ctime;
|
||||
};
|
||||
|
||||
struct MSVCRT__stat32i64 {
|
||||
MSVCRT__dev_t st_dev;
|
||||
MSVCRT__ino_t st_ino;
|
||||
unsigned short st_mode;
|
||||
short st_nlink;
|
||||
short st_uid;
|
||||
short st_gid;
|
||||
MSVCRT__dev_t st_rdev;
|
||||
__int64 DECLSPEC_ALIGN(8) st_size;
|
||||
MSVCRT___time32_t st_atime;
|
||||
MSVCRT___time32_t st_mtime;
|
||||
MSVCRT___time32_t st_ctime;
|
||||
};
|
||||
|
||||
struct MSVCRT__stat64i32 {
|
||||
MSVCRT__dev_t st_dev;
|
||||
MSVCRT__ino_t st_ino;
|
||||
unsigned short st_mode;
|
||||
short st_nlink;
|
||||
short st_uid;
|
||||
short st_gid;
|
||||
MSVCRT__dev_t st_rdev;
|
||||
MSVCRT__off_t st_size;
|
||||
MSVCRT___time64_t st_atime;
|
||||
MSVCRT___time64_t st_mtime;
|
||||
MSVCRT___time64_t st_ctime;
|
||||
};
|
||||
|
||||
struct MSVCRT__stat64 {
|
||||
MSVCRT__dev_t st_dev;
|
||||
MSVCRT__ino_t st_ino;
|
||||
unsigned short st_mode;
|
||||
short st_nlink;
|
||||
short st_uid;
|
||||
short st_gid;
|
||||
MSVCRT__dev_t st_rdev;
|
||||
__int64 DECLSPEC_ALIGN(8) st_size;
|
||||
MSVCRT___time64_t st_atime;
|
||||
MSVCRT___time64_t st_mtime;
|
||||
MSVCRT___time64_t st_ctime;
|
||||
};
|
||||
|
||||
#ifdef _WIN64
|
||||
#define MSVCRT__finddata_t MSVCRT__finddata64i32_t
|
||||
#define MSVCRT__finddatai64_t MSVCRT__finddata64_t
|
||||
#define MSVCRT__wfinddata_t MSVCRT__wfinddata64i32_t
|
||||
#define MSVCRT__wfinddatai64_t MSVCRT__wfinddata64_t
|
||||
#define MSVCRT__stat MSVCRT__stat64i32
|
||||
#define MSVCRT__stati64 MSVCRT__stat64
|
||||
#else
|
||||
#define MSVCRT__finddata_t MSVCRT__finddata32_t
|
||||
#define MSVCRT__finddatai64_t MSVCRT__finddata32i64_t
|
||||
#define MSVCRT__wfinddata_t MSVCRT__wfinddata32_t
|
||||
#define MSVCRT__wfinddatai64_t MSVCRT__wfinddata32i64_t
|
||||
#define MSVCRT__stat MSVCRT__stat32
|
||||
#define MSVCRT__stati64 MSVCRT__stat32i64
|
||||
#endif
|
||||
|
||||
#define MSVCRT_WEOF (MSVCRT_wint_t)(0xFFFF)
|
||||
#define MSVCRT_EOF (-1)
|
||||
#define MSVCRT_TMP_MAX 0x7fff
|
||||
#define MSVCRT_RAND_MAX 0x7fff
|
||||
#define MSVCRT_BUFSIZ 512
|
||||
|
||||
#define MSVCRT_STDIN_FILENO 0
|
||||
#define MSVCRT_STDOUT_FILENO 1
|
||||
#define MSVCRT_STDERR_FILENO 2
|
||||
|
||||
/* more file._flag flags, but these conflict with Unix */
|
||||
#define MSVCRT__IOFBF 0x0000
|
||||
#define MSVCRT__IONBF 0x0004
|
||||
#define MSVCRT__IOLBF 0x0040
|
||||
|
||||
#define MSVCRT_FILENAME_MAX 260
|
||||
#define MSVCRT_DRIVE_MAX 3
|
||||
#define MSVCRT_FNAME_MAX 256
|
||||
#define MSVCRT_DIR_MAX 256
|
||||
#define MSVCRT_EXT_MAX 256
|
||||
#define MSVCRT_PATH_MAX 260
|
||||
#define MSVCRT_stdin (MSVCRT__iob+MSVCRT_STDIN_FILENO)
|
||||
#define MSVCRT_stdout (MSVCRT__iob+MSVCRT_STDOUT_FILENO)
|
||||
#define MSVCRT_stderr (MSVCRT__iob+MSVCRT_STDERR_FILENO)
|
||||
|
||||
#define MSVCRT__P_WAIT 0
|
||||
#define MSVCRT__P_NOWAIT 1
|
||||
#define MSVCRT__P_OVERLAY 2
|
||||
#define MSVCRT__P_NOWAITO 3
|
||||
#define MSVCRT__P_DETACH 4
|
||||
|
||||
#define MSVCRT_EPERM 1
|
||||
#define MSVCRT_ENOENT 2
|
||||
#define MSVCRT_ESRCH 3
|
||||
#define MSVCRT_EINTR 4
|
||||
#define MSVCRT_EIO 5
|
||||
#define MSVCRT_ENXIO 6
|
||||
#define MSVCRT_E2BIG 7
|
||||
#define MSVCRT_ENOEXEC 8
|
||||
#define MSVCRT_EBADF 9
|
||||
#define MSVCRT_ECHILD 10
|
||||
#define MSVCRT_EAGAIN 11
|
||||
#define MSVCRT_ENOMEM 12
|
||||
#define MSVCRT_EACCES 13
|
||||
#define MSVCRT_EFAULT 14
|
||||
#define MSVCRT_EBUSY 16
|
||||
#define MSVCRT_EEXIST 17
|
||||
#define MSVCRT_EXDEV 18
|
||||
#define MSVCRT_ENODEV 19
|
||||
#define MSVCRT_ENOTDIR 20
|
||||
#define MSVCRT_EISDIR 21
|
||||
#define MSVCRT_EINVAL 22
|
||||
#define MSVCRT_ENFILE 23
|
||||
#define MSVCRT_EMFILE 24
|
||||
#define MSVCRT_ENOTTY 25
|
||||
#define MSVCRT_EFBIG 27
|
||||
#define MSVCRT_ENOSPC 28
|
||||
#define MSVCRT_ESPIPE 29
|
||||
#define MSVCRT_EROFS 30
|
||||
#define MSVCRT_EMLINK 31
|
||||
#define MSVCRT_EPIPE 32
|
||||
#define MSVCRT_EDOM 33
|
||||
#define MSVCRT_ERANGE 34
|
||||
#define MSVCRT_EDEADLK 36
|
||||
#define MSVCRT_EDEADLOCK MSVCRT_EDEADLK
|
||||
#define MSVCRT_ENAMETOOLONG 38
|
||||
#define MSVCRT_ENOLCK 39
|
||||
#define MSVCRT_ENOSYS 40
|
||||
#define MSVCRT_ENOTEMPTY 41
|
||||
#define MSVCRT_EILSEQ 42
|
||||
#define MSVCRT_STRUNCATE 80
|
||||
|
||||
#define MSVCRT_LC_ALL 0
|
||||
#define MSVCRT_LC_COLLATE 1
|
||||
#define MSVCRT_LC_CTYPE 2
|
||||
#define MSVCRT_LC_MONETARY 3
|
||||
#define MSVCRT_LC_NUMERIC 4
|
||||
#define MSVCRT_LC_TIME 5
|
||||
#define MSVCRT_LC_MIN MSVCRT_LC_ALL
|
||||
#define MSVCRT_LC_MAX MSVCRT_LC_TIME
|
||||
|
||||
#define MSVCRT__HEAPEMPTY -1
|
||||
#define MSVCRT__HEAPOK -2
|
||||
#define MSVCRT__HEAPBADBEGIN -3
|
||||
#define MSVCRT__HEAPBADNODE -4
|
||||
#define MSVCRT__HEAPEND -5
|
||||
#define MSVCRT__HEAPBADPTR -6
|
||||
|
||||
#define MSVCRT__FREEENTRY 0
|
||||
#define MSVCRT__USEDENTRY 1
|
||||
|
||||
#define MSVCRT__OUT_TO_DEFAULT 0
|
||||
#define MSVCRT__OUT_TO_STDERR 1
|
||||
#define MSVCRT__OUT_TO_MSGBOX 2
|
||||
#define MSVCRT__REPORT_ERRMODE 3
|
||||
|
||||
/* ASCII char classification table - binary compatible */
|
||||
#define MSVCRT__UPPER 0x0001 /* C1_UPPER */
|
||||
#define MSVCRT__LOWER 0x0002 /* C1_LOWER */
|
||||
#define MSVCRT__DIGIT 0x0004 /* C1_DIGIT */
|
||||
#define MSVCRT__SPACE 0x0008 /* C1_SPACE */
|
||||
#define MSVCRT__PUNCT 0x0010 /* C1_PUNCT */
|
||||
#define MSVCRT__CONTROL 0x0020 /* C1_CNTRL */
|
||||
#define MSVCRT__BLANK 0x0040 /* C1_BLANK */
|
||||
#define MSVCRT__HEX 0x0080 /* C1_XDIGIT */
|
||||
#define MSVCRT__LEADBYTE 0x8000
|
||||
#define MSVCRT__ALPHA (0x0100|MSVCRT__UPPER|MSVCRT__LOWER) /* (C1_ALPHA|_UPPER|_LOWER) */
|
||||
|
||||
#define MSVCRT__IOREAD 0x0001
|
||||
#define MSVCRT__IOWRT 0x0002
|
||||
#define MSVCRT__IOMYBUF 0x0008
|
||||
#define MSVCRT__IOEOF 0x0010
|
||||
#define MSVCRT__IOERR 0x0020
|
||||
#define MSVCRT__IOSTRG 0x0040
|
||||
#define MSVCRT__IORW 0x0080
|
||||
|
||||
#define MSVCRT__S_IEXEC 0x0040
|
||||
#define MSVCRT__S_IWRITE 0x0080
|
||||
#define MSVCRT__S_IREAD 0x0100
|
||||
#define MSVCRT__S_IFIFO 0x1000
|
||||
#define MSVCRT__S_IFCHR 0x2000
|
||||
#define MSVCRT__S_IFDIR 0x4000
|
||||
#define MSVCRT__S_IFREG 0x8000
|
||||
#define MSVCRT__S_IFMT 0xF000
|
||||
|
||||
#define MSVCRT__LK_UNLCK 0
|
||||
#define MSVCRT__LK_LOCK 1
|
||||
#define MSVCRT__LK_NBLCK 2
|
||||
#define MSVCRT__LK_RLCK 3
|
||||
#define MSVCRT__LK_NBRLCK 4
|
||||
|
||||
#define MSVCRT__SH_COMPAT 0x00 /* Compatibility */
|
||||
#define MSVCRT__SH_DENYRW 0x10 /* Deny read/write */
|
||||
#define MSVCRT__SH_DENYWR 0x20 /* Deny write */
|
||||
#define MSVCRT__SH_DENYRD 0x30 /* Deny read */
|
||||
#define MSVCRT__SH_DENYNO 0x40 /* Deny nothing */
|
||||
|
||||
#define MSVCRT__O_RDONLY 0
|
||||
#define MSVCRT__O_WRONLY 1
|
||||
#define MSVCRT__O_RDWR 2
|
||||
#define MSVCRT__O_ACCMODE (MSVCRT__O_RDONLY|MSVCRT__O_WRONLY|MSVCRT__O_RDWR)
|
||||
#define MSVCRT__O_APPEND 0x0008
|
||||
#define MSVCRT__O_RANDOM 0x0010
|
||||
#define MSVCRT__O_SEQUENTIAL 0x0020
|
||||
#define MSVCRT__O_TEMPORARY 0x0040
|
||||
#define MSVCRT__O_NOINHERIT 0x0080
|
||||
#define MSVCRT__O_CREAT 0x0100
|
||||
#define MSVCRT__O_TRUNC 0x0200
|
||||
#define MSVCRT__O_EXCL 0x0400
|
||||
#define MSVCRT__O_SHORT_LIVED 0x1000
|
||||
#define MSVCRT__O_TEXT 0x4000
|
||||
#define MSVCRT__O_BINARY 0x8000
|
||||
#define MSVCRT__O_RAW MSVCRT__O_BINARY
|
||||
|
||||
/* _statusfp bit flags */
|
||||
#define MSVCRT__SW_INEXACT 0x00000001 /* inexact (precision) */
|
||||
#define MSVCRT__SW_UNDERFLOW 0x00000002 /* underflow */
|
||||
#define MSVCRT__SW_OVERFLOW 0x00000004 /* overflow */
|
||||
#define MSVCRT__SW_ZERODIVIDE 0x00000008 /* zero divide */
|
||||
#define MSVCRT__SW_INVALID 0x00000010 /* invalid */
|
||||
|
||||
#define MSVCRT__SW_UNEMULATED 0x00000040 /* unemulated instruction */
|
||||
#define MSVCRT__SW_SQRTNEG 0x00000080 /* square root of a neg number */
|
||||
#define MSVCRT__SW_STACKOVERFLOW 0x00000200 /* FP stack overflow */
|
||||
#define MSVCRT__SW_STACKUNDERFLOW 0x00000400 /* FP stack underflow */
|
||||
|
||||
#define MSVCRT__SW_DENORMAL 0x00080000 /* denormal status bit */
|
||||
|
||||
/* fpclass constants */
|
||||
#define MSVCRT__FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */
|
||||
#define MSVCRT__FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */
|
||||
#define MSVCRT__FPCLASS_NINF 0x0004 /* Negative Infinity */
|
||||
#define MSVCRT__FPCLASS_NN 0x0008 /* Negative Normal */
|
||||
#define MSVCRT__FPCLASS_ND 0x0010 /* Negative Denormal */
|
||||
#define MSVCRT__FPCLASS_NZ 0x0020 /* Negative Zero */
|
||||
#define MSVCRT__FPCLASS_PZ 0x0040 /* Positive Zero */
|
||||
#define MSVCRT__FPCLASS_PD 0x0080 /* Positive Denormal */
|
||||
#define MSVCRT__FPCLASS_PN 0x0100 /* Positive Normal */
|
||||
#define MSVCRT__FPCLASS_PINF 0x0200 /* Positive Infinity */
|
||||
|
||||
#define MSVCRT__MCW_EM 0x0008001f
|
||||
#define MSVCRT__MCW_IC 0x00040000
|
||||
#define MSVCRT__MCW_RC 0x00000300
|
||||
#define MSVCRT__MCW_PC 0x00030000
|
||||
#define MSVCRT__MCW_DN 0x03000000
|
||||
|
||||
#define MSVCRT__EM_INVALID 0x00000010
|
||||
#define MSVCRT__EM_DENORMAL 0x00080000
|
||||
#define MSVCRT__EM_ZERODIVIDE 0x00000008
|
||||
#define MSVCRT__EM_OVERFLOW 0x00000004
|
||||
#define MSVCRT__EM_UNDERFLOW 0x00000002
|
||||
#define MSVCRT__EM_INEXACT 0x00000001
|
||||
#define MSVCRT__IC_AFFINE 0x00040000
|
||||
#define MSVCRT__IC_PROJECTIVE 0x00000000
|
||||
#define MSVCRT__RC_CHOP 0x00000300
|
||||
#define MSVCRT__RC_UP 0x00000200
|
||||
#define MSVCRT__RC_DOWN 0x00000100
|
||||
#define MSVCRT__RC_NEAR 0x00000000
|
||||
#define MSVCRT__PC_24 0x00020000
|
||||
#define MSVCRT__PC_53 0x00010000
|
||||
#define MSVCRT__PC_64 0x00000000
|
||||
#define MSVCRT__DN_SAVE 0x00000000
|
||||
#define MSVCRT__DN_FLUSH 0x01000000
|
||||
#define MSVCRT__DN_FLUSH_OPERANDS_SAVE_RESULTS 0x02000000
|
||||
#define MSVCRT__DN_SAVE_OPERANDS_FLUSH_RESULTS 0x03000000
|
||||
#define MSVCRT__EM_AMBIGUOUS 0x80000000
|
||||
|
||||
#define MSVCRT_CLOCKS_PER_SEC 1000
|
||||
|
||||
/* signals */
|
||||
#define MSVCRT_SIGINT 2
|
||||
#define MSVCRT_SIGILL 4
|
||||
#define MSVCRT_SIGFPE 8
|
||||
#define MSVCRT_SIGSEGV 11
|
||||
#define MSVCRT_SIGTERM 15
|
||||
#define MSVCRT_SIGBREAK 21
|
||||
#define MSVCRT_SIGABRT 22
|
||||
#define MSVCRT_NSIG (MSVCRT_SIGABRT + 1)
|
||||
|
||||
typedef void (__cdecl *MSVCRT___sighandler_t)(int);
|
||||
|
||||
#define MSVCRT_SIG_DFL ((MSVCRT___sighandler_t)0)
|
||||
#define MSVCRT_SIG_IGN ((MSVCRT___sighandler_t)1)
|
||||
#define MSVCRT_SIG_ERR ((MSVCRT___sighandler_t)-1)
|
||||
|
||||
#define MSVCRT__FPE_INVALID 0x81
|
||||
#define MSVCRT__FPE_DENORMAL 0x82
|
||||
#define MSVCRT__FPE_ZERODIVIDE 0x83
|
||||
#define MSVCRT__FPE_OVERFLOW 0x84
|
||||
#define MSVCRT__FPE_UNDERFLOW 0x85
|
||||
#define MSVCRT__FPE_INEXACT 0x86
|
||||
#define MSVCRT__FPE_UNEMULATED 0x87
|
||||
#define MSVCRT__FPE_SQRTNEG 0x88
|
||||
#define MSVCRT__FPE_STACKOVERFLOW 0x8a
|
||||
#define MSVCRT__FPE_STACKUNDERFLOW 0x8b
|
||||
#define MSVCRT__FPE_EXPLICITGEN 0x8c
|
||||
|
||||
#define _MS 0x01
|
||||
#define _MP 0x02
|
||||
#define _M1 0x04
|
||||
#define _M2 0x08
|
||||
|
||||
#define _SBUP 0x10
|
||||
#define _SBLOW 0x20
|
||||
|
||||
#define _MBC_SINGLE 0
|
||||
#define _MBC_LEAD 1
|
||||
#define _MBC_TRAIL 2
|
||||
#define _MBC_ILLEGAL -1
|
||||
|
||||
#define _MB_CP_SBCS 0
|
||||
#define _MB_CP_OEM -2
|
||||
#define _MB_CP_ANSI -3
|
||||
#define _MB_CP_LOCALE -4
|
||||
|
||||
#define MSVCRT__TRUNCATE ((MSVCRT_size_t)-1)
|
||||
|
||||
#define _MAX__TIME64_T (((MSVCRT___time64_t)0x00000007 << 32) | 0x93406FFF)
|
||||
|
||||
/* _set_abort_behavior codes */
|
||||
#define MSVCRT__WRITE_ABORT_MSG 1
|
||||
#define MSVCRT__CALL_REPORTFAULT 2
|
||||
|
||||
/* _get_output_format return code */
|
||||
#define MSVCRT__TWO_DIGIT_EXPONENT 0x1
|
||||
|
||||
void __cdecl MSVCRT_free(void*);
|
||||
void* __cdecl MSVCRT_malloc(MSVCRT_size_t);
|
||||
void* __cdecl MSVCRT_calloc(MSVCRT_size_t,MSVCRT_size_t);
|
||||
void* __cdecl MSVCRT_realloc(void*,MSVCRT_size_t);
|
||||
|
||||
int __cdecl MSVCRT_iswalpha(MSVCRT_wint_t);
|
||||
int __cdecl MSVCRT_iswspace(MSVCRT_wint_t);
|
||||
int __cdecl MSVCRT_iswdigit(MSVCRT_wint_t);
|
||||
int __cdecl MSVCRT_isleadbyte(int);
|
||||
int __cdecl MSVCRT__isleadbyte_l(int, MSVCRT__locale_t);
|
||||
|
||||
void __cdecl MSVCRT__lock_file(MSVCRT_FILE*);
|
||||
void __cdecl MSVCRT__unlock_file(MSVCRT_FILE*);
|
||||
int __cdecl MSVCRT_fgetc(MSVCRT_FILE*);
|
||||
int __cdecl MSVCRT_ungetc(int,MSVCRT_FILE*);
|
||||
MSVCRT_wint_t __cdecl MSVCRT_fgetwc(MSVCRT_FILE*);
|
||||
MSVCRT_wint_t __cdecl MSVCRT_ungetwc(MSVCRT_wint_t,MSVCRT_FILE*);
|
||||
void __cdecl MSVCRT__exit(int);
|
||||
void __cdecl MSVCRT_abort(void);
|
||||
MSVCRT_ulong* __cdecl MSVCRT___doserrno(void);
|
||||
int* __cdecl MSVCRT__errno(void);
|
||||
char* __cdecl MSVCRT_getenv(const char*);
|
||||
int __cdecl MSVCRT_fclose(MSVCRT_FILE*);
|
||||
void __cdecl MSVCRT_terminate(void);
|
||||
MSVCRT_FILE* __cdecl MSVCRT__iob_func(void);
|
||||
MSVCRT_clock_t __cdecl MSVCRT_clock(void);
|
||||
MSVCRT___time32_t __cdecl MSVCRT__time32(MSVCRT___time32_t*);
|
||||
MSVCRT___time64_t __cdecl MSVCRT__time64(MSVCRT___time64_t*);
|
||||
MSVCRT_FILE* __cdecl MSVCRT__fdopen(int, const char *);
|
||||
MSVCRT_FILE* __cdecl MSVCRT__wfdopen(int, const MSVCRT_wchar_t *);
|
||||
int __cdecl MSVCRT_vsnprintf(char *str, MSVCRT_size_t len, const char *format, __ms_va_list valist);
|
||||
int __cdecl MSVCRT_vsnwprintf(MSVCRT_wchar_t *str, MSVCRT_size_t len,
|
||||
const MSVCRT_wchar_t *format, __ms_va_list valist );
|
||||
int __cdecl MSVCRT__snwprintf(MSVCRT_wchar_t*, unsigned int, const MSVCRT_wchar_t*, ...);
|
||||
int __cdecl MSVCRT_sprintf(char*,const char*,...);
|
||||
int __cdecl MSVCRT__scprintf(const char*,...);
|
||||
int __cdecl MSVCRT_raise(int sig);
|
||||
|
||||
#define MSVCRT__ENABLE_PER_THREAD_LOCALE 1
|
||||
#define MSVCRT__DISABLE_PER_THREAD_LOCALE 2
|
||||
|
||||
extern MSVCRT__locale_t MSVCRT_locale;
|
||||
MSVCRT_pthreadlocinfo get_locinfo(void);
|
||||
MSVCRT_pthreadmbcinfo get_mbcinfo(void);
|
||||
void __cdecl MSVCRT__free_locale(MSVCRT__locale_t);
|
||||
void free_locinfo(MSVCRT_pthreadlocinfo);
|
||||
void free_mbcinfo(MSVCRT_pthreadmbcinfo);
|
||||
int _setmbcp_l(int, LCID, MSVCRT_pthreadmbcinfo);
|
||||
|
||||
#ifndef __WINE_MSVCRT_TEST
|
||||
int __cdecl MSVCRT__write(int,const void*,unsigned int);
|
||||
int __cdecl _getch(void);
|
||||
int __cdecl _ismbblead(unsigned int);
|
||||
int __cdecl _ismbstrail(const unsigned char* start, const unsigned char* str);
|
||||
MSVCRT_size_t __cdecl MSVCRT_mbstowcs(MSVCRT_wchar_t*,const char*,MSVCRT_size_t);
|
||||
MSVCRT_intptr_t __cdecl MSVCRT__spawnve(int,const char*,const char* const *,const char* const *);
|
||||
MSVCRT_intptr_t __cdecl MSVRT__spawnvpe(int,const char*,const char* const *,const char* const *);
|
||||
MSVCRT_intptr_t __cdecl MSVCRT__wspawnve(int,const MSVCRT_wchar_t*,const MSVCRT_wchar_t* const *,const MSVCRT_wchar_t* const *);
|
||||
MSVCRT_intptr_t __cdecl MSVCRT__wspawnvpe(int,const MSVCRT_wchar_t*,const MSVCRT_wchar_t* const *,const MSVCRT_wchar_t* const *);
|
||||
void __cdecl MSVCRT__searchenv(const char*,const char*,char*);
|
||||
int __cdecl MSVCRT__getdrive(void);
|
||||
char* __cdecl MSVCRT__strdup(const char*);
|
||||
char* __cdecl MSVCRT__strnset(char*,int,MSVCRT_size_t);
|
||||
char* __cdecl _strset(char*,int);
|
||||
int __cdecl _ungetch(int);
|
||||
int __cdecl _cputs(const char*);
|
||||
int __cdecl _cprintf(const char*,...);
|
||||
int __cdecl _cwprintf(const MSVCRT_wchar_t*,...);
|
||||
char*** __cdecl MSVCRT___p__environ(void);
|
||||
int* __cdecl __p___mb_cur_max(void);
|
||||
unsigned int* __cdecl __p__fmode(void);
|
||||
MSVCRT_wchar_t* __cdecl MSVCRT__wcsdup(const MSVCRT_wchar_t*);
|
||||
MSVCRT_wchar_t*** __cdecl MSVCRT___p__wenviron(void);
|
||||
char* __cdecl MSVCRT__strdate(char* date);
|
||||
char* __cdecl MSVCRT__strtime(char* date);
|
||||
int __cdecl _setmbcp(int);
|
||||
int __cdecl MSVCRT__close(int);
|
||||
int __cdecl MSVCRT__dup(int);
|
||||
int __cdecl MSVCRT__dup2(int, int);
|
||||
int __cdecl MSVCRT__pipe(int *, unsigned int, int);
|
||||
MSVCRT_wchar_t* __cdecl MSVCRT__wgetenv(const MSVCRT_wchar_t*);
|
||||
void __cdecl MSVCRT__wsearchenv(const MSVCRT_wchar_t*, const MSVCRT_wchar_t*, MSVCRT_wchar_t*);
|
||||
MSVCRT_intptr_t __cdecl MSVCRT__spawnvpe(int, const char*, const char* const*, const char* const*);
|
||||
void __cdecl MSVCRT__invalid_parameter(const MSVCRT_wchar_t *expr, const MSVCRT_wchar_t *func,
|
||||
const MSVCRT_wchar_t *file, unsigned int line, MSVCRT_uintptr_t arg);
|
||||
int __cdecl MSVCRT__toupper_l(int,MSVCRT__locale_t);
|
||||
int __cdecl MSVCRT__tolower_l(int,MSVCRT__locale_t);
|
||||
|
||||
/* Maybe one day we'll enable the invalid parameter handlers with the full set of information (msvcrXXd)
|
||||
* #define MSVCRT_INVALID_PMT(x) MSVCRT_call_invalid_parameter_handler(x, __FUNCTION__, __FILE__, __LINE__, 0)
|
||||
* #define MSVCRT_CHECK_PMT(x) ((x) ? TRUE : MSVCRT_INVALID_PMT(#x),FALSE)
|
||||
* Until this is done, just keep the same semantics for CHECK_PMT(), but without generating / sending
|
||||
* any information
|
||||
* NB : MSVCRT_call_invalid_parameter_handler is a wrapper around MSVCRT__invalid_parameter in order
|
||||
* to do the Ansi to Unicode transformation
|
||||
*/
|
||||
#define MSVCRT_INVALID_PMT(x) MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0)
|
||||
#define MSVCRT_CHECK_PMT(x) ((x) || (MSVCRT_INVALID_PMT(0),FALSE))
|
||||
#endif
|
||||
|
||||
#define MSVCRT__ARGMAX 100
|
||||
typedef int (*puts_clbk_a)(void*, int, const char*);
|
||||
typedef int (*puts_clbk_w)(void*, int, const MSVCRT_wchar_t*);
|
||||
typedef union _printf_arg
|
||||
{
|
||||
void *get_ptr;
|
||||
int get_int;
|
||||
LONGLONG get_longlong;
|
||||
double get_double;
|
||||
} printf_arg;
|
||||
typedef printf_arg (*args_clbk)(void*, int, int, __ms_va_list*);
|
||||
int pf_printf_a(puts_clbk_a, void*, const char*, MSVCRT__locale_t,
|
||||
BOOL, BOOL, args_clbk, void*, __ms_va_list*);
|
||||
int pf_printf_w(puts_clbk_w, void*, const MSVCRT_wchar_t*, MSVCRT__locale_t,
|
||||
BOOL, BOOL, args_clbk, void*, __ms_va_list*);
|
||||
printf_arg arg_clbk_valist(void*, int, int, __ms_va_list*);
|
||||
|
||||
#define MSVCRT__OVERFLOW 3
|
||||
#define MSVCRT__UNDERFLOW 4
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float f;
|
||||
} MSVCRT__CRT_FLOAT;
|
||||
|
||||
#endif /* __WINE_MSVCRT_H */
|
|
@ -26,6 +26,7 @@
|
|||
#define _CRT_NON_CONFORMING_SWPRINTFS
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
|
@ -38,6 +39,22 @@ static int (__cdecl *p__vscwprintf)(const wchar_t *format, __ms_va_list valist);
|
|||
static int (__cdecl *p__vsnwprintf_s)(wchar_t *str, size_t sizeOfBuffer,
|
||||
size_t count, const wchar_t *format,
|
||||
__ms_va_list valist);
|
||||
static int (__cdecl *p__ecvt_s)(char *buffer, size_t length, double number,
|
||||
int ndigits, int *decpt, int *sign);
|
||||
static int (__cdecl *p__fcvt_s)(char *buffer, size_t length, double number,
|
||||
int ndigits, int *decpt, int *sign);
|
||||
static unsigned int (__cdecl *p__get_output_format)(void);
|
||||
static int (__cdecl *p__vsprintf_p)(char*, size_t, const char*, __ms_va_list);
|
||||
static int (__cdecl *p_vswprintf)(wchar_t *str, const wchar_t *format, __ms_va_list valist);
|
||||
static int (__cdecl *p__vswprintf)(wchar_t *str, const wchar_t *format, __ms_va_list valist);
|
||||
static int (__cdecl *p__vswprintf_l)(wchar_t *str, const wchar_t *format,
|
||||
void *locale, __ms_va_list valist);
|
||||
static int (__cdecl *p__vswprintf_c)(wchar_t *str, size_t size, const wchar_t *format,
|
||||
__ms_va_list valist);
|
||||
static int (__cdecl *p__vswprintf_c_l)(wchar_t *str, size_t size, const wchar_t *format,
|
||||
void *locale, __ms_va_list valist);
|
||||
static int (__cdecl *p__vswprintf_p_l)(wchar_t *str, size_t size, const wchar_t *format,
|
||||
void *locale, __ms_va_list valist);
|
||||
|
||||
static void init( void )
|
||||
{
|
||||
|
@ -46,6 +63,16 @@ static void init( void )
|
|||
p__vscprintf = (void *)GetProcAddress(hmod, "_vscprintf");
|
||||
p__vscwprintf = (void *)GetProcAddress(hmod, "_vscwprintf");
|
||||
p__vsnwprintf_s = (void *)GetProcAddress(hmod, "_vsnwprintf_s");
|
||||
p__ecvt_s = (void *)GetProcAddress(hmod, "_ecvt_s");
|
||||
p__fcvt_s = (void *)GetProcAddress(hmod, "_fcvt_s");
|
||||
p__get_output_format = (void *)GetProcAddress(hmod, "_get_output_format");
|
||||
p__vsprintf_p = (void*)GetProcAddress(hmod, "_vsprintf_p");
|
||||
p_vswprintf = (void*)GetProcAddress(hmod, "vswprintf");
|
||||
p__vswprintf = (void*)GetProcAddress(hmod, "_vswprintf");
|
||||
p__vswprintf_l = (void*)GetProcAddress(hmod, "_vswprintf_l");
|
||||
p__vswprintf_c = (void*)GetProcAddress(hmod, "_vswprintf_c");
|
||||
p__vswprintf_c_l = (void*)GetProcAddress(hmod, "_vswprintf_c_l");
|
||||
p__vswprintf_p_l = (void*)GetProcAddress(hmod, "_vswprintf_p_l");
|
||||
}
|
||||
|
||||
static void test_sprintf( void )
|
||||
|
@ -616,6 +643,41 @@ static void test_snprintf (void)
|
|||
};
|
||||
}
|
||||
|
||||
static void test_fprintf(void)
|
||||
{
|
||||
static char file_name[] = "fprintf.tst";
|
||||
FILE *fp = fopen(file_name, "wb");
|
||||
char buf[1024];
|
||||
int ret;
|
||||
|
||||
ret = fprintf(fp, "simple test\n");
|
||||
ok(ret == 12, "ret = %d\n", ret);
|
||||
ret = ftell(fp);
|
||||
ok(ret == 12, "ftell returned %d\n", ret);
|
||||
|
||||
ret = fprintf(fp, "contains%cnull\n", '\0');
|
||||
ok(ret == 14, "ret = %d\n", ret);
|
||||
ret = ftell(fp);
|
||||
ok(ret == 26, "ftell returned %d\n", ret);
|
||||
|
||||
fclose(fp);
|
||||
|
||||
fp = fopen(file_name, "rb");
|
||||
ret = fscanf(fp, "%[^\n] ", buf);
|
||||
ok(ret == 1, "ret = %d\n", ret);
|
||||
ret = ftell(fp);
|
||||
ok(ret == 12, "ftell returned %d\n", ret);
|
||||
ok(!strcmp(buf, "simple test"), "buf = %s\n", buf);
|
||||
|
||||
fgets(buf, sizeof(buf), fp);
|
||||
ret = ftell(fp);
|
||||
ok(ret == 26, "ret = %d\n", ret);
|
||||
ok(!memcmp(buf, "contains\0null\n", 14), "buf = %s\n", buf);
|
||||
|
||||
fclose(fp);
|
||||
unlink(file_name);
|
||||
}
|
||||
|
||||
static void test_fcvt(void)
|
||||
{
|
||||
char *str;
|
||||
|
@ -713,6 +775,8 @@ static void test_fcvt(void)
|
|||
ok( 0 == sign, "sign wrong\n");
|
||||
}
|
||||
|
||||
/* Don't test nrdigits < 0, msvcrt on Win9x and NT4 will corrupt memory by
|
||||
* writing outside allocated memory */
|
||||
static struct {
|
||||
double value;
|
||||
int nrdigits;
|
||||
|
@ -725,7 +789,6 @@ static struct {
|
|||
{ 45.0, 2, "45", "4500", 2, 2, 0 },
|
||||
/* Numbers less than 1.0 with different precisions */
|
||||
{ 0.0001, 1, "1", "", -3, -3, 0 },
|
||||
{ 0.0001, -10, "", "", -3, -3, 0 },
|
||||
{ 0.0001, 10,"1000000000", "1000000", -3, -3, 0 },
|
||||
/* Basic sign test */
|
||||
{ -111.0001, 5, "11100", "11100010", 3, 3, 1 },
|
||||
|
@ -753,7 +816,7 @@ static struct {
|
|||
{ 0.4, 0, "", "", 0, 0, 0 },
|
||||
{ 0.49, 0, "", "", 0, 0, 0 },
|
||||
{ 0.51, 0, "", "1", 1, 1, 0 },
|
||||
/* ask ridiculous amunt of precision, ruin formatting this table */
|
||||
/* ask for ridiculous precision, ruin formatting this table */
|
||||
{ 1.0, 30, "100000000000000000000000000000",
|
||||
"1000000000000000000000000000000", 1, 1, 0},
|
||||
{ 123456789012345678901.0, 30, "123456789012345680000000000000",
|
||||
|
@ -765,7 +828,8 @@ static struct {
|
|||
static void test_xcvt(void)
|
||||
{
|
||||
char *str;
|
||||
int i, decpt, sign;
|
||||
int i, decpt, sign, err;
|
||||
|
||||
for( i = 0; strcmp( test_cvt_testcases[i].expstr_e, "END"); i++){
|
||||
decpt = sign = 100;
|
||||
str = _ecvt( test_cvt_testcases[i].value,
|
||||
|
@ -778,6 +842,9 @@ static void test_xcvt(void)
|
|||
ok( decpt == test_cvt_testcases[i].expdecpt_e,
|
||||
"_ecvt() decimal point wrong, got %d expected %d\n", decpt,
|
||||
test_cvt_testcases[i].expdecpt_e);
|
||||
ok( sign == test_cvt_testcases[i].expsign,
|
||||
"_ecvt() sign wrong, got %d expected %d\n", sign,
|
||||
test_cvt_testcases[i].expsign);
|
||||
}
|
||||
for( i = 0; strcmp( test_cvt_testcases[i].expstr_e, "END"); i++){
|
||||
decpt = sign = 100;
|
||||
|
@ -792,9 +859,76 @@ static void test_xcvt(void)
|
|||
"_fcvt() decimal point wrong, got %d expected %d\n", decpt,
|
||||
test_cvt_testcases[i].expdecpt_f);
|
||||
ok( sign == test_cvt_testcases[i].expsign,
|
||||
"_ecvt() sign wrong, got %d expected %d\n", sign,
|
||||
"_fcvt() sign wrong, got %d expected %d\n", sign,
|
||||
test_cvt_testcases[i].expsign);
|
||||
}
|
||||
|
||||
if (p__ecvt_s)
|
||||
{
|
||||
str = malloc(1024);
|
||||
for( i = 0; strcmp( test_cvt_testcases[i].expstr_e, "END"); i++){
|
||||
decpt = sign = 100;
|
||||
err = p__ecvt_s(str, 1024, test_cvt_testcases[i].value, test_cvt_testcases[i].nrdigits, &decpt, &sign);
|
||||
ok(err == 0, "_ecvt_s() failed with error code %d\n", err);
|
||||
ok( 0 == strncmp( str, test_cvt_testcases[i].expstr_e, 15),
|
||||
"_ecvt_s() bad return, got \n'%s' expected \n'%s'\n", str,
|
||||
test_cvt_testcases[i].expstr_e);
|
||||
ok( decpt == test_cvt_testcases[i].expdecpt_e,
|
||||
"_ecvt_s() decimal point wrong, got %d expected %d\n", decpt,
|
||||
test_cvt_testcases[i].expdecpt_e);
|
||||
ok( sign == test_cvt_testcases[i].expsign,
|
||||
"_ecvt_s() sign wrong, got %d expected %d\n", sign,
|
||||
test_cvt_testcases[i].expsign);
|
||||
}
|
||||
free(str);
|
||||
}
|
||||
else
|
||||
win_skip("_ecvt_s not available\n");
|
||||
|
||||
if (p__fcvt_s)
|
||||
{
|
||||
int i;
|
||||
|
||||
str = malloc(1024);
|
||||
|
||||
/* invalid arguments */
|
||||
err = p__fcvt_s(NULL, 0, 0.0, 0, &i, &i);
|
||||
ok(err == EINVAL, "got %d, expected EINVAL\n", err);
|
||||
|
||||
err = p__fcvt_s(str, 0, 0.0, 0, &i, &i);
|
||||
ok(err == EINVAL, "got %d, expected EINVAL\n", err);
|
||||
|
||||
str[0] = ' ';
|
||||
str[1] = 0;
|
||||
err = p__fcvt_s(str, -1, 0.0, 0, &i, &i);
|
||||
ok(err == 0, "got %d, expected 0\n", err);
|
||||
ok(str[0] == 0, "got %c, expected 0\n", str[0]);
|
||||
ok(str[1] == 0, "got %c, expected 0\n", str[1]);
|
||||
|
||||
err = p__fcvt_s(str, 1, 0.0, 0, NULL, &i);
|
||||
ok(err == EINVAL, "got %d, expected EINVAL\n", err);
|
||||
|
||||
err = p__fcvt_s(str, 1, 0.0, 0, &i, NULL);
|
||||
ok(err == EINVAL, "got %d, expected EINVAL\n", err);
|
||||
|
||||
for( i = 0; strcmp( test_cvt_testcases[i].expstr_e, "END"); i++){
|
||||
decpt = sign = 100;
|
||||
err = p__fcvt_s(str, 1024, test_cvt_testcases[i].value, test_cvt_testcases[i].nrdigits, &decpt, &sign);
|
||||
ok(err == 0, "_fcvt_s() failed with error code %d\n", err);
|
||||
ok( 0 == strncmp( str, test_cvt_testcases[i].expstr_f, 15),
|
||||
"_fcvt_s() bad return, got '%s' expected '%s'. test %d\n", str,
|
||||
test_cvt_testcases[i].expstr_f, i);
|
||||
ok( decpt == test_cvt_testcases[i].expdecpt_f,
|
||||
"_fcvt_s() decimal point wrong, got %d expected %d\n", decpt,
|
||||
test_cvt_testcases[i].expdecpt_f);
|
||||
ok( sign == test_cvt_testcases[i].expsign,
|
||||
"_fcvt_s() sign wrong, got %d expected %d\n", sign,
|
||||
test_cvt_testcases[i].expsign);
|
||||
}
|
||||
free(str);
|
||||
}
|
||||
else
|
||||
win_skip("_fcvt_s not available\n");
|
||||
}
|
||||
|
||||
static int __cdecl _vsnwprintf_wrapper(wchar_t *str, size_t len, const wchar_t *format, ...)
|
||||
|
@ -825,6 +959,112 @@ static void test_vsnwprintf(void)
|
|||
ok( !strcmp(buf, "onetwothree"), "got %s expected 'onetwothree'\n", buf );
|
||||
}
|
||||
|
||||
static int __cdecl vswprintf_wrapper(wchar_t *str, const wchar_t *format, ...)
|
||||
{
|
||||
int ret;
|
||||
__ms_va_list valist;
|
||||
__ms_va_start(valist, format);
|
||||
ret = p_vswprintf(str, format, valist);
|
||||
__ms_va_end(valist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __cdecl _vswprintf_wrapper(wchar_t *str, const wchar_t *format, ...)
|
||||
{
|
||||
int ret;
|
||||
__ms_va_list valist;
|
||||
__ms_va_start(valist, format);
|
||||
ret = p__vswprintf(str, format, valist);
|
||||
__ms_va_end(valist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __cdecl _vswprintf_l_wrapper(wchar_t *str, const wchar_t *format, void *locale, ...)
|
||||
{
|
||||
int ret;
|
||||
__ms_va_list valist;
|
||||
__ms_va_start(valist, locale);
|
||||
ret = p__vswprintf_l(str, format, locale, valist);
|
||||
__ms_va_end(valist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __cdecl _vswprintf_c_wrapper(wchar_t *str, size_t size, const wchar_t *format, ...)
|
||||
{
|
||||
int ret;
|
||||
__ms_va_list valist;
|
||||
__ms_va_start(valist, format);
|
||||
ret = p__vswprintf_c(str, size, format, valist);
|
||||
__ms_va_end(valist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __cdecl _vswprintf_c_l_wrapper(wchar_t *str, size_t size, const wchar_t *format, void *locale, ...)
|
||||
{
|
||||
int ret;
|
||||
__ms_va_list valist;
|
||||
__ms_va_start(valist, locale);
|
||||
ret = p__vswprintf_c_l(str, size, format, locale, valist);
|
||||
__ms_va_end(valist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __cdecl _vswprintf_p_l_wrapper(wchar_t *str, size_t size, const wchar_t *format, void *locale, ...)
|
||||
{
|
||||
int ret;
|
||||
__ms_va_list valist;
|
||||
__ms_va_start(valist, locale);
|
||||
ret = p__vswprintf_p_l(str, size, format, locale, valist);
|
||||
__ms_va_end(valist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void test_vswprintf(void)
|
||||
{
|
||||
const wchar_t format[] = {'%','s',' ','%','d',0};
|
||||
const wchar_t number[] = {'n','u','m','b','e','r',0};
|
||||
const wchar_t out[] = {'n','u','m','b','e','r',' ','1','2','3',0};
|
||||
wchar_t buf[20];
|
||||
|
||||
int ret;
|
||||
|
||||
if (!p_vswprintf || !p__vswprintf || !p__vswprintf_l ||!p__vswprintf_c
|
||||
|| !p__vswprintf_c_l || !p__vswprintf_p_l)
|
||||
{
|
||||
win_skip("_vswprintf or vswprintf not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = vswprintf_wrapper(buf, format, number, 123);
|
||||
ok(ret == 10, "got %d, expected 10\n", ret);
|
||||
ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf));
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
ret = _vswprintf_wrapper(buf, format, number, 123);
|
||||
ok(ret == 10, "got %d, expected 10\n", ret);
|
||||
ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf));
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
ret = _vswprintf_l_wrapper(buf, format, NULL, number, 123);
|
||||
ok(ret == 10, "got %d, expected 10\n", ret);
|
||||
ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf));
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
ret = _vswprintf_c_wrapper(buf, 20, format, number, 123);
|
||||
ok(ret == 10, "got %d, expected 10\n", ret);
|
||||
ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf));
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
ret = _vswprintf_c_l_wrapper(buf, 20, format, NULL, number, 123);
|
||||
ok(ret == 10, "got %d, expected 10\n", ret);
|
||||
ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf));
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
ret = _vswprintf_p_l_wrapper(buf, 20, format, NULL, number, 123);
|
||||
ok(ret == 10, "got %d, expected 10\n", ret);
|
||||
ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf));
|
||||
}
|
||||
|
||||
static int __cdecl _vscprintf_wrapper(const char *format, ...)
|
||||
{
|
||||
int ret;
|
||||
|
@ -934,6 +1174,61 @@ static void test_vsnwprintf_s(void)
|
|||
ok( !wcscmp(out1, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer));
|
||||
}
|
||||
|
||||
static int __cdecl _vsprintf_p_wrapper(char *str, size_t sizeOfBuffer,
|
||||
const char *format, ...)
|
||||
{
|
||||
int ret;
|
||||
__ms_va_list valist;
|
||||
__ms_va_start(valist, format);
|
||||
ret = p__vsprintf_p(str, sizeOfBuffer, format, valist);
|
||||
__ms_va_end(valist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void test_vsprintf_p(void)
|
||||
{
|
||||
char buf[1024];
|
||||
int ret;
|
||||
|
||||
if(!p__vsprintf_p) {
|
||||
win_skip("vsprintf_p not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = _vsprintf_p_wrapper(buf, sizeof(buf), "%s %d", "test", 1234);
|
||||
ok(ret == 9, "ret = %d\n", ret);
|
||||
ok(!memcmp(buf, "test 1234", 10), "buf = %s\n", buf);
|
||||
|
||||
ret = _vsprintf_p_wrapper(buf, sizeof(buf), "%1$d", 1234, "additional param");
|
||||
ok(ret == 4, "ret = %d\n", ret);
|
||||
ok(!memcmp(buf, "1234", 5), "buf = %s\n", buf);
|
||||
|
||||
ret = _vsprintf_p_wrapper(buf, sizeof(buf), "%2$s %1$d", 1234, "test");
|
||||
ok(ret == 9, "ret = %d\n", ret);
|
||||
ok(!memcmp(buf, "test 1234", 10), "buf = %s\n", buf);
|
||||
|
||||
ret = _vsprintf_p_wrapper(buf, sizeof(buf), "%2$*3$s %2$.*1$s", 2, "test", 3);
|
||||
ok(ret == 7, "ret = %d\n", ret);
|
||||
ok(!memcmp(buf, "test te", 8), "buf = %s\n", buf);
|
||||
|
||||
/* Following test invokes invalid parameter handler */
|
||||
/* ret = _vsprintf_p_wrapper(buf, sizeof(buf), "%d %1$d", 1234); */
|
||||
}
|
||||
|
||||
static void test__get_output_format(void)
|
||||
{
|
||||
unsigned int ret;
|
||||
|
||||
if (!p__get_output_format)
|
||||
{
|
||||
win_skip("_get_output_format not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = p__get_output_format();
|
||||
ok(ret == 0, "got %d\n", ret);
|
||||
}
|
||||
|
||||
START_TEST(printf)
|
||||
{
|
||||
init();
|
||||
|
@ -941,10 +1236,14 @@ START_TEST(printf)
|
|||
test_sprintf();
|
||||
test_swprintf();
|
||||
test_snprintf();
|
||||
test_fprintf();
|
||||
test_fcvt();
|
||||
test_xcvt();
|
||||
test_vsnwprintf();
|
||||
test_vscprintf();
|
||||
test_vscwprintf();
|
||||
test_vswprintf();
|
||||
test_vsnwprintf_s();
|
||||
test_vsprintf_p();
|
||||
test__get_output_format();
|
||||
}
|
||||
|
|
|
@ -93,11 +93,14 @@ static void test_sscanf( void )
|
|||
|
||||
/* Check float */
|
||||
ret = sprintf(buffer,"%f %f",res1, res2);
|
||||
ok( ret == 20, "expected 20, got %u\n", ret);
|
||||
ret = sscanf(buffer,"%f%f",&res11, &res12);
|
||||
ok( ret == 2, "expected 2, got %u\n", ret);
|
||||
ok( (res11 == res1) && (res12 == res2), "Error reading floats\n");
|
||||
|
||||
/* check strings */
|
||||
ret = sprintf(buffer," %s", pname);
|
||||
ok( ret == 26, "expected 26, got %u\n", ret);
|
||||
ret = sscanf(buffer,"%*c%[^\n]",buffer1);
|
||||
ok( ret == 1, "Error with format \"%s\"\n","%*c%[^\n]");
|
||||
ok( strncmp(pname,buffer1,strlen(buffer1)) == 0, "Error with \"%s\" \"%s\"\n",pname, buffer1);
|
||||
|
@ -112,6 +115,7 @@ static void test_sscanf( void )
|
|||
|
||||
/* check digits */
|
||||
ret = sprintf(buffer,"%d:%d:%d",hour,min,sec);
|
||||
ok( ret == 8, "expected 8, got %u\n", ret);
|
||||
ret = sscanf(buffer,"%d%n",&number,&number_so_far);
|
||||
ok(ret == 1 , "problem with format arg \"%%d%%n\"\n");
|
||||
ok(number == hour,"Read wrong arg %d instead of %d\n",number, hour);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -25,6 +25,9 @@
|
|||
|
||||
#include <stdlib.h> /*setenv*/
|
||||
#include <stdio.h> /*printf*/
|
||||
#include <errno.h>
|
||||
|
||||
#define _MAX__TIME64_T (((__time64_t)0x00000007 << 32) | 0x93406FFF)
|
||||
|
||||
#define SECSPERDAY 86400
|
||||
#define SECSPERHOUR 3600
|
||||
|
@ -32,6 +35,31 @@
|
|||
#define MINSPERHOUR 60
|
||||
#define HOURSPERDAY 24
|
||||
|
||||
static __time32_t (__cdecl *p_mkgmtime32)(struct tm*);
|
||||
static struct tm* (__cdecl *p_gmtime32)(__time32_t*);
|
||||
static errno_t (__cdecl *p_gmtime32_s)(struct tm*, __time32_t*);
|
||||
static errno_t (__cdecl *p_strtime_s)(char*,size_t);
|
||||
static errno_t (__cdecl *p_strdate_s)(char*,size_t);
|
||||
static errno_t (__cdecl *p_localtime32_s)(struct tm*, __time32_t*);
|
||||
static errno_t (__cdecl *p_localtime64_s)(struct tm*, __time64_t*);
|
||||
static int* (__cdecl *p__daylight)(void);
|
||||
static int* (__cdecl *p___p__daylight)(void);
|
||||
|
||||
static void init(void)
|
||||
{
|
||||
HMODULE hmod = GetModuleHandleA("msvcrt.dll");
|
||||
|
||||
p_gmtime32 = (void*)GetProcAddress(hmod, "_gmtime32");
|
||||
p_gmtime32_s = (void*)GetProcAddress(hmod, "_gmtime32_s");
|
||||
p_mkgmtime32 = (void*)GetProcAddress(hmod, "_mkgmtime32");
|
||||
p_strtime_s = (void*)GetProcAddress(hmod, "_strtime_s");
|
||||
p_strdate_s = (void*)GetProcAddress(hmod, "_strdate_s");
|
||||
p_localtime32_s = (void*)GetProcAddress(hmod, "_localtime32_s");
|
||||
p_localtime64_s = (void*)GetProcAddress(hmod, "_localtime64_s");
|
||||
p__daylight = (void*)GetProcAddress(hmod, "__daylight");
|
||||
p___p__daylight = (void*)GetProcAddress(hmod, "__p__daylight");
|
||||
}
|
||||
|
||||
static int get_test_year(time_t *start)
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
|
@ -54,19 +82,22 @@ static void test_ctime(void)
|
|||
}
|
||||
static void test_gmtime(void)
|
||||
{
|
||||
static __time32_t (__cdecl *p_mkgmtime32)(struct tm*);
|
||||
static struct tm* (__cdecl *p_gmtime32)(__time32_t*);
|
||||
|
||||
HMODULE hmod = GetModuleHandleA("msvcrt.dll");
|
||||
__time32_t valid, gmt;
|
||||
struct tm* gmt_tm;
|
||||
struct tm* gmt_tm, gmt_tm_s;
|
||||
errno_t err;
|
||||
|
||||
p_gmtime32 = (void*)GetProcAddress(hmod, "_gmtime32");
|
||||
if(!p_gmtime32) {
|
||||
win_skip("Skipping _gmtime32 tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
gmt_tm = p_gmtime32(NULL);
|
||||
ok(gmt_tm == NULL, "gmt_tm != NULL\n");
|
||||
|
||||
gmt = -1;
|
||||
gmt_tm = p_gmtime32(&gmt);
|
||||
ok(gmt_tm == NULL, "gmt_tm != NULL\n");
|
||||
|
||||
gmt = valid = 0;
|
||||
gmt_tm = p_gmtime32(&gmt);
|
||||
if(!gmt_tm) {
|
||||
|
@ -81,7 +112,6 @@ static void test_gmtime(void)
|
|||
gmt_tm->tm_year, gmt_tm->tm_mon, gmt_tm->tm_yday, gmt_tm->tm_mday, gmt_tm->tm_wday,
|
||||
gmt_tm->tm_hour, gmt_tm->tm_min, gmt_tm->tm_sec, gmt_tm->tm_isdst);
|
||||
|
||||
p_mkgmtime32 = (void*)GetProcAddress(hmod, "_mkgmtime32");
|
||||
if(!p_mkgmtime32) {
|
||||
win_skip("Skipping _mkgmtime32 tests\n");
|
||||
return;
|
||||
|
@ -123,6 +153,24 @@ static void test_gmtime(void)
|
|||
gmt_tm->tm_isdst = 1;
|
||||
gmt = p_mkgmtime32(gmt_tm);
|
||||
ok(gmt == valid, "gmt = %u\n", gmt);
|
||||
|
||||
if(!p_gmtime32_s) {
|
||||
win_skip("Skipping _gmtime32_s tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
gmt = 0;
|
||||
err = p_gmtime32_s(NULL, &gmt);
|
||||
ok(err == EINVAL, "err = %d\n", err);
|
||||
ok(errno == EINVAL, "errno = %d\n", errno);
|
||||
|
||||
errno = 0;
|
||||
gmt = -1;
|
||||
err = p_gmtime32_s(&gmt_tm_s, &gmt);
|
||||
ok(err == EINVAL, "err = %d\n", err);
|
||||
ok(errno == EINVAL, "errno = %d\n", errno);
|
||||
ok(gmt_tm_s.tm_year == -1, "tm_year = %d\n", gmt_tm_s.tm_year);
|
||||
}
|
||||
|
||||
static void test_mktime(void)
|
||||
|
@ -287,6 +335,7 @@ static void test_strdate(void)
|
|||
{
|
||||
char date[16], * result;
|
||||
int month, day, year, count, len;
|
||||
errno_t err;
|
||||
|
||||
result = _strdate(date);
|
||||
ok(result == date, "Wrong return value\n");
|
||||
|
@ -294,12 +343,34 @@ static void test_strdate(void)
|
|||
ok(len == 8, "Wrong length: returned %d, should be 8\n", len);
|
||||
count = sscanf(date, "%02d/%02d/%02d", &month, &day, &year);
|
||||
ok(count == 3, "Wrong format: count = %d, should be 3\n", count);
|
||||
|
||||
if(!p_strdate_s) {
|
||||
win_skip("Skipping _strdate_s tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
err = p_strdate_s(NULL, 1);
|
||||
ok(err == EINVAL, "err = %d\n", err);
|
||||
ok(errno == EINVAL, "errno = %d\n", errno);
|
||||
|
||||
date[0] = 'x';
|
||||
date[1] = 'x';
|
||||
err = p_strdate_s(date, 8);
|
||||
ok(err == ERANGE, "err = %d\n", err);
|
||||
ok(errno == ERANGE, "errno = %d\n", errno);
|
||||
ok(date[0] == '\0', "date[0] != '\\0'\n");
|
||||
ok(date[1] == 'x', "date[1] != 'x'\n");
|
||||
|
||||
err = p_strdate_s(date, 9);
|
||||
ok(err == 0, "err = %x\n", err);
|
||||
}
|
||||
|
||||
static void test_strtime(void)
|
||||
{
|
||||
char time[16], * result;
|
||||
int hour, minute, second, count, len;
|
||||
errno_t err;
|
||||
|
||||
result = _strtime(time);
|
||||
ok(result == time, "Wrong return value\n");
|
||||
|
@ -307,6 +378,29 @@ static void test_strtime(void)
|
|||
ok(len == 8, "Wrong length: returned %d, should be 8\n", len);
|
||||
count = sscanf(time, "%02d:%02d:%02d", &hour, &minute, &second);
|
||||
ok(count == 3, "Wrong format: count = %d, should be 3\n", count);
|
||||
|
||||
if(!p_strtime_s) {
|
||||
win_skip("Skipping _strtime_s tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
err = p_strtime_s(NULL, 0);
|
||||
ok(err == EINVAL, "err = %d\n", err);
|
||||
ok(errno == EINVAL, "errno = %d\n", errno);
|
||||
|
||||
err = p_strtime_s(NULL, 1);
|
||||
ok(err == EINVAL, "err = %d\n", err);
|
||||
ok(errno == EINVAL, "errno = %d\n", errno);
|
||||
|
||||
time[0] = 'x';
|
||||
err = p_strtime_s(time, 8);
|
||||
ok(err == ERANGE, "err = %d\n", err);
|
||||
ok(errno == ERANGE, "errno = %d\n", errno);
|
||||
ok(time[0] == '\0', "time[0] != '\\0'\n");
|
||||
|
||||
err = p_strtime_s(time, 9);
|
||||
ok(err == 0, "err = %x\n", err);
|
||||
}
|
||||
|
||||
static void test_wstrdate(void)
|
||||
|
@ -337,8 +431,147 @@ static void test_wstrtime(void)
|
|||
ok(count == 3, "Wrong format: count = %d, should be 3\n", count);
|
||||
}
|
||||
|
||||
static void test_localtime32_s(void)
|
||||
{
|
||||
struct tm tm;
|
||||
__time32_t time;
|
||||
errno_t err;
|
||||
|
||||
if (!p_localtime32_s)
|
||||
{
|
||||
win_skip("Skipping _localtime32_s tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
errno = EBADF;
|
||||
err = p_localtime32_s(NULL, NULL);
|
||||
ok(err == EINVAL, "Expected _localtime32_s to return EINVAL, got %d\n", err);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
errno = EBADF;
|
||||
time = 0x12345678;
|
||||
err = p_localtime32_s(NULL, &time);
|
||||
ok(err == EINVAL, "Expected _localtime32_s to return EINVAL, got %d\n", err);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
errno = EBADF;
|
||||
err = p_localtime32_s(&tm, NULL);
|
||||
ok(err == EINVAL, "Expected _localtime32_s to return EINVAL, got %d\n", err);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
ok(tm.tm_sec == -1 && tm.tm_min == -1 && tm.tm_hour == -1 &&
|
||||
tm.tm_mday == -1 && tm.tm_mon == -1 && tm.tm_year == -1 &&
|
||||
tm.tm_wday == -1 && tm.tm_yday == -1 && tm.tm_isdst == -1,
|
||||
"Expected tm structure members to be initialized to -1, got "
|
||||
"(%d, %d, %d, %d, %d, %d, %d, %d, %d)\n", tm.tm_sec, tm.tm_min,
|
||||
tm.tm_hour, tm.tm_mday, tm.tm_mon, tm.tm_year, tm.tm_wday, tm.tm_yday,
|
||||
tm.tm_isdst);
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
time = -1;
|
||||
errno = EBADF;
|
||||
err = p_localtime32_s(&tm, &time);
|
||||
ok(err == EINVAL, "Expected _localtime32_s to return EINVAL, got %d\n", err);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
ok(tm.tm_sec == -1 && tm.tm_min == -1 && tm.tm_hour == -1 &&
|
||||
tm.tm_mday == -1 && tm.tm_mon == -1 && tm.tm_year == -1 &&
|
||||
tm.tm_wday == -1 && tm.tm_yday == -1 && tm.tm_isdst == -1,
|
||||
"Expected tm structure members to be initialized to -1, got "
|
||||
"(%d, %d, %d, %d, %d, %d, %d, %d, %d)\n", tm.tm_sec, tm.tm_min,
|
||||
tm.tm_hour, tm.tm_mday, tm.tm_mon, tm.tm_year, tm.tm_wday, tm.tm_yday,
|
||||
tm.tm_isdst);
|
||||
}
|
||||
|
||||
static void test_localtime64_s(void)
|
||||
{
|
||||
struct tm tm;
|
||||
__time64_t time;
|
||||
errno_t err;
|
||||
|
||||
if (!p_localtime64_s)
|
||||
{
|
||||
win_skip("Skipping _localtime64_s tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
errno = EBADF;
|
||||
err = p_localtime64_s(NULL, NULL);
|
||||
ok(err == EINVAL, "Expected _localtime64_s to return EINVAL, got %d\n", err);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
errno = EBADF;
|
||||
time = 0xdeadbeef;
|
||||
err = p_localtime64_s(NULL, &time);
|
||||
ok(err == EINVAL, "Expected _localtime64_s to return EINVAL, got %d\n", err);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
errno = EBADF;
|
||||
err = p_localtime64_s(&tm, NULL);
|
||||
ok(err == EINVAL, "Expected _localtime64_s to return EINVAL, got %d\n", err);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
ok(tm.tm_sec == -1 && tm.tm_min == -1 && tm.tm_hour == -1 &&
|
||||
tm.tm_mday == -1 && tm.tm_mon == -1 && tm.tm_year == -1 &&
|
||||
tm.tm_wday == -1 && tm.tm_yday == -1 && tm.tm_isdst == -1,
|
||||
"Expected tm structure members to be initialized to -1, got "
|
||||
"(%d, %d, %d, %d, %d, %d, %d, %d, %d)\n", tm.tm_sec, tm.tm_min,
|
||||
tm.tm_hour, tm.tm_mday, tm.tm_mon, tm.tm_year, tm.tm_wday, tm.tm_yday,
|
||||
tm.tm_isdst);
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
time = -1;
|
||||
errno = EBADF;
|
||||
err = p_localtime64_s(&tm, &time);
|
||||
ok(err == EINVAL, "Expected _localtime64_s to return EINVAL, got %d\n", err);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
ok(tm.tm_sec == -1 && tm.tm_min == -1 && tm.tm_hour == -1 &&
|
||||
tm.tm_mday == -1 && tm.tm_mon == -1 && tm.tm_year == -1 &&
|
||||
tm.tm_wday == -1 && tm.tm_yday == -1 && tm.tm_isdst == -1,
|
||||
"Expected tm structure members to be initialized to -1, got "
|
||||
"(%d, %d, %d, %d, %d, %d, %d, %d, %d)\n", tm.tm_sec, tm.tm_min,
|
||||
tm.tm_hour, tm.tm_mday, tm.tm_mon, tm.tm_year, tm.tm_wday, tm.tm_yday,
|
||||
tm.tm_isdst);
|
||||
|
||||
memset(&tm, 0, sizeof(tm));
|
||||
time = _MAX__TIME64_T + 1;
|
||||
errno = EBADF;
|
||||
err = p_localtime64_s(&tm, &time);
|
||||
ok(err == EINVAL, "Expected _localtime64_s to return EINVAL, got %d\n", err);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
ok(tm.tm_sec == -1 && tm.tm_min == -1 && tm.tm_hour == -1 &&
|
||||
tm.tm_mday == -1 && tm.tm_mon == -1 && tm.tm_year == -1 &&
|
||||
tm.tm_wday == -1 && tm.tm_yday == -1 && tm.tm_isdst == -1,
|
||||
"Expected tm structure members to be initialized to -1, got "
|
||||
"(%d, %d, %d, %d, %d, %d, %d, %d, %d)\n", tm.tm_sec, tm.tm_min,
|
||||
tm.tm_hour, tm.tm_mday, tm.tm_mon, tm.tm_year, tm.tm_wday, tm.tm_yday,
|
||||
tm.tm_isdst);
|
||||
}
|
||||
|
||||
static void test_daylight(void)
|
||||
{
|
||||
int *ret1, *ret2;
|
||||
|
||||
if (!p__daylight)
|
||||
{
|
||||
win_skip("__daylight() not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!p___p__daylight)
|
||||
{
|
||||
win_skip("__p__daylight not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret1 = p__daylight();
|
||||
ret2 = p___p__daylight();
|
||||
ok(ret1 && ret1 == ret2, "got %p\n", ret1);
|
||||
}
|
||||
|
||||
START_TEST(time)
|
||||
{
|
||||
init();
|
||||
|
||||
test_ctime();
|
||||
test_gmtime();
|
||||
test_mktime();
|
||||
|
@ -347,4 +580,7 @@ START_TEST(time)
|
|||
test_strtime();
|
||||
test_wstrdate();
|
||||
test_wstrtime();
|
||||
test_localtime32_s();
|
||||
test_localtime64_s();
|
||||
test_daylight();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue