1#include "func.def.in"
2
3#define ADD_UNDERSCORE(symbol) symbol == _ ## symbol
4#define ADD_UNDERSCORE_DATA(symbol) symbol DATA == _ ## symbol
5#define ADD_UNDERSCORE_DATA_DLL(symbol) symbol DATA == _ ## symbol ## _dll
6#define ADD_DOUBLE_UNDERSCORE(symbol) symbol == __ ## symbol
7
8; This is list of symbol aliases from the Visual C++ 1.0 oldnames.lib library
9; FIXME: some of these symbol aliases are commented, check and document why
10#ifdef UCRTBASE
11; access is provided as an alias for __mingw_access
12#else
13ADD_UNDERSCORE(access)
14#endif
15#ifndef CRTAPP
16; ADD_UNDERSCORE(cgets)
17ADD_UNDERSCORE(chdir)
18#endif
19ADD_UNDERSCORE(chmod)
20ADD_UNDERSCORE(chsize)
21ADD_UNDERSCORE(close)
22#ifndef CRTAPP
23; ADD_UNDERSCORE(cprintf)
24; ADD_UNDERSCORE(cputs)
25#endif
26ADD_UNDERSCORE(creat)
27#ifndef CRTAPP
28; ADD_UNDERSCORE(cscanf)
29ADD_UNDERSCORE(cwait)
30#endif
31#if defined(UCRTBASE)
32; daylight variable is provided by misc/ucrt_tzset.c
33#elif defined(CRTDLL)
34ADD_UNDERSCORE_DATA_DLL(daylight)
35#else
36ADD_UNDERSCORE_DATA(daylight)
37#endif
38ADD_UNDERSCORE(dup)
39ADD_UNDERSCORE(dup2)
40ADD_UNDERSCORE(ecvt)
41#if defined(UCRTBASE)
42; _environ variable is not available in ucrtbase.dll and there is no replacement for it
43#elif defined(CRTDLL)
44; ADD_UNDERSCORE_DATA_DLL(environ)
45#else
46; ADD_UNDERSCORE_DATA(environ)
47#endif
48ADD_UNDERSCORE(eof)
49#ifndef CRTAPP
50ADD_UNDERSCORE(execl)
51ADD_UNDERSCORE(execle)
52ADD_UNDERSCORE(execlp)
53ADD_UNDERSCORE(execlpe)
54ADD_UNDERSCORE(execv)
55ADD_UNDERSCORE(execve)
56ADD_UNDERSCORE(execvp)
57ADD_UNDERSCORE(execvpe)
58#endif
59ADD_UNDERSCORE(fcloseall)
60ADD_UNDERSCORE(fcvt)
61ADD_UNDERSCORE(fdopen)
62ADD_UNDERSCORE(fgetchar)
63ADD_UNDERSCORE(filelength)
64ADD_UNDERSCORE(fileno)
65; ADD_UNDERSCORE(flushall)
66ADD_UNDERSCORE(fputchar)
67#if defined(UCRTBASE)
68F32(fstat == _fstat32)
69F64(fstat == _fstat64i32)
70#else
71; fstat for non-UCRT is provided by mingw to workaround S_IFDIR issue in _fstat
72#endif
73; ftime is provided in misc/ftime32.c or misc/ftime64.c as MS _ftime is not ABI compatible with POSIX ftime
74#if defined(UCRTBASE)
75; HUGE alias and _HUGE variable are provided by math/_huge.c
76#elif defined(CRTDLL)
77ADD_UNDERSCORE_DATA_DLL(HUGE)
78#else
79ADD_UNDERSCORE_DATA(HUGE)
80#endif
81ADD_UNDERSCORE(gcvt)
82#ifndef CRTAPP
83ADD_UNDERSCORE(getch)
84ADD_UNDERSCORE(getche)
85ADD_UNDERSCORE(getcwd)
86#endif
87#ifdef UCRTBASE
88; ucrtbase.dll has got _getpid for all archs
89ADD_UNDERSCORE(getpid)
90#elif !defined(CRTAPP)
91; msvcrt.dll for arm/arm64 lacks _getpid
92F_X86_ANY(ADD_UNDERSCORE(getpid))
93#endif
94#ifndef CRTAPP
95ADD_UNDERSCORE(getw)
96#endif
97ADD_UNDERSCORE(isatty)
98ADD_UNDERSCORE(itoa)
99#ifndef CRTAPP
100ADD_UNDERSCORE(kbhit)
101#endif
102ADD_UNDERSCORE(lfind)
103; ADD_UNDERSCORE(locking)
104ADD_UNDERSCORE(lsearch)
105ADD_UNDERSCORE(lseek)
106ADD_UNDERSCORE(ltoa)
107ADD_UNDERSCORE(memccpy)
108ADD_UNDERSCORE(memicmp)
109ADD_UNDERSCORE(mkdir)
110ADD_UNDERSCORE(mktemp)
111; onexit function alias is provided by misc/_onexit.c
112ADD_UNDERSCORE(open)
113#ifndef CRTAPP
114ADD_UNDERSCORE(putch)
115ADD_UNDERSCORE(putenv)
116#endif
117ADD_UNDERSCORE(putw)
118ADD_UNDERSCORE(read)
119ADD_UNDERSCORE(rmdir)
120ADD_UNDERSCORE(rmtmp)
121ADD_UNDERSCORE(setmode)
122ADD_UNDERSCORE(sopen)
123#ifndef CRTAPP
124ADD_UNDERSCORE(spawnl)
125ADD_UNDERSCORE(spawnle)
126ADD_UNDERSCORE(spawnlp)
127ADD_UNDERSCORE(spawnlpe)
128ADD_UNDERSCORE(spawnv)
129ADD_UNDERSCORE(spawnve)
130ADD_UNDERSCORE(spawnvp)
131ADD_UNDERSCORE(spawnvpe)
132#endif
133#ifdef UCRTBASE
134F32(stat == _stat32)
135F64(stat == _stat64i32)
136#else
137; stat for non-UCRT is provided by mingw to workaround trailing slash issue in _stat
138#endif
139#ifdef NO_STRCMPI_ALIAS
140; Symbol _strcmpi is natively present and defined in the library def file
141; So define strcmpi as an alias to _strcmpi
142ADD_UNDERSCORE(strcmpi)
143#else
144; Symbol _strcmpi is not present in the library, it provides only _stricmp symbol
145; So define strcmpi as an alias to _stricmp
146strcmpi == _stricmp
147#endif
148ADD_UNDERSCORE(strdup)
149ADD_UNDERSCORE(stricmp)
150ADD_UNDERSCORE(strlwr)
151ADD_UNDERSCORE(strnicmp)
152ADD_UNDERSCORE(strnset)
153ADD_UNDERSCORE(strrev)
154ADD_UNDERSCORE(strset)
155ADD_UNDERSCORE(strupr)
156ADD_UNDERSCORE(swab)
157#if defined(UCRTBASE)
158; _sys_errlist variable is not available in ucrtbase.dll and there is no replacement for it
159#else
160// sys_errlist variable is without _dll suffix in crtdll.dll
161; ADD_UNDERSCORE_DATA(sys_errlist)
162#endif
163#if defined(UCRTBASE)
164; _sys_nerr variable is not available in ucrtbase.dll and there is no replacement for it
165#elif defined(CRTDLL)
166; ADD_UNDERSCORE_DATA_DLL(sys_nerr)
167#else
168; ADD_UNDERSCORE_DATA(sys_nerr)
169#endif
170ADD_UNDERSCORE(tell)
171ADD_UNDERSCORE(tempnam)
172#if defined(UCRTBASE)
173; timezone variable is provided by misc/ucrt_tzset.c
174#elif defined(CRTDLL)
175ADD_UNDERSCORE_DATA_DLL(timezone)
176#else
177ADD_UNDERSCORE_DATA(timezone)
178#endif
179#if defined(UCRTBASE)
180; tzname variable is provided by misc/ucrt_tzset.c
181#else
182// tzname variable is without _dll suffix in crtdll.dll
183ADD_UNDERSCORE_DATA(tzname)
184#endif
185#if defined(UCRTBASE)
186; tzset function is provided by misc/ucrt_tzset.c
187#else
188ADD_UNDERSCORE(tzset)
189#endif
190; ADD_UNDERSCORE(ultoa)
191ADD_UNDERSCORE(umask)
192#ifndef CRTAPP
193ADD_UNDERSCORE(ungetch)
194#endif
195ADD_UNDERSCORE(unlink)
196#ifdef FIXED_SIZE_SYMBOLS
197ADD_UNDERSCORE(utime)
198#else
199F32(utime == _utime32)
200F64(utime == _utime64)
201#endif
202ADD_UNDERSCORE(write)
203
204; This is list of symbol aliases added in the Visual C++ 2.0 oldnames.lib library
205; All these symbols with leading underscore are present also in pre-2.0 CRT versions: crtdll.dll and msvcrt10.dll
206; ADD_UNDERSCORE(control87)
207#if __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__
208ADD_UNDERSCORE(fpreset)
209#else
210; ADD_UNDERSCORE(fpreset) ; Alias fpreset is set in CRT_fp10.c and CRT_fp8.c
211#endif
212ADD_UNDERSCORE(wcsdup)
213ADD_UNDERSCORE(wcsicmp)
214ADD_UNDERSCORE(wcsicoll)
215ADD_UNDERSCORE(wcslwr)
216ADD_UNDERSCORE(wcsnicmp)
217ADD_UNDERSCORE(wcsnset)
218ADD_UNDERSCORE(wcsrev)
219ADD_UNDERSCORE(wcsset)
220ADD_UNDERSCORE(wcsupr)
221
222; This is list of symbol aliases added in the Visual C++ 4.0 oldnames.lib library
223; All these symbols with leading underscore are present also in pre-4.0 CRT versions: crtdll.dll, msvcrt10.dll and msvcrt20.dll
224; ADD_UNDERSCORE(cabs)
225#ifdef UCRTBASE
226; hypot is natively exported from UCRT
227#else
228; hypot is provided by math/hypot.c as a wrapper around _hypot
229#endif
230ADD_UNDERSCORE(j0)
231ADD_UNDERSCORE(j1)
232ADD_UNDERSCORE(jn)
233ADD_UNDERSCORE(y0)
234ADD_UNDERSCORE(y1)
235ADD_UNDERSCORE(yn)
236
237; This is list of symbol aliases for C95 functions
238#ifdef WITH_GET_PUT_WCHAR_ALIASES
239getwc == fgetwc
240getwchar == _fgetwchar
241putwc == fputwc
242putwchar == _fputwchar
243#endif
244
245; This is list of symbol aliases for C99 functions
246; ADD_UNDERSCORE(logb)
247#ifdef WITH_NEXTAFTER_ALIAS
248ADD_UNDERSCORE(nextafter)
249#endif
250
251; This is list of symbol aliases for C99 ARM long double functions
252; They are defined as aliases to regular double symbols as on ARM, long double is equal to regular double
253F_LD64(acosl == acos)
254F_LD64(asinl == asin)
255F_LD64(atan2l == atan2)
256F_LD64(atanl == atan)
257F_LD64(ceill == ceil)
258F_LD64(cosl == cos)
259F_LD64(expl == exp)
260F_LD64(floorl == floor)
261F_LD64(fmodl == fmod)
262F_LD64(log10l == log10)
263F_LD64(logl == log)
264; FIXME: Why is powl alias defined only for UCRT?
265#ifdef UCRTBASE
266F_LD64(powl == pow)
267#endif
268F_LD64(sinl == sin)
269F_LD64(tanl == tan)
270F_LD64(_chgsignl == _chgsign)
271
272; This is list of symbol aliases for C11 functions
273#ifdef UCRTBASE
274F32(timespec_get == _timespec32_get)
275F64(timespec_get == _timespec64_get)
276#endif
277
278; This is list of symbol aliases for POSIX functions
279ADD_DOUBLE_UNDERSCORE(isascii)
280ADD_DOUBLE_UNDERSCORE(toascii)
281#ifndef CRTAPP
282ADD_UNDERSCORE(pclose)
283ADD_UNDERSCORE(popen)
284#endif
285fseeko == fseek
286ftello == ftell
287ftruncate == _chsize
288; ADD_UNDERSCORE(scalb)
289
290; This is list of symbol aliases for Large File Specification (extension to Single UNIX Specification)
291; https://unix.org/version2/whatsnew/lfs20mar.html#3.1 section 3.1 Transitional Extensions
292creat64 == _creat
293open64 == _open
294fopen64 == fopen
295freopen64 == freopen
296#ifndef NO_TMPFILE_ALIAS
297tmpfile64 == tmpfile
298#endif
299#ifndef NO_FPOS64_ALIASES
300; fgetpos and fsetpos are already 64-bit
301fgetpos64 == fgetpos
302fsetpos64 == fsetpos
303lseek64 == _lseeki64
304#endif
305#ifdef UCRTBASE
306fstat32 == _fstat32
307fstat32i64 == _fstat32i64
308fstat64 == _fstat64
309fstat64i32 == _fstat64i32
310stat32 == _stat32
311stat32i64 == _stat32i64
312stat64 == _stat64
313stat64i32 == _stat64i32
314#else
315; fstat for non-UCRT is provided by mingw to workaround S_IFDIR issue in _fstat
316; stat for non-UCRT is provided by mingw to workaround trailing slash issue in _stat
317#endif
318#ifdef FIXED_SIZE_SYMBOLS
319#ifdef WITH_FSEEKO64_ALIAS
320fseeko64 == _fseeki64
321#endif
322#else
323fseeko64 == _fseeki64
324ftello64 == _ftelli64
325#endif
326
327; This is list of symbol aliases for GNU functions which are not part of POSIX or ISO C
328strcasecmp == _stricmp
329strncasecmp == _strnicmp
330
331; This is list of various symbol aliases which are needed for compatibility
332; Some symbols in some version of CRT library were added and some other symbols were removed or renamed
333; This list provides some level of backward and forward compatibility
334
335#ifdef WITH_SETJMP3_ALIAS
336; crtdll.dll and msvcrt10.dll have only old _setjmp function which does not take
337; additional variadic arguments and uses smaller jmpbuf structure.
338; mingw-w64 calls _setjmp3 only with zero additional arguments and because number
339; of additional arguments is passed on the stack which is cleanup by the caller,
340; it means that the mingw-w64 usage of _setjmp3 is ABI compatible with the old
341; _setjmp function which is available also in crtdll.dll and msvcrt10.dll libs.
342; It heavily depends on the mingw-w64-headers/crt/setjmp.h implementation.
343; So this definition allows crtdll.dll and msvcrt10.dll applications to call
344; setjmp() macro from setjmp.h, which expands to _setjmp3() function call and
345; which is aliased to _setjmp symbol for crtdll.dll and msvcrt10.dll libraries.
346F_I386(_setjmp3 == _setjmp)
347#endif
348
349#ifdef UCRTBASE
350F_NON_ARM64(_setjmp == __intrinsic_setjmp)
351F64(_setjmpex == __intrinsic_setjmpex)
352#endif
353
354#ifndef NO_STRCMPI_ALIAS
355_strcmpi == _stricmp
356#endif
357
358#ifdef WITH_IOB_FUNC_ALIAS
359__iob_func == __p__iob
360#endif
361
362#ifdef WITH_TZ_ALIASES
363__daylight == __p__daylight
364#ifndef NO_DSTBIAS
365__dstbias == __p__dstbias
366#endif
367__timezone == __p__timezone
368__tzname == __p__tzname
369#endif
370
371#ifdef WITH_ATOLL_ALIAS
372atoll == _atoi64
373_wtoll == _wtoi64
374#endif
375
376#ifdef WITH_ATOLL_L_ALIAS
377_atoll_l == _atoi64_l
378_wtoll_l == _wtoi64_l
379#endif
380
381#ifdef WITH_LLABS_ALIAS
382llabs == _abs64
383imaxabs == _abs64
384#elif defined(WITH_IMAXABS_ALIAS)
385imaxabs == llabs
386#endif
387
388#ifdef WITH_IMAXDIV_ALIAS
389imaxdiv == lldiv
390#endif
391
392#ifdef WITH_STRTO64_ALIAS
393strtoll == _strtoi64
394strtoull == _strtoui64
395strtoimax == _strtoi64
396strtoumax == _strtoui64
397wcstoll == _wcstoi64
398wcstoull == _wcstoui64
399wcstoimax == _wcstoi64
400wcstoumax == _wcstoui64
401#endif
402
403#ifdef WITH_STRTO64_L_ALIAS
404_strtoll_l == _strtoi64_l
405_strtoull_l == _strtoui64_l
406_strtoimax_l == _strtoi64_l
407_strtoumax_l == _strtoui64_l
408_wcstoll_l == _wcstoi64_l
409_wcstoull_l == _wcstoui64_l
410_wcstoimax_l == _wcstoi64_l
411_wcstoumax_l == _wcstoui64_l
412#endif
413
414; This is list of find symbol aliases, every CRT library has either find symbols with SIZE suffix or without them
415#ifdef FIXED_SIZE_SYMBOLS
416F32(_findfirst32 == _findfirst)
417F64(_findfirst64i32 == _findfirst)
418#ifndef NO_I64_FIXED_SIZE
419F32(_findfirst32i64 == _findfirsti64)
420#ifndef NO_FIXED_SIZE_64_ALIAS
421F64(_findfirst64 == _findfirsti64)
422#endif
423#endif
424F32(_findnext32 == _findnext)
425F64(_findnext64i32 == _findnext)
426#ifndef NO_I64_FIXED_SIZE
427F32(_findnext32i64 == _findnexti64)
428#ifndef NO_FIXED_SIZE_64_ALIAS
429F64(_findnext64 == _findnexti64)
430#endif
431#endif
432#ifndef NO_WIDE_FIXED_SIZE
433F32(_wfindfirst32 == _wfindfirst)
434F64(_wfindfirst64i32 == _wfindfirst)
435#ifndef NO_I64_FIXED_SIZE
436F32(_wfindfirst32i64 == _wfindfirsti64)
437#ifndef NO_FIXED_SIZE_64_ALIAS
438F64(_wfindfirst64 == _wfindfirsti64)
439#endif
440#endif
441F32(_wfindnext32 == _wfindnext)
442F64(_wfindnext64i32 == _wfindnext)
443#ifndef NO_I64_FIXED_SIZE
444F32(_wfindnext32i64 == _wfindnexti64)
445#ifndef NO_FIXED_SIZE_64_ALIAS
446F64(_wfindnext64 == _wfindnexti64)
447#endif
448#endif
449#endif
450#else
451F32(_findfirst == _findfirst32)
452F64(_findfirst == _findfirst64i32)
453F32(_findfirsti64 == _findfirst32i64)
454F64(_findfirsti64 == _findfirst64)
455F32(_findnext == _findnext32)
456F64(_findnext == _findnext64i32)
457F32(_findnexti64 == _findnext32i64)
458F64(_findnexti64 == _findnext64)
459F32(_wfindfirst == _wfindfirst32)
460F64(_wfindfirst == _wfindfirst64i32)
461F32(_wfindfirsti64 == _wfindfirst32i64)
462F64(_wfindfirsti64 == _wfindfirst64)
463F32(_wfindnext == _wfindnext32)
464F64(_wfindnext == _wfindnext64i32)
465F32(_wfindnexti64 == _wfindnext32i64)
466F64(_wfindnexti64 == _wfindnext64)
467#endif
468
469; This is list of stat symbol aliases, every CRT library has either stat symbols with SIZE suffix or without them
470#ifdef FIXED_SIZE_SYMBOLS
471#ifndef CRTDLL
472F32(_fstat32 == _fstat)
473#endif
474F64(_fstat64i32 == _fstat)
475#ifndef NO_I64_FIXED_SIZE
476F32(_fstat32i64 == _fstati64)
477#ifndef NO_FIXED_SIZE_64_ALIAS
478F64(_fstat64 == _fstati64)
479#endif
480#endif
481#ifndef CRTDLL
482F32(_stat32 == _stat)
483#endif
484F64(_stat64i32 == _stat)
485#ifndef NO_I64_FIXED_SIZE
486F32(_stat32i64 == _stati64)
487#ifndef NO_FIXED_SIZE_64_ALIAS
488F64(_stat64 == _stati64)
489#endif
490#endif
491#ifndef NO_WIDE_FIXED_SIZE
492F32(_wstat32 == _wstat)
493F64(_wstat64i32 == _wstat)
494#ifndef NO_I64_FIXED_SIZE
495F32(_wstat32i64 == _wstati64)
496#ifndef NO_FIXED_SIZE_64_ALIAS
497F64(_wstat64 == _wstati64)
498#endif
499#endif
500#endif
501#else
502F32(_fstat == _fstat32)
503F64(_fstat == _fstat64i32)
504F32(_fstati64 == _fstat32i64)
505F64(_fstati64 == _fstat64)
506F32(_stat == _stat32)
507F64(_stat == _stat64i32)
508F32(_stati64 == _stat32i64)
509F64(_stati64 == _stat64)
510F32(_wstat == _wstat32)
511F64(_wstat == _wstat64i32)
512F32(_wstati64 == _wstat32i64)
513F64(_wstati64 == _wstat64)
514#endif
515
516; This is list of time symbol aliases, every CRT library except msvcrt.dll has either time symbols with SIZE suffix or without them
517#ifndef NO_TIME_ALIAS
518#ifdef FIXED_SIZE_SYMBOLS
519F32(_ctime32 == ctime)
520F64(_ctime64 == ctime)
521F32(_difftime32 == difftime)
522F64(_difftime64 == difftime)
523F32(_ftime32 == _ftime)
524F64(_ftime64 == _ftime)
525F32(_futime32 == _futime)
526F64(_futime64 == _futime)
527F32(_gmtime32 == gmtime)
528F64(_gmtime64 == gmtime)
529F32(_localtime32 == localtime)
530F64(_localtime64 == localtime)
531; Skip _mkgmtime as it is present only in msvcrt.dll
532F32(_mktime32 == mktime)
533F64(_mktime64 == mktime)
534F32(_time32 == time)
535F64(_time64 == time)
536F32(_utime32 == _utime)
537F64(_utime64 == _utime)
538#ifndef NO_WIDE_FIXED_SIZE
539F32(_wctime32 == _wctime)
540F64(_wctime64 == _wctime)
541F32(_wutime32 == _wutime)
542F64(_wutime64 == _wutime)
543#endif
544#else
545F32(ctime == _ctime32)
546F64(ctime == _ctime64)
547F32(difftime == _difftime32)
548F64(difftime == _difftime64)
549F32(_ftime == _ftime32)
550F64(_ftime == _ftime64)
551F32(_futime == _futime32)
552F64(_futime == _futime64)
553F32(gmtime == _gmtime32)
554F64(gmtime == _gmtime64)
555F32(localtime == _localtime32)
556F64(localtime == _localtime64)
557F32(_mkgmtime == _mkgmtime32)
558F64(_mkgmtime == _mkgmtime64)
559F32(mktime == _mktime32)
560F64(mktime == _mktime64)
561F32(time == _time32)
562F64(time == _time64)
563F32(_utime == _utime32)
564F64(_utime == _utime64)
565F32(_wctime == _wctime32)
566F64(_wctime == _wctime64)
567F32(_wutime == _wutime32)
568F64(_wutime == _wutime64)
569#endif
570#endif
571
572; This is list of symbols which are present in msvcrt but not in UCRT
573#ifdef UCRTBASE
574__lconv_init == __initialize_lconv_for_unsigned_char
575__set_app_type == _set_app_type
576__p__daylight == __daylight
577__p__dstbias == __dstbias
578__p__timezone == __timezone
579__p__tzname == __tzname
580_XcptFilter == _seh_filter_exe
581#endif
582
583; This is list of printf/scanf symbol aliases with __ms_ prefix
584#ifndef UCRTBASE
585__ms_fprintf == fprintf
586__ms_fscanf == fscanf
587__ms_fwprintf == fwprintf
588__ms_fwscanf == fwscanf
589__ms_printf == printf
590__ms_scanf == scanf
591__ms_sprintf == sprintf
592__ms_sscanf == sscanf
593__ms_swscanf == swscanf
594__ms_vfprintf == vfprintf
595__ms_vfwprintf == vfwprintf
596__ms_vprintf == vprintf
597__ms_vsprintf == vsprintf
598__ms_vwprintf == vwprintf
599__ms_wprintf == wprintf
600__ms_wscanf == wscanf
601#endif
602
603; This is list of additional symbol aliases not available in any library as neither native symbols nor aliases
604; FIXME: check if these really are needed
605
606; This is wstat and wstat64 symbol available only in mingw but for a long time
607#ifdef UCRTBASE
608F32(wstat == _wstat32)
609F64(wstat == _wstat64i32)
610wstat32 == _wstat32
611wstat32i64 == _wstat32i64
612wstat64 == _wstat64
613wstat64i32 == _wstat64i32
614#else
615; wstat for non-UCRT is provided by mingw to workaround trailing slash issue in _wstat
616#endif
617
618; Origin of the symbol wcscmpi is unknown. This symbol is not present in
619; crtdll.dll and neither in any msvcr* version. The only source of wcscmpi is
620; wcstr.h header file from the Microsoft Visual C++ 1.0 (32-bit for NT) and
621; Microsoft Windows NT 3.1 SDK where wcscmpi and _wcscmpi are defined as
622; macros which expand to _wcsicmp. So the raw wcscmpi is not linkable symbol
623; even in the old Visual C++ versions.
624wcscmpi == _wcsicmp
625
626; Origin of these symbols is unknown too.
627ADD_UNDERSCORE(chgsign)
628ADD_UNDERSCORE(fgetwchar)
629ADD_UNDERSCORE(finite)
630ADD_UNDERSCORE(fpclass)
631ADD_UNDERSCORE(fputwchar)
632#ifndef CRTAPP
633ADD_UNDERSCORE(heapwalk)
634#endif
635ADD_DOUBLE_UNDERSCORE(iscsymf)
636ADD_DOUBLE_UNDERSCORE(iscsym)
637#ifndef CRTAPP
638ADD_UNDERSCORE(searchenv)
639#endif
640ADD_UNDERSCORE(stricoll)
641#ifndef UCRTBASE
642ADD_UNDERSCORE(vsnprintf_s)
643#endif
644#ifndef CRTAPP
645ADD_UNDERSCORE(wpopen)
646#endif