]> pd.if.org Git - pdclib/blob - platform/win32/crt0.c
Initial pass at a port to win32
[pdclib] / platform / win32 / crt0.c
1 #include <windows.h>\r
2 #include <string.h>\r
3 #include <stdlib.h>\r
4 #include <stdio.h>\r
5 \r
6 static char ** argvToAnsi( wchar_t ** wargv, int argc )\r
7 {\r
8     char ** argv = malloc( sizeof( *argv ) * argc );\r
9     for ( int i = 0; i != argc; ++i ) {\r
10         int sz = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_SEPCHARS,\r
11                                       wargv[i], -1, NULL, 0, NULL, NULL );\r
12         if(!(argv[i] = malloc(sz))) {\r
13             fputs("Error in C runtime initialization: "\r
14                   "unable to allocate buffer for argument", stderr);\r
15             abort();\r
16         }\r
17 \r
18         int rv = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_SEPCHARS,\r
19                                       wargv[i], -1, argv[i], sz, NULL, NULL );\r
20 \r
21         if(rv != sz) {\r
22             fputs("Error in C runtime initialization: "\r
23                   "size mismatch during character set conversion", stderr);\r
24         }\r
25     }\r
26     return argv;\r
27 }\r
28 \r
29 static int        argc;\r
30 static wchar_t *  cl;\r
31 static wchar_t ** wargv;\r
32 static char    ** argv;\r
33 \r
34 static void freeArgs( void )\r
35 {\r
36     for(int i = 0; i != argc; i++) {\r
37         free( argv[i] );\r
38     }\r
39     free( argv );\r
40     LocalFree( wargv );\r
41 }\r
42 \r
43 extern int main( int argc, char ** argv, char ** envp );\r
44 _PDCLIB_noreturn void mainCRTStartup( void ) \r
45 {\r
46     stdin->handle  = GetStdHandle(STD_INPUT_HANDLE);\r
47     stdout->handle = GetStdHandle(STD_OUTPUT_HANDLE);\r
48     stderr->handle = GetStdHandle(STD_ERROR_HANDLE);\r
49 \r
50     cl    = GetCommandLineW();\r
51     wargv = CommandLineToArgvW(cl, &argc);\r
52     argv  = argvToAnsi(wargv, argc);\r
53     atexit(freeArgs);\r
54 \r
55     int exitStatus = main(argc, argv, NULL);\r
56     exit(exitStatus);\r
57 }\r