]> pd.if.org Git - pdclib/blobdiff - platform/win32/crt0.c
dos2unix
[pdclib] / platform / win32 / crt0.c
index 471e42c094fb199b39549dcc3911e4e649537e17..8cbb2c549360a199ae6f48760824834b149392f9 100644 (file)
-#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
-#include "_PDCLIB_io.h"\r
-#include "_PDCLIB_locale.h"\r
-#include "_PDCLIB_clocale.h"\r
-\r
-static char ** argvToAnsi( wchar_t ** wargv, int argc )\r
-{\r
-    char ** argv = malloc( sizeof( *argv ) * argc );\r
-    for ( int i = 0; i != argc; ++i ) {\r
-        int sz = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_SEPCHARS,\r
-                                      wargv[i], -1, NULL, 0, NULL, NULL );\r
-        if(!(argv[i] = malloc(sz))) {\r
-            fputs("Error in C runtime initialization: "\r
-                  "unable to allocate buffer for argument", stderr);\r
-            abort();\r
-        }\r
-\r
-        int rv = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_SEPCHARS,\r
-                                      wargv[i], -1, argv[i], sz, NULL, NULL );\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
-}\r
-\r
-static int        argc;\r
-static wchar_t *  cl;\r
-static wchar_t ** wargv;\r
-static char    ** argv;\r
-\r
-static void freeArgs( void )\r
-{\r
-    for(int i = 0; i != argc; i++) {\r
-        free( argv[i] );\r
-    }\r
-    free( 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
-\r
-void __cdecl mainCRTStartup( void );\r
-\r
-void __cdecl mainCRTStartup( void ) \r
-{\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
-    _PDCLIB_initclocale( &_PDCLIB_global_locale );\r
-\r
-    if(tss_create(&_PDCLIB_locale_tss, (tss_dtor_t) freelocale) \r
-            != thrd_success) {\r
-        fputs( "Error during C runtime initialization: "\r
-               "Unable to allocate locale TLS", stderr );\r
-        exit( EXIT_FAILURE );\r
-    }\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
-        exit( EXIT_FAILURE );\r
-    }\r
-\r
-    atexit(freeArgs);\r
-\r
-    int exitStatus = main(argc, argv, NULL);\r
-\r
-    exit(exitStatus);\r
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <signal.h>
+#include <threads.h>
+#include <wchar.h> // Watcom bug: winnt.h assumes string.h defines wchar_t
+#include <windows.h>
+#include "_PDCLIB_io.h"
+#include "_PDCLIB_locale.h"
+#include "_PDCLIB_clocale.h"
+
+static char ** argvToAnsi( wchar_t ** wargv, int argc )
+{
+    char ** argv = malloc( sizeof( *argv ) * argc );
+    for ( int i = 0; i != argc; ++i ) {
+        int sz = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_SEPCHARS,
+                                      wargv[i], -1, NULL, 0, NULL, NULL );
+        if(!(argv[i] = malloc(sz))) {
+            fputs("Error in C runtime initialization: "
+                  "unable to allocate buffer for argument", stderr);
+            abort();
+        }
+
+        int rv = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_SEPCHARS,
+                                      wargv[i], -1, argv[i], sz, NULL, NULL );
+
+        if(rv != sz) {
+            fputs("Error in C runtime initialization: "
+                  "size mismatch during character set conversion", stderr);
+            abort();
+        }
+    }
+    return argv;
+}
+
+static int        argc;
+static wchar_t *  cl;
+static wchar_t ** wargv;
+static char    ** argv;
+
+static void freeArgs( void )
+{
+    for(int i = 0; i != argc; i++) {
+        free( argv[i] );
+    }
+    free( argv );
+    LocalFree( wargv );
+}
+
+extern void (*_PDCLIB_sigfpe)( int );
+extern void (*_PDCLIB_sigill)( int );
+extern void (*_PDCLIB_sigsegv)( int );
+
+static LPTOP_LEVEL_EXCEPTION_FILTER oldFilter;
+static LONG CALLBACK sehExceptionFilter( EXCEPTION_POINTERS * exInfo )
+{
+    int sig;
+    void (*handler)( int );
+
+    switch( exInfo->ExceptionRecord->ExceptionCode ) {
+        case EXCEPTION_ACCESS_VIOLATION:
+        case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+        case EXCEPTION_DATATYPE_MISALIGNMENT:
+        case EXCEPTION_GUARD_PAGE:
+        case EXCEPTION_IN_PAGE_ERROR:
+        case EXCEPTION_STACK_OVERFLOW:
+            sig = SIGSEGV;
+            handler = _PDCLIB_sigsegv;
+            break;
+
+        case EXCEPTION_ILLEGAL_INSTRUCTION:
+        case EXCEPTION_PRIV_INSTRUCTION:
+            sig = SIGILL;
+            handler = _PDCLIB_sigill;
+            break;
+
+        case EXCEPTION_INT_DIVIDE_BY_ZERO:
+        case EXCEPTION_INT_OVERFLOW:
+        case EXCEPTION_FLT_DENORMAL_OPERAND:
+        case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+        case EXCEPTION_FLT_INEXACT_RESULT:
+        case EXCEPTION_FLT_INVALID_OPERATION:
+        case EXCEPTION_FLT_OVERFLOW:
+        case EXCEPTION_FLT_STACK_CHECK:
+        case EXCEPTION_FLT_UNDERFLOW:
+            sig = SIGFPE;
+            handler = _PDCLIB_sigfpe;
+            break;
+
+        default:
+            return oldFilter ? oldFilter( exInfo ) : EXCEPTION_EXECUTE_HANDLER;
+    }
+
+    if(handler == SIG_DFL) {
+        return EXCEPTION_EXECUTE_HANDLER;
+    } else if(handler == SIG_IGN) {
+        return EXCEPTION_CONTINUE_EXECUTION;
+    } else {
+        handler( sig );
+        return EXCEPTION_CONTINUE_EXECUTION;
+    }
+}
+
+extern int main( int argc, char ** argv, char ** envp );
+
+void __cdecl mainCRTStartup( void );
+
+void __cdecl mainCRTStartup( void ) 
+{
+    stdin->handle.pointer  = GetStdHandle(STD_INPUT_HANDLE);
+    stdout->handle.pointer = GetStdHandle(STD_OUTPUT_HANDLE);
+    stderr->handle.pointer = GetStdHandle(STD_ERROR_HANDLE);
+
+    oldFilter = SetUnhandledExceptionFilter( sehExceptionFilter );
+
+    cl    = GetCommandLineW();
+    wargv = CommandLineToArgvW(cl, &argc);
+    argv  = argvToAnsi(wargv, argc);
+
+    _PDCLIB_initclocale( &_PDCLIB_global_locale );
+
+    if(tss_create(&_PDCLIB_locale_tss, (tss_dtor_t) freelocale) 
+            != thrd_success) {
+        fputs( "Error during C runtime initialization: "
+               "Unable to allocate locale TLS", stderr );
+        exit( EXIT_FAILURE );
+    }
+
+    if(        mtx_init(&stdin->lock, mtx_recursive) != thrd_success 
+            || mtx_init(&stdout->lock, mtx_recursive) != thrd_success
+            || mtx_init(&stderr->lock, mtx_recursive) != thrd_success ) {
+        fputs( "Error during C runtime initialization: "
+            "Unable to allocate stdio mutex", stderr );
+        exit( EXIT_FAILURE );
+    }
+
+    atexit(freeArgs);
+
+    int exitStatus = main(argc, argv, NULL);
+
+    exit(exitStatus);
 }
\ No newline at end of file