]> pd.if.org Git - pdclib/blobdiff - platform/win32/crt0.c
Initial pass at a port to win32
[pdclib] / platform / win32 / crt0.c
diff --git a/platform/win32/crt0.c b/platform/win32/crt0.c
new file mode 100644 (file)
index 0000000..fcdee08
--- /dev/null
@@ -0,0 +1,57 @@
+#include <windows.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+#include <stdio.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
+        }\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 int main( int argc, char ** argv, char ** envp );\r
+_PDCLIB_noreturn void 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
+\r
+    cl    = GetCommandLineW();\r
+    wargv = CommandLineToArgvW(cl, &argc);\r
+    argv  = argvToAnsi(wargv, argc);\r
+    atexit(freeArgs);\r
+\r
+    int exitStatus = main(argc, argv, NULL);\r
+    exit(exitStatus);\r
+}\r