From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcr80/Makefile.in | 5 ++ dlls/msvcr80/tests/Makefile.in | 1 + dlls/msvcr80/tests/msvcr80.c | 146 ++++++++++++--------------------- 3 files changed, 59 insertions(+), 93 deletions(-)
diff --git a/dlls/msvcr80/Makefile.in b/dlls/msvcr80/Makefile.in index 1bbabee0dac..2a84383f79d 100644 --- a/dlls/msvcr80/Makefile.in +++ b/dlls/msvcr80/Makefile.in @@ -8,6 +8,11 @@ PARENTSRC = ../msvcrt SOURCES = \ console.c \ cpp.c \ + crt_gccmain.c \ + crt_main.c \ + crt_winmain.c \ + crt_wmain.c \ + crt_wwinmain.c \ ctype.c \ data.c \ dir.c \ diff --git a/dlls/msvcr80/tests/Makefile.in b/dlls/msvcr80/tests/Makefile.in index ecb59f84aa0..f1b5d3f0450 100644 --- a/dlls/msvcr80/tests/Makefile.in +++ b/dlls/msvcr80/tests/Makefile.in @@ -1,4 +1,5 @@ TESTDLL = msvcr80.dll +IMPORTS = msvcr80
SOURCES = \ msvcr80.c \ diff --git a/dlls/msvcr80/tests/msvcr80.c b/dlls/msvcr80/tests/msvcr80.c index ea7cd5abf24..e10937e3ff6 100644 --- a/dlls/msvcr80/tests/msvcr80.c +++ b/dlls/msvcr80/tests/msvcr80.c @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include <mbctype.h> +#include <mbstring.h> #include <stdarg.h> #include <stdlib.h> #include <stdio.h> @@ -97,54 +99,13 @@ typedef struct
static ioinfo **__pioinfo;
-static _invalid_parameter_handler (__cdecl *p__set_invalid_parameter_handler)(_invalid_parameter_handler); -static int (WINAPIV *p__open)(const char *, int, ...); -static int (__cdecl *p__close)(int); -static intptr_t (__cdecl *p__get_osfhandle)(int); -static int (__cdecl *p_strcmp)(const char *, const char *); -static int (__cdecl *p_strncmp)(const char *, const char *, size_t); -static int (__cdecl *p_dupenv_s)(char **, size_t *, const char *); -static int (__cdecl *p_wdupenv_s)(wchar_t **, size_t *, const wchar_t *); -static int* (__cdecl *p_errno)(void); -static errno_t (__cdecl *p__mbsncpy_s)(unsigned char*,size_t,const unsigned char*,size_t); -static int (__cdecl *p__ismbblead_l)(unsigned int,_locale_t); -static int (__cdecl *p__getmbcp)(void); -static int (__cdecl *p__setmbcp)(int); - -/* make sure we use the correct errno */ -#undef errno -#define errno (*p_errno()) - #define SETNOFAIL(x,y) x = (void*)GetProcAddress(hcrt,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0) -static BOOL init(void) +static void init(void) { - HMODULE hcrt; - - SetLastError(0xdeadbeef); - hcrt = LoadLibraryA("msvcr80.dll"); - if (!hcrt) { - win_skip("msvcr80.dll not installed (got %ld)\n", GetLastError()); - return FALSE; - } - - SET(p__set_invalid_parameter_handler, "_set_invalid_parameter_handler"); + HMODULE hcrt = GetModuleHandleA("msvcr80.dll");
SET(__pioinfo, "__pioinfo"); - SET(p__open,"_open"); - SET(p__close,"_close"); - SET(p__get_osfhandle, "_get_osfhandle"); - - SET(p_strcmp, "strcmp"); - SET(p_strncmp, "strncmp"); - SET(p_dupenv_s, "_dupenv_s"); - SET(p_wdupenv_s, "_wdupenv_s"); - SET(p_errno, "_errno"); - SET(p__mbsncpy_s, "_mbsncpy_s"); - SET(p__ismbblead_l, "_ismbblead_l"); - SET(p__getmbcp, "_getmbcp"); - SET(p__setmbcp, "_setmbcp"); - return TRUE; }
static void test_ioinfo_flags(void) @@ -156,9 +117,9 @@ static void test_ioinfo_flags(void)
tempf = _tempnam(".","wne");
- tempfd = p__open(tempf, _O_CREAT|_O_TRUNC|_O_WRONLY|_O_WTEXT, _S_IWRITE); + tempfd = _open(tempf, _O_CREAT|_O_TRUNC|_O_WRONLY|_O_WTEXT, _S_IWRITE); ok(tempfd != -1, "_open failed with error: %d\n", errno); - handle = (HANDLE)p__get_osfhandle(tempfd); + handle = (HANDLE)_get_osfhandle(tempfd); info = &__pioinfo[tempfd / MSVCRT_FD_BLOCK_SIZE][tempfd % MSVCRT_FD_BLOCK_SIZE]; ok(!!info, "NULL info.\n"); ok(info->handle == handle, "Unexpected handle %p, expected %p.\n", info->handle, handle); @@ -166,7 +127,7 @@ static void test_ioinfo_flags(void) ok(info->wxflag == (WX_TEXT | WX_OPEN), "Unexpected wxflag %#x.\n", info->wxflag); ok(info->unicode, "Unicode is not set.\n"); ok(info->textmode == 2, "Unexpected textmode %d.\n", info->textmode); - p__close(tempfd); + _close(tempfd);
ok(info->handle == INVALID_HANDLE_VALUE, "Unexpected handle %p.\n", info->handle); ok(info->exflag == 1, "Unexpected exflag %#x.\n", info->exflag); @@ -180,7 +141,7 @@ static void test_ioinfo_flags(void) ok(!info->exflag, "Unexpected exflag %#x.\n", info->exflag); ok(!info->textmode, "Unexpected textmode %d.\n", info->textmode);
- tempfd = p__open(tempf, _O_CREAT|_O_TRUNC|_O_WRONLY|_O_TEXT, _S_IWRITE); + tempfd = _open(tempf, _O_CREAT|_O_TRUNC|_O_WRONLY|_O_TEXT, _S_IWRITE); ok(tempfd != -1, "_open failed with error: %d\n", errno); info = &__pioinfo[tempfd / MSVCRT_FD_BLOCK_SIZE][tempfd % MSVCRT_FD_BLOCK_SIZE]; ok(!!info, "NULL info.\n"); @@ -188,9 +149,9 @@ static void test_ioinfo_flags(void) ok(info->wxflag == (WX_TEXT | WX_OPEN), "Unexpected wxflag %#x.\n", info->wxflag); ok(!info->unicode, "Unicode is not set.\n"); ok(!info->textmode, "Unexpected textmode %d.\n", info->textmode); - p__close(tempfd); + _close(tempfd);
- tempfd = p__open(tempf, _O_CREAT|_O_TRUNC|_O_WRONLY|_O_U8TEXT, _S_IWRITE); + tempfd = _open(tempf, _O_CREAT|_O_TRUNC|_O_WRONLY|_O_U8TEXT, _S_IWRITE); ok(tempfd != -1, "_open failed with error: %d\n", errno); info = &__pioinfo[tempfd / MSVCRT_FD_BLOCK_SIZE][tempfd % MSVCRT_FD_BLOCK_SIZE]; ok(!!info, "NULL info.\n"); @@ -198,7 +159,7 @@ static void test_ioinfo_flags(void) ok(info->wxflag == (WX_TEXT | WX_OPEN), "Unexpected wxflag %#x.\n", info->wxflag); ok(!info->unicode, "Unicode is not set.\n"); ok(info->textmode == 1, "Unexpected textmode %d.\n", info->textmode); - p__close(tempfd); + _close(tempfd);
unlink(tempf); free(tempf); @@ -206,41 +167,41 @@ static void test_ioinfo_flags(void)
static void test_strcmp(void) { - int ret = p_strcmp( "abc", "abcd" ); + int ret = strcmp( "abc", "abcd" ); ok( ret == -1, "wrong ret %d\n", ret ); - ret = p_strcmp( "", "abc" ); + ret = strcmp( "", "abc" ); ok( ret == -1, "wrong ret %d\n", ret ); - ret = p_strcmp( "abc", "ab\xa0" ); + ret = strcmp( "abc", "ab\xa0" ); ok( ret == -1, "wrong ret %d\n", ret ); - ret = p_strcmp( "ab\xb0", "ab\xa0" ); + ret = strcmp( "ab\xb0", "ab\xa0" ); ok( ret == 1, "wrong ret %d\n", ret ); - ret = p_strcmp( "ab\xc2", "ab\xc2" ); + ret = strcmp( "ab\xc2", "ab\xc2" ); ok( ret == 0, "wrong ret %d\n", ret );
- ret = p_strncmp( "abc", "abcd", 3 ); + ret = strncmp( "abc", "abcd", 3 ); ok( ret == 0, "wrong ret %d\n", ret ); #ifdef _WIN64 - ret = p_strncmp( "", "abc", 3 ); + ret = strncmp( "", "abc", 3 ); ok( ret == -1, "wrong ret %d\n", ret ); - ret = p_strncmp( "abc", "ab\xa0", 4 ); + ret = strncmp( "abc", "ab\xa0", 4 ); ok( ret == -1, "wrong ret %d\n", ret ); - ret = p_strncmp( "ab\xb0", "ab\xa0", 3 ); + ret = strncmp( "ab\xb0", "ab\xa0", 3 ); ok( ret == 1, "wrong ret %d\n", ret ); #else - ret = p_strncmp( "", "abc", 3 ); + ret = strncmp( "", "abc", 3 ); ok( ret == 0 - 'a', "wrong ret %d\n", ret ); - ret = p_strncmp( "abc", "ab\xa0", 4 ); + ret = strncmp( "abc", "ab\xa0", 4 ); ok( ret == 'c' - 0xa0, "wrong ret %d\n", ret ); - ret = p_strncmp( "ab\xb0", "ab\xa0", 3 ); + ret = strncmp( "ab\xb0", "ab\xa0", 3 ); ok( ret == 0xb0 - 0xa0, "wrong ret %d\n", ret ); #endif - ret = p_strncmp( "ab\xb0", "ab\xa0", 2 ); + ret = strncmp( "ab\xb0", "ab\xa0", 2 ); ok( ret == 0, "wrong ret %d\n", ret ); - ret = p_strncmp( "ab\xc2", "ab\xc2", 3 ); + ret = strncmp( "ab\xc2", "ab\xc2", 3 ); ok( ret == 0, "wrong ret %d\n", ret ); - ret = p_strncmp( "abc", "abd", 0 ); + ret = strncmp( "abc", "abd", 0 ); ok( ret == 0, "wrong ret %d\n", ret ); - ret = p_strncmp( "abc", "abc", 12 ); + ret = strncmp( "abc", "abc", 12 ); ok( ret == 0, "wrong ret %d\n", ret ); }
@@ -252,7 +213,7 @@ static void test_dupenv_s(void)
len = 0xdeadbeef; tmp = (void *)0xdeadbeef; - ret = p_dupenv_s( &tmp, &len, "nonexistent" ); + ret = _dupenv_s( &tmp, &len, "nonexistent" ); ok( !ret, "_dupenv_s returned %d\n", ret ); ok( !len, "_dupenv_s returned length is %Id\n", len ); ok( !tmp, "_dupenv_s returned pointer is %p\n", tmp ); @@ -266,7 +227,7 @@ static void test_wdupenv_s(void)
len = 0xdeadbeef; tmp = (void *)0xdeadbeef; - ret = p_wdupenv_s( &tmp, &len, L"nonexistent" ); + ret = _wdupenv_s( &tmp, &len, L"nonexistent" ); ok( !ret, "_wdupenv_s returned %d\n", ret ); ok( !len, "_wdupenv_s returned length is %Id\n", len ); ok( !tmp, "_wdupenv_s returned pointer is %p\n", tmp ); @@ -284,8 +245,8 @@ static void test__mbsncpy_s(void) errno_t err; int oldcp;
- oldcp = p__getmbcp(); - if (p__setmbcp(936)) + oldcp = _getmbcp(); + if (_setmbcp(936)) { win_skip("Code page 936 is not available, skipping test.\n"); return; @@ -293,27 +254,27 @@ static void test__mbsncpy_s(void)
errno = 0xdeadbeef; memset(buf, 0xcc, sizeof(buf)); - err = p__mbsncpy_s(NULL, 0, mbstring, 0); + err = _mbsncpy_s(NULL, 0, mbstring, 0); ok(errno == 0xdeadbeef, "got %d\n", errno); ok(!err, "got %d.\n", err);
errno = 0xdeadbeef; memset(buf, 0xcc, sizeof(buf)); - err = p__mbsncpy_s(buf, 6, mbstring, 1); + err = _mbsncpy_s(buf, 6, mbstring, 1); ok(errno == 0xdeadbeef, "got %d\n", errno); ok(!err, "got %d.\n", err); expect_bin(buf, "\xb0\xb1\0\xcc", 4);
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 6, mbstring, 2); + err = _mbsncpy_s(buf, 6, mbstring, 2); ok(errno == 0xdeadbeef, "got %d\n", errno); ok(!err, "got %d.\n", err); expect_bin(buf, "\xb0\xb1\xb2\xb3\0\xcc", 6);
errno = 0xdeadbeef; memset(buf, 0xcc, sizeof(buf)); - err = p__mbsncpy_s(buf, 2, mbstring, _TRUNCATE); + err = _mbsncpy_s(buf, 2, mbstring, _TRUNCATE); ok(errno == 0xdeadbeef, "got %d\n", errno); ok(err == STRUNCATE, "got %d.\n", err); expect_bin(buf, "\x00\xb1\xcc", 3); @@ -321,7 +282,7 @@ static void test__mbsncpy_s(void) memset(buf, 0xcc, sizeof(buf)); SET_EXPECT(invalid_parameter_handler); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 2, mbstring, 1); + err = _mbsncpy_s(buf, 2, mbstring, 1); ok(errno == err, "got %d.\n", errno); CHECK_CALLED(invalid_parameter_handler); ok(err == ERANGE, "got %d.\n", err); @@ -330,7 +291,7 @@ static void test__mbsncpy_s(void) memset(buf, 0xcc, sizeof(buf)); SET_EXPECT(invalid_parameter_handler); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 2, mbstring, 3); + err = _mbsncpy_s(buf, 2, mbstring, 3); ok(errno == err, "got %d\n", errno); CHECK_CALLED(invalid_parameter_handler); ok(err == ERANGE, "got %d.\n", err); @@ -339,7 +300,7 @@ static void test__mbsncpy_s(void) memset(buf, 0xcc, sizeof(buf)); SET_EXPECT(invalid_parameter_handler); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 1, mbstring, 3); + err = _mbsncpy_s(buf, 1, mbstring, 3); ok(errno == err, "got %d\n", errno); CHECK_CALLED(invalid_parameter_handler); ok(err == ERANGE, "got %d.\n", err); @@ -348,7 +309,7 @@ static void test__mbsncpy_s(void) memset(buf, 0xcc, sizeof(buf)); SET_EXPECT(invalid_parameter_handler); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 0, mbstring, 3); + err = _mbsncpy_s(buf, 0, mbstring, 3); ok(errno == err, "got %d\n", errno); CHECK_CALLED(invalid_parameter_handler); ok(err == EINVAL, "got %d.\n", err); @@ -357,7 +318,7 @@ static void test__mbsncpy_s(void) memset(buf, 0xcc, sizeof(buf)); SET_EXPECT(invalid_parameter_handler); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 0, mbstring, 0); + err = _mbsncpy_s(buf, 0, mbstring, 0); ok(errno == err, "got %d\n", errno); CHECK_CALLED(invalid_parameter_handler); ok(err == EINVAL, "got %d.\n", err); @@ -365,83 +326,82 @@ static void test__mbsncpy_s(void)
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, -1, mbstring, 0); + err = _mbsncpy_s(buf, -1, mbstring, 0); ok(errno == 0xdeadbeef, "got %d\n", errno); ok(!err, "got %d.\n", err); expect_bin(buf, "\x0\xcc", 2);
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, -1, mbstring, 256); + err = _mbsncpy_s(buf, -1, mbstring, 256); ok(errno == 0xdeadbeef, "got %d\n", errno); ok(!err, "got %d.\n", err); expect_bin(buf, "\xb0\xb1\xb2\xb3Q\xb4\xb5\x0\xcc", 9);
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 1, mbstring2, 4); + err = _mbsncpy_s(buf, 1, mbstring2, 4); ok(errno == err, "got %d\n", errno); ok(err == EILSEQ, "got %d.\n", err); expect_bin(buf, "\x0\xcc", 2);
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 2, mbstring2, 4); + err = _mbsncpy_s(buf, 2, mbstring2, 4); ok(errno == err, "got %d\n", errno); ok(err == EILSEQ, "got %d.\n", err); expect_bin(buf, "\x0\xcc", 2);
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 1, mbstring2, _TRUNCATE); + err = _mbsncpy_s(buf, 1, mbstring2, _TRUNCATE); ok(errno == 0xdeadbeef, "got %d\n", errno); ok(err == STRUNCATE, "got %d.\n", err); expect_bin(buf, "\x0\xcc", 2);
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 2, mbstring2, _TRUNCATE); + err = _mbsncpy_s(buf, 2, mbstring2, _TRUNCATE); ok(errno == 0xdeadbeef, "got %d\n", errno); ok(!err, "got %d.\n", err); expect_bin(buf, "\xb0\x0\xcc", 3);
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 1, mbstring2, 1); + err = _mbsncpy_s(buf, 1, mbstring2, 1); ok(errno == err, "got %d\n", errno); ok(err == EILSEQ, "got %d.\n", err); expect_bin(buf, "\x0\xcc", 2);
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 2, mbstring2, 1); + err = _mbsncpy_s(buf, 2, mbstring2, 1); ok(errno == err, "got %d\n", errno); ok(err == EILSEQ, "got %d.\n", err); expect_bin(buf, "\x0\xcc", 2);
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 3, mbstring2, 1); + err = _mbsncpy_s(buf, 3, mbstring2, 1); ok(errno == err, "got %d\n", errno); ok(err == EILSEQ, "got %d.\n", err); expect_bin(buf, "\x0\xcc", 2);
memset(buf, 0xcc, sizeof(buf)); errno = 0xdeadbeef; - err = p__mbsncpy_s(buf, 3, mbstring2, 2); + err = _mbsncpy_s(buf, 3, mbstring2, 2); ok(errno == err, "got %d\n", errno); ok(err == EILSEQ, "got %d.\n", err); expect_bin(buf, "\x0\xcc", 2);
- p__setmbcp(oldcp); + _setmbcp(oldcp); }
START_TEST(msvcr80) { - if(!init()) - return; + init();
- ok(p__set_invalid_parameter_handler(test_invalid_parameter_handler) == NULL, + ok(_set_invalid_parameter_handler(test_invalid_parameter_handler) == NULL, "Invalid parameter handler was already set\n");
test_ioinfo_flags();