-#include <windows.h>\r
#include <string.h>\r
#include <stdlib.h>\r
#include <stdio.h>\r
+#include <signal.h>\r
+#include <threads.h>\r
+#include <wchar.h> // Watcom bug: winnt.h assumes string.h defines wchar_t\r
+#include <windows.h>\r
\r
static char ** argvToAnsi( wchar_t ** wargv, int argc )\r
{\r
if(rv != sz) {\r
fputs("Error in C runtime initialization: "\r
"size mismatch during character set conversion", stderr);\r
+ abort();\r
}\r
}\r
return argv;\r
LocalFree( wargv );\r
}\r
\r
+extern void (*_PDCLIB_sigfpe)( int );\r
+extern void (*_PDCLIB_sigill)( int );\r
+extern void (*_PDCLIB_sigsegv)( int );\r
+\r
+static LPTOP_LEVEL_EXCEPTION_FILTER oldFilter;\r
+static LONG CALLBACK sehExceptionFilter( EXCEPTION_POINTERS * exInfo )\r
+{\r
+ int sig;\r
+ void (*handler)( int );\r
+\r
+ switch( exInfo->ExceptionRecord->ExceptionCode ) {\r
+ case EXCEPTION_ACCESS_VIOLATION:\r
+ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:\r
+ case EXCEPTION_DATATYPE_MISALIGNMENT:\r
+ case EXCEPTION_GUARD_PAGE:\r
+ case EXCEPTION_IN_PAGE_ERROR:\r
+ case EXCEPTION_STACK_OVERFLOW:\r
+ sig = SIGSEGV;\r
+ handler = _PDCLIB_sigsegv;\r
+ break;\r
+\r
+ case EXCEPTION_ILLEGAL_INSTRUCTION:\r
+ case EXCEPTION_PRIV_INSTRUCTION:\r
+ sig = SIGILL;\r
+ handler = _PDCLIB_sigill;\r
+ break;\r
+\r
+ case EXCEPTION_INT_DIVIDE_BY_ZERO:\r
+ case EXCEPTION_INT_OVERFLOW:\r
+ case EXCEPTION_FLT_DENORMAL_OPERAND:\r
+ case EXCEPTION_FLT_DIVIDE_BY_ZERO:\r
+ case EXCEPTION_FLT_INEXACT_RESULT:\r
+ case EXCEPTION_FLT_INVALID_OPERATION:\r
+ case EXCEPTION_FLT_OVERFLOW:\r
+ case EXCEPTION_FLT_STACK_CHECK:\r
+ case EXCEPTION_FLT_UNDERFLOW:\r
+ sig = SIGFPE;\r
+ handler = _PDCLIB_sigfpe;\r
+ break;\r
+\r
+ default:\r
+ return oldFilter ? oldFilter( exInfo ) : EXCEPTION_EXECUTE_HANDLER;\r
+ }\r
+\r
+ if(handler == SIG_DFL) {\r
+ return EXCEPTION_EXECUTE_HANDLER;\r
+ } else if(handler == SIG_IGN) {\r
+ return EXCEPTION_CONTINUE_EXECUTION;\r
+ } else {\r
+ handler( sig );\r
+ return EXCEPTION_CONTINUE_EXECUTION;\r
+ }\r
+}\r
+\r
extern int main( int argc, char ** argv, char ** envp );\r
-_PDCLIB_noreturn void mainCRTStartup( void ) \r
+\r
+void __cdecl mainCRTStartup( void );\r
+\r
+void __cdecl mainCRTStartup( void ) \r
{\r
- stdin->handle = GetStdHandle(STD_INPUT_HANDLE);\r
- stdout->handle = GetStdHandle(STD_OUTPUT_HANDLE);\r
- stderr->handle = GetStdHandle(STD_ERROR_HANDLE);\r
+ stdin->handle.pointer = GetStdHandle(STD_INPUT_HANDLE);\r
+ stdout->handle.pointer = GetStdHandle(STD_OUTPUT_HANDLE);\r
+ stderr->handle.pointer = GetStdHandle(STD_ERROR_HANDLE);\r
+\r
+ oldFilter = SetUnhandledExceptionFilter( sehExceptionFilter );\r
\r
cl = GetCommandLineW();\r
wargv = CommandLineToArgvW(cl, &argc);\r
argv = argvToAnsi(wargv, argc);\r
+\r
+ if( mtx_init(&stdin->lock, mtx_recursive) != thrd_success \r
+ || mtx_init(&stdout->lock, mtx_recursive) != thrd_success\r
+ || mtx_init(&stderr->lock, mtx_recursive) != thrd_success ) {\r
+ fputs( "Error during C runtime initialization: "\r
+ "Unable to allocate stdio mutex", stderr );\r
+ }\r
+\r
atexit(freeArgs);\r
\r
int exitStatus = main(argc, argv, NULL);\r
+\r
exit(exitStatus);\r
-}\r
+}
\ No newline at end of file