| /* | |
| * 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 | |
| * | |
| * This file contains tests to ensure the consistency between symbols | |
| * defined in the regular msvcrt headers, and the corresponding duplicated | |
| * symbols defined in msvcrt.h (prefixed by MSVCRT_). | |
| */ | |
| #include "dos.h" | |
| #include "math.h" | |
| #include "stdlib.h" | |
| #include "io.h" | |
| #include "errno.h" | |
| #include "fcntl.h" | |
| #include "malloc.h" | |
| #include "limits.h" | |
| #include "mbctype.h" | |
| #include "stdio.h" | |
| #include "wchar.h" | |
| #include "ctype.h" | |
| #include "crtdbg.h" | |
| #include "share.h" | |
| #include "search.h" | |
| #include "wctype.h" | |
| #include "float.h" | |
| #include "stddef.h" | |
| #include "mbstring.h" | |
| #include "sys/locking.h" | |
| #include "sys/utime.h" | |
| #include "sys/types.h" | |
| #include "sys/stat.h" | |
| #include "sys/timeb.h" | |
| #include "direct.h" | |
| #include "conio.h" | |
| #include "process.h" | |
| #include "string.h" | |
| #include "signal.h" | |
| #include "time.h" | |
| #include "locale.h" | |
| #include "setjmp.h" | |
| #include "wine/test.h" | |
| #ifdef __WINE_USE_MSVCRT | |
| /* Wine-specific msvcrt headers */ | |
| #define __WINE_MSVCRT_TEST | |
| #include "eh.h" | |
| #include "msvcrt.h" | |
| #ifdef __GNUC__ | |
| #define TYPEOF(type) typeof(type) | |
| #else | |
| #define TYPEOF(type) int | |
| #endif | |
| #define MSVCRT(x) MSVCRT_##x | |
| #define CHECK_SIZE(e) ok(sizeof(e) == sizeof(MSVCRT(e)), "Element has different sizes\n") | |
| #define CHECK_TYPE(t) { TYPEOF(t) a = 0; TYPEOF(MSVCRT(t)) b = a; a = b; CHECK_SIZE(t); } | |
| #define CHECK_STRUCT(s) ok(sizeof(struct s) == sizeof(struct MSVCRT(s)), "Struct has different sizes\n") | |
| #define CHECK_FIELD(s,e) ok(offsetof(struct s,e) == offsetof(struct MSVCRT(s),e), "Bad offset\n") | |
| #define CHECK_DEF(d) ok(d == MSVCRT_##d, "Defines (MSVCRT_)" #d " are different: %d vs. %d\n", d, MSVCRT_##d) | |
| /************* Checking types ***************/ | |
| static void test_types(void) | |
| { | |
| CHECK_TYPE(wchar_t); | |
| CHECK_TYPE(wint_t); | |
| CHECK_TYPE(wctype_t); | |
| CHECK_TYPE(_ino_t); | |
| CHECK_TYPE(_fsize_t); | |
| CHECK_TYPE(size_t); | |
| CHECK_TYPE(intptr_t); | |
| CHECK_TYPE(uintptr_t); | |
| CHECK_TYPE(_dev_t); | |
| CHECK_TYPE(_off_t); | |
| CHECK_TYPE(clock_t); | |
| CHECK_TYPE(__time32_t); | |
| CHECK_TYPE(__time64_t); | |
| CHECK_TYPE(fpos_t); | |
| CHECK_SIZE(FILE); | |
| CHECK_TYPE(terminate_handler); | |
| CHECK_TYPE(terminate_function); | |
| CHECK_TYPE(unexpected_handler); | |
| CHECK_TYPE(unexpected_function); | |
| CHECK_TYPE(_se_translator_function); | |
| CHECK_TYPE(_beginthread_start_routine_t); | |
| CHECK_TYPE(_onexit_t); | |
| CHECK_TYPE(__sighandler_t); | |
| } | |
| /************* Checking structs ***************/ | |
| static void test_structs(void) | |
| { | |
| CHECK_STRUCT(tm); | |
| CHECK_FIELD(tm, tm_sec); | |
| CHECK_FIELD(tm, tm_min); | |
| CHECK_FIELD(tm, tm_hour); | |
| CHECK_FIELD(tm, tm_mday); | |
| CHECK_FIELD(tm, tm_mon); | |
| CHECK_FIELD(tm, tm_year); | |
| CHECK_FIELD(tm, tm_wday); | |
| CHECK_FIELD(tm, tm_yday); | |
| CHECK_FIELD(tm, tm_isdst); | |
| CHECK_STRUCT(__timeb32); | |
| CHECK_FIELD(__timeb32, time); | |
| CHECK_FIELD(__timeb32, millitm); | |
| CHECK_FIELD(__timeb32, timezone); | |
| CHECK_FIELD(__timeb32, dstflag); | |
| CHECK_STRUCT(__timeb64); | |
| CHECK_FIELD(__timeb64, time); | |
| CHECK_FIELD(__timeb64, millitm); | |
| CHECK_FIELD(__timeb64, timezone); | |
| CHECK_FIELD(__timeb64, dstflag); | |
| CHECK_STRUCT(_iobuf); | |
| CHECK_FIELD(_iobuf, _ptr); | |
| CHECK_FIELD(_iobuf, _cnt); | |
| CHECK_FIELD(_iobuf, _base); | |
| CHECK_FIELD(_iobuf, _flag); | |
| CHECK_FIELD(_iobuf, _file); | |
| CHECK_FIELD(_iobuf, _charbuf); | |
| CHECK_FIELD(_iobuf, _bufsiz); | |
| CHECK_FIELD(_iobuf, _tmpfname); | |
| CHECK_STRUCT(lconv); | |
| CHECK_FIELD(lconv, decimal_point); | |
| CHECK_FIELD(lconv, thousands_sep); | |
| CHECK_FIELD(lconv, grouping); | |
| CHECK_FIELD(lconv, int_curr_symbol); | |
| CHECK_FIELD(lconv, currency_symbol); | |
| CHECK_FIELD(lconv, mon_decimal_point); | |
| CHECK_FIELD(lconv, mon_thousands_sep); | |
| CHECK_FIELD(lconv, mon_grouping); | |
| CHECK_FIELD(lconv, positive_sign); | |
| CHECK_FIELD(lconv, negative_sign); | |
| CHECK_FIELD(lconv, int_frac_digits); | |
| CHECK_FIELD(lconv, frac_digits); | |
| CHECK_FIELD(lconv, p_cs_precedes); | |
| CHECK_FIELD(lconv, p_sep_by_space); | |
| CHECK_FIELD(lconv, n_cs_precedes); | |
| CHECK_FIELD(lconv, n_sep_by_space); | |
| CHECK_FIELD(lconv, p_sign_posn); | |
| CHECK_FIELD(lconv, n_sign_posn); | |
| CHECK_STRUCT(_exception); | |
| CHECK_FIELD(_exception, type); | |
| CHECK_FIELD(_exception, name); | |
| CHECK_FIELD(_exception, arg1); | |
| CHECK_FIELD(_exception, arg2); | |
| CHECK_FIELD(_exception, retval); | |
| CHECK_STRUCT(_complex); | |
| CHECK_FIELD(_complex, x); | |
| CHECK_FIELD(_complex, y); | |
| CHECK_STRUCT(_div_t); | |
| CHECK_FIELD(_div_t, quot); | |
| CHECK_FIELD(_div_t, rem); | |
| CHECK_STRUCT(_ldiv_t); | |
| CHECK_FIELD(_ldiv_t, quot); | |
| CHECK_FIELD(_ldiv_t, rem); | |
| CHECK_STRUCT(_heapinfo); | |
| CHECK_FIELD(_heapinfo, _pentry); | |
| CHECK_FIELD(_heapinfo, _size); | |
| CHECK_FIELD(_heapinfo, _useflag); | |
| #ifdef __i386__ | |
| CHECK_STRUCT(__JUMP_BUFFER); | |
| CHECK_FIELD(__JUMP_BUFFER, Ebp); | |
| CHECK_FIELD(__JUMP_BUFFER, Ebx); | |
| CHECK_FIELD(__JUMP_BUFFER, Edi); | |
| CHECK_FIELD(__JUMP_BUFFER, Esi); | |
| CHECK_FIELD(__JUMP_BUFFER, Esp); | |
| CHECK_FIELD(__JUMP_BUFFER, Eip); | |
| CHECK_FIELD(__JUMP_BUFFER, Registration); | |
| CHECK_FIELD(__JUMP_BUFFER, TryLevel); | |
| CHECK_FIELD(__JUMP_BUFFER, Cookie); | |
| CHECK_FIELD(__JUMP_BUFFER, UnwindFunc); | |
| CHECK_FIELD(__JUMP_BUFFER, UnwindData[6]); | |
| #endif | |
| CHECK_STRUCT(_diskfree_t); | |
| CHECK_FIELD(_diskfree_t, total_clusters); | |
| CHECK_FIELD(_diskfree_t, avail_clusters); | |
| CHECK_FIELD(_diskfree_t, sectors_per_cluster); | |
| CHECK_FIELD(_diskfree_t, bytes_per_sector); | |
| CHECK_STRUCT(_finddata_t); | |
| CHECK_FIELD(_finddata_t, attrib); | |
| CHECK_FIELD(_finddata_t, time_create); | |
| CHECK_FIELD(_finddata_t, time_access); | |
| CHECK_FIELD(_finddata_t, time_write); | |
| CHECK_FIELD(_finddata_t, size); | |
| CHECK_FIELD(_finddata_t, name[260]); | |
| CHECK_STRUCT(_finddatai64_t); | |
| CHECK_FIELD(_finddatai64_t, attrib); | |
| CHECK_FIELD(_finddatai64_t, time_create); | |
| CHECK_FIELD(_finddatai64_t, time_access); | |
| CHECK_FIELD(_finddatai64_t, time_write); | |
| CHECK_FIELD(_finddatai64_t, size); | |
| CHECK_FIELD(_finddatai64_t, name[260]); | |
| CHECK_STRUCT(_wfinddata_t); | |
| CHECK_FIELD(_wfinddata_t, attrib); | |
| CHECK_FIELD(_wfinddata_t, time_create); | |
| CHECK_FIELD(_wfinddata_t, time_access); | |
| CHECK_FIELD(_wfinddata_t, time_write); | |
| CHECK_FIELD(_wfinddata_t, size); | |
| CHECK_FIELD(_wfinddata_t, name[260]); | |
| CHECK_STRUCT(_wfinddatai64_t); | |
| CHECK_FIELD(_wfinddatai64_t, attrib); | |
| CHECK_FIELD(_wfinddatai64_t, time_create); | |
| CHECK_FIELD(_wfinddatai64_t, time_access); | |
| CHECK_FIELD(_wfinddatai64_t, time_write); | |
| CHECK_FIELD(_wfinddatai64_t, size); | |
| CHECK_FIELD(_wfinddatai64_t, name[260]); | |
| CHECK_STRUCT(__utimbuf32); | |
| CHECK_FIELD(__utimbuf32, actime); | |
| CHECK_FIELD(__utimbuf32, modtime); | |
| CHECK_STRUCT(__utimbuf64); | |
| CHECK_FIELD(__utimbuf64, actime); | |
| CHECK_FIELD(__utimbuf64, modtime); | |
| CHECK_STRUCT(_stat); | |
| CHECK_FIELD(_stat, st_dev); | |
| CHECK_FIELD(_stat, st_ino); | |
| CHECK_FIELD(_stat, st_mode); | |
| CHECK_FIELD(_stat, st_nlink); | |
| CHECK_FIELD(_stat, st_uid); | |
| CHECK_FIELD(_stat, st_gid); | |
| CHECK_FIELD(_stat, st_rdev); | |
| CHECK_FIELD(_stat, st_size); | |
| CHECK_FIELD(_stat, st_atime); | |
| CHECK_FIELD(_stat, st_mtime); | |
| CHECK_FIELD(_stat, st_ctime); | |
| CHECK_STRUCT(_stati64); | |
| CHECK_FIELD(_stati64, st_dev); | |
| CHECK_FIELD(_stati64, st_ino); | |
| CHECK_FIELD(_stati64, st_mode); | |
| CHECK_FIELD(_stati64, st_nlink); | |
| CHECK_FIELD(_stati64, st_uid); | |
| CHECK_FIELD(_stati64, st_gid); | |
| CHECK_FIELD(_stati64, st_rdev); | |
| CHECK_FIELD(_stati64, st_size); | |
| CHECK_FIELD(_stati64, st_atime); | |
| CHECK_FIELD(_stati64, st_mtime); | |
| CHECK_FIELD(_stati64, st_ctime); | |
| CHECK_STRUCT(_stat64); | |
| CHECK_FIELD(_stat64, st_dev); | |
| CHECK_FIELD(_stat64, st_ino); | |
| CHECK_FIELD(_stat64, st_mode); | |
| CHECK_FIELD(_stat64, st_nlink); | |
| CHECK_FIELD(_stat64, st_uid); | |
| CHECK_FIELD(_stat64, st_gid); | |
| CHECK_FIELD(_stat64, st_rdev); | |
| CHECK_FIELD(_stat64, st_size); | |
| CHECK_FIELD(_stat64, st_atime); | |
| CHECK_FIELD(_stat64, st_mtime); | |
| CHECK_FIELD(_stat64, st_ctime); | |
| CHECK_SIZE(_CRT_FLOAT); | |
| } | |
| /************* Checking defines ***************/ | |
| static void test_defines(void) | |
| { | |
| CHECK_DEF(WEOF); | |
| CHECK_DEF(EOF); | |
| CHECK_DEF(TMP_MAX); | |
| CHECK_DEF(RAND_MAX); | |
| CHECK_DEF(BUFSIZ); | |
| CHECK_DEF(STDIN_FILENO); | |
| CHECK_DEF(STDOUT_FILENO); | |
| CHECK_DEF(STDERR_FILENO); | |
| CHECK_DEF(_IOFBF); | |
| CHECK_DEF(_IONBF); | |
| CHECK_DEF(_IOLBF); | |
| CHECK_DEF(FILENAME_MAX); | |
| CHECK_DEF(_P_WAIT); | |
| CHECK_DEF(_P_NOWAIT); | |
| CHECK_DEF(_P_OVERLAY); | |
| CHECK_DEF(_P_NOWAITO); | |
| CHECK_DEF(_P_DETACH); | |
| CHECK_DEF(EPERM); | |
| CHECK_DEF(ENOENT); | |
| CHECK_DEF(ESRCH); | |
| CHECK_DEF(EINTR); | |
| CHECK_DEF(EIO); | |
| CHECK_DEF(ENXIO); | |
| CHECK_DEF(E2BIG); | |
| CHECK_DEF(ENOEXEC); | |
| CHECK_DEF(EBADF); | |
| CHECK_DEF(ECHILD); | |
| CHECK_DEF(EAGAIN); | |
| CHECK_DEF(ENOMEM); | |
| CHECK_DEF(EACCES); | |
| CHECK_DEF(EFAULT); | |
| CHECK_DEF(EBUSY); | |
| CHECK_DEF(EEXIST); | |
| CHECK_DEF(EXDEV); | |
| CHECK_DEF(ENODEV); | |
| CHECK_DEF(ENOTDIR); | |
| CHECK_DEF(EISDIR); | |
| CHECK_DEF(EINVAL); | |
| CHECK_DEF(ENFILE); | |
| CHECK_DEF(EMFILE); | |
| CHECK_DEF(ENOTTY); | |
| CHECK_DEF(EFBIG); | |
| CHECK_DEF(ENOSPC); | |
| CHECK_DEF(ESPIPE); | |
| CHECK_DEF(EROFS); | |
| CHECK_DEF(EMLINK); | |
| CHECK_DEF(EPIPE); | |
| CHECK_DEF(EDOM); | |
| CHECK_DEF(ERANGE); | |
| CHECK_DEF(EDEADLK); | |
| CHECK_DEF(EDEADLOCK); | |
| CHECK_DEF(ENAMETOOLONG); | |
| CHECK_DEF(ENOLCK); | |
| CHECK_DEF(ENOSYS); | |
| CHECK_DEF(ENOTEMPTY); | |
| CHECK_DEF(EILSEQ); | |
| CHECK_DEF(LC_ALL); | |
| CHECK_DEF(LC_COLLATE); | |
| CHECK_DEF(LC_CTYPE); | |
| CHECK_DEF(LC_MONETARY); | |
| CHECK_DEF(LC_NUMERIC); | |
| CHECK_DEF(LC_TIME); | |
| CHECK_DEF(LC_MIN); | |
| CHECK_DEF(LC_MAX); | |
| CHECK_DEF(CLOCKS_PER_SEC); | |
| CHECK_DEF(_HEAPEMPTY); | |
| CHECK_DEF(_HEAPOK); | |
| CHECK_DEF(_HEAPBADBEGIN); | |
| CHECK_DEF(_HEAPBADNODE); | |
| CHECK_DEF(_HEAPEND); | |
| CHECK_DEF(_HEAPBADPTR); | |
| 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); | |
| CHECK_DEF(_DIGIT); | |
| CHECK_DEF(_SPACE); | |
| CHECK_DEF(_PUNCT); | |
| CHECK_DEF(_CONTROL); | |
| CHECK_DEF(_BLANK); | |
| CHECK_DEF(_HEX); | |
| CHECK_DEF(_LEADBYTE); | |
| CHECK_DEF(_ALPHA); | |
| CHECK_DEF(_IOREAD); | |
| CHECK_DEF(_IOWRT); | |
| CHECK_DEF(_IOMYBUF); | |
| CHECK_DEF(_IOEOF); | |
| CHECK_DEF(_IOERR); | |
| CHECK_DEF(_IOSTRG); | |
| CHECK_DEF(_IORW); | |
| CHECK_DEF(_S_IEXEC); | |
| CHECK_DEF(_S_IWRITE); | |
| CHECK_DEF(_S_IREAD); | |
| CHECK_DEF(_S_IFIFO); | |
| CHECK_DEF(_S_IFCHR); | |
| CHECK_DEF(_S_IFDIR); | |
| CHECK_DEF(_S_IFREG); | |
| CHECK_DEF(_S_IFMT); | |
| CHECK_DEF(_LK_UNLCK); | |
| CHECK_DEF(_LK_LOCK); | |
| CHECK_DEF(_LK_NBLCK); | |
| CHECK_DEF(_LK_RLCK); | |
| CHECK_DEF(_LK_NBRLCK); | |
| CHECK_DEF(_O_RDONLY); | |
| CHECK_DEF(_O_WRONLY); | |
| CHECK_DEF(_O_RDWR); | |
| CHECK_DEF(_O_ACCMODE); | |
| CHECK_DEF(_O_APPEND); | |
| CHECK_DEF(_O_RANDOM); | |
| CHECK_DEF(_O_SEQUENTIAL); | |
| CHECK_DEF(_O_TEMPORARY); | |
| CHECK_DEF(_O_NOINHERIT); | |
| CHECK_DEF(_O_CREAT); | |
| CHECK_DEF(_O_TRUNC); | |
| CHECK_DEF(_O_EXCL); | |
| CHECK_DEF(_O_SHORT_LIVED); | |
| CHECK_DEF(_O_TEXT); | |
| CHECK_DEF(_O_BINARY); | |
| CHECK_DEF(_O_RAW); | |
| CHECK_DEF(_SW_INEXACT); | |
| CHECK_DEF(_SW_UNDERFLOW); | |
| CHECK_DEF(_SW_OVERFLOW); | |
| CHECK_DEF(_SW_ZERODIVIDE); | |
| CHECK_DEF(_SW_INVALID); | |
| CHECK_DEF(_SW_UNEMULATED); | |
| CHECK_DEF(_SW_SQRTNEG); | |
| CHECK_DEF(_SW_STACKOVERFLOW); | |
| CHECK_DEF(_SW_STACKUNDERFLOW); | |
| CHECK_DEF(_SW_DENORMAL); | |
| CHECK_DEF(_FPCLASS_SNAN); | |
| CHECK_DEF(_FPCLASS_QNAN); | |
| CHECK_DEF(_FPCLASS_NINF); | |
| CHECK_DEF(_FPCLASS_NN); | |
| CHECK_DEF(_FPCLASS_ND); | |
| CHECK_DEF(_FPCLASS_NZ); | |
| CHECK_DEF(_FPCLASS_PZ); | |
| CHECK_DEF(_FPCLASS_PD); | |
| CHECK_DEF(_FPCLASS_PN); | |
| CHECK_DEF(_FPCLASS_PINF); | |
| CHECK_DEF(SIGINT); | |
| CHECK_DEF(SIGILL); | |
| CHECK_DEF(SIGFPE); | |
| CHECK_DEF(SIGSEGV); | |
| CHECK_DEF(SIGTERM); | |
| CHECK_DEF(SIGBREAK); | |
| CHECK_DEF(SIGABRT); | |
| CHECK_DEF(NSIG); | |
| CHECK_DEF(_FPE_INVALID); | |
| CHECK_DEF(_FPE_DENORMAL); | |
| CHECK_DEF(_FPE_ZERODIVIDE); | |
| CHECK_DEF(_FPE_OVERFLOW); | |
| CHECK_DEF(_FPE_UNDERFLOW); | |
| CHECK_DEF(_FPE_INEXACT); | |
| CHECK_DEF(_FPE_UNEMULATED); | |
| CHECK_DEF(_FPE_SQRTNEG); | |
| CHECK_DEF(_FPE_STACKOVERFLOW); | |
| CHECK_DEF(_FPE_STACKUNDERFLOW); | |
| CHECK_DEF(_FPE_EXPLICITGEN); | |
| 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); | |
| CHECK_DEF(_EM_OVERFLOW); | |
| CHECK_DEF(_EM_UNDERFLOW); | |
| CHECK_DEF(_EM_INEXACT); | |
| CHECK_DEF(_IC_AFFINE); | |
| CHECK_DEF(_IC_PROJECTIVE); | |
| CHECK_DEF(_RC_CHOP); | |
| CHECK_DEF(_RC_UP); | |
| CHECK_DEF(_RC_DOWN); | |
| CHECK_DEF(_RC_NEAR); | |
| CHECK_DEF(_PC_24); | |
| CHECK_DEF(_PC_53); | |
| CHECK_DEF(_PC_64); | |
| 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 */ | |
| START_TEST(headers) | |
| { | |
| #ifdef __WINE_USE_MSVCRT | |
| test_types(); | |
| test_structs(); | |
| test_defines(); | |
| #endif | |
| } |