6 #include <wchar.h> // Watcom bug: winnt.h assumes string.h defines wchar_t
8 #include "_PDCLIB_io.h"
9 #include "_PDCLIB_locale.h"
10 #include "_PDCLIB_clocale.h"
12 static char ** argvToAnsi( wchar_t ** wargv, int argc )
14 char ** argv = malloc( sizeof( *argv ) * argc );
15 for ( int i = 0; i != argc; ++i ) {
16 int sz = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_SEPCHARS,
17 wargv[i], -1, NULL, 0, NULL, NULL );
18 if(!(argv[i] = malloc(sz))) {
19 fputs("Error in C runtime initialization: "
20 "unable to allocate buffer for argument", stderr);
24 int rv = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_SEPCHARS,
25 wargv[i], -1, argv[i], sz, NULL, NULL );
28 fputs("Error in C runtime initialization: "
29 "size mismatch during character set conversion", stderr);
38 static wchar_t ** wargv;
41 static void freeArgs( void )
43 for(int i = 0; i != argc; i++) {
50 extern void (*_PDCLIB_sigfpe)( int );
51 extern void (*_PDCLIB_sigill)( int );
52 extern void (*_PDCLIB_sigsegv)( int );
54 static LPTOP_LEVEL_EXCEPTION_FILTER oldFilter;
55 static LONG CALLBACK sehExceptionFilter( EXCEPTION_POINTERS * exInfo )
58 void (*handler)( int );
60 switch( exInfo->ExceptionRecord->ExceptionCode ) {
61 case EXCEPTION_ACCESS_VIOLATION:
62 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
63 case EXCEPTION_DATATYPE_MISALIGNMENT:
64 case EXCEPTION_GUARD_PAGE:
65 case EXCEPTION_IN_PAGE_ERROR:
66 case EXCEPTION_STACK_OVERFLOW:
68 handler = _PDCLIB_sigsegv;
71 case EXCEPTION_ILLEGAL_INSTRUCTION:
72 case EXCEPTION_PRIV_INSTRUCTION:
74 handler = _PDCLIB_sigill;
77 case EXCEPTION_INT_DIVIDE_BY_ZERO:
78 case EXCEPTION_INT_OVERFLOW:
79 case EXCEPTION_FLT_DENORMAL_OPERAND:
80 case EXCEPTION_FLT_DIVIDE_BY_ZERO:
81 case EXCEPTION_FLT_INEXACT_RESULT:
82 case EXCEPTION_FLT_INVALID_OPERATION:
83 case EXCEPTION_FLT_OVERFLOW:
84 case EXCEPTION_FLT_STACK_CHECK:
85 case EXCEPTION_FLT_UNDERFLOW:
87 handler = _PDCLIB_sigfpe;
91 return oldFilter ? oldFilter( exInfo ) : EXCEPTION_EXECUTE_HANDLER;
94 if(handler == SIG_DFL) {
95 return EXCEPTION_EXECUTE_HANDLER;
96 } else if(handler == SIG_IGN) {
97 return EXCEPTION_CONTINUE_EXECUTION;
100 return EXCEPTION_CONTINUE_EXECUTION;
104 extern int main( int argc, char ** argv, char ** envp );
106 void __cdecl mainCRTStartup( void );
108 void __cdecl mainCRTStartup( void )
110 stdin->handle.pointer = GetStdHandle(STD_INPUT_HANDLE);
111 stdout->handle.pointer = GetStdHandle(STD_OUTPUT_HANDLE);
112 stderr->handle.pointer = GetStdHandle(STD_ERROR_HANDLE);
114 oldFilter = SetUnhandledExceptionFilter( sehExceptionFilter );
116 cl = GetCommandLineW();
117 wargv = CommandLineToArgvW(cl, &argc);
118 argv = argvToAnsi(wargv, argc);
120 _PDCLIB_initclocale( &_PDCLIB_global_locale );
122 if(tss_create(&_PDCLIB_locale_tss, (tss_dtor_t) freelocale)
124 fputs( "Error during C runtime initialization: "
125 "Unable to allocate locale TLS", stderr );
126 exit( EXIT_FAILURE );
129 if( mtx_init(&stdin->lock, mtx_recursive) != thrd_success
130 || mtx_init(&stdout->lock, mtx_recursive) != thrd_success
131 || mtx_init(&stderr->lock, mtx_recursive) != thrd_success ) {
132 fputs( "Error during C runtime initialization: "
133 "Unable to allocate stdio mutex", stderr );
134 exit( EXIT_FAILURE );
139 int exitStatus = main(argc, argv, NULL);