Unified · Split
| @@ -16,28 +16,32 @@ typedef struct · 15 unmodified lines | |||
| 16 | int newmode; | 16 | int newmode; |
| 17 | } _startupinfo; | 17 | } _startupinfo; |
| 18 | 18 | ||
| 19 | int __getmainargs(int *pargc, char ***pargv, char ***penv, int globb, _startupinfo*); | 19 | // prototype of __getmainargs: |
| 20 | // in msvcrt v6.0 : return void | ||
| 21 | // in msvcrt v7.0 : return int | ||
| 22 | // using first for compatibility | ||
| 23 | void __getmainargs(int *pargc, char ***pargv, char ***penv, int globb, _startupinfo*); | ||
| 20 | int main(int argc, char **argv, char **env); | 24 | int main(int argc, char **argv, char **env); |
| 21 | 25 | ||
| 22 | int _start(void) | 26 | int _start(void) |
| 23 | { | 27 | { |
| 24 | __TRY__ | 28 | __TRY__ |
| 25 | int argc; char **argv; char **env; | 29 | int argc; char **argv; char **env; int ret; |
| 26 | _startupinfo start_info = {0}; | 30 | _startupinfo start_info = {0}; |
| 27 | 31 | ||
| 28 | _controlfp(0x10000, 0x30000); | 32 | _controlfp(0x10000, 0x30000); |
| 29 | __set_app_type(__CONSOLE_APP); | 33 | __set_app_type(__CONSOLE_APP); |
| 30 | 34 | ||
| 31 | if (! __getmainargs(&argc, &argv, &env, 0, &start_info)) | 35 | argv = NULL; |
| 36 | __getmainargs(&argc, &argv, &env, 0, &start_info); | ||
| 37 | // check success comparing if argv now is not NULL | ||
| 38 | if (! argv) | ||
| 32 | { | 39 | { |
| 33 | int ret; | 40 | ExitProcess(-1); |
| 34 | |||
| 35 | ret = main(argc, argv, env); | ||
| 36 | exit(ret); | ||
| 37 | } | 41 | } |
| 38 | // __getmainargs failed because possible few memory on the heap. | 42 | |
| 39 | // end with exit code of 3, similar to abort() | 43 | ret = main(argc, argv, env); |
| 40 | ExitProcess(3); | 44 | exit(ret); |
| 41 | } | 45 | } |
| 42 | 46 | ||
| 43 | // ============================================= | 47 | // ============================================= |