]> pd.if.org Git - pdclib/blobdiff - platform/win32/crt0.c
PDCLIB-1 (PDCLIB-3) Make wide character classification/collation information locale...
[pdclib] / platform / win32 / crt0.c
index 5fb49552f56915eaf878f0b30d61dc8596ab4b37..533ee98b862785cb6cabaee6be391629bf7bedd6 100644 (file)
@@ -2,8 +2,12 @@
 #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
@@ -23,6 +27,7 @@ static char ** argvToAnsi( wchar_t ** wargv, int argc )
         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
@@ -102,15 +107,33 @@ void __cdecl mainCRTStartup( void );
 \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
+    _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