diff options
| author | YX Hao <lifenjoiner@163.com> | 2017-02-15 21:58:35 +0800 |
|---|---|---|
| committer | YX Hao <lifenjoiner@163.com> | 2017-02-17 21:09:26 +0800 |
| commit | 86e3cd0c5ac9d6e8e80306f9f5fdcce4a4c38dc5 (patch) | |
| tree | eba8a96a4d75747281e3f937167ec8f7ebff5540 /win32/lib/wincrt1.c | |
| parent | f33801e25e7ea54cf46e2892df1550148604d559 (diff) | |
| download | tinycc-86e3cd0c5ac9d6e8e80306f9f5fdcce4a4c38dc5.tar.gz tinycc-86e3cd0c5ac9d6e8e80306f9f5fdcce4a4c38dc5.tar.bz2 | |
Add support for Unicode entries 'wmain' and 'wWinMain' on Windows
'-run' suported. argvs are converted.
But don't use compliled Unicode CLI exe-file to get inputs interactively in other codepage!
Please add other compliling supports than 'build-tcc.bat' (Who is good at them).
Diffstat (limited to 'win32/lib/wincrt1.c')
| -rw-r--r-- | win32/lib/wincrt1.c | 59 |
1 files changed, 44 insertions, 15 deletions
diff --git a/win32/lib/wincrt1.c b/win32/lib/wincrt1.c index 663fd33..06f42f0 100644 --- a/win32/lib/wincrt1.c +++ b/win32/lib/wincrt1.c @@ -1,5 +1,8 @@ //+--------------------------------------------------------------------------- +// _UNICODE for tchar.h, UNICODE for API +#include <tchar.h> + #include <windows.h> #include <stdlib.h> @@ -9,10 +12,28 @@ void __set_app_type(int); void _controlfp(unsigned a, unsigned b); -int _winstart(void) +#ifdef _UNICODE +#define __tgetmainargs __wgetmainargs +#define _twinstart _wwinstart +#define _runtwinmain _runwwinmain +int APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int); +#else +#define __tgetmainargs __getmainargs +#define _twinstart _winstart +#define _runtwinmain _runwinmain +#endif + +typedef struct +{ + int newmode; +} _startupinfo; // CLI Vs GUI + +int __cdecl __tgetmainargs(int *pargc, _TCHAR ***pargv, _TCHAR ***penv, int globb, _startupinfo*); + +int _twinstart(void) { __TRY__ - char *szCmd; + _TCHAR *szCmd; STARTUPINFO startinfo; int fShow; int ret; @@ -22,19 +43,19 @@ int _winstart(void) szCmd = GetCommandLine(); if (szCmd) { - while (' ' == *szCmd) + while (__T(' ') == *szCmd) szCmd++; - if ('\"' == *szCmd) { + if (__T('\"') == *szCmd) { while (*++szCmd) - if ('\"' == *szCmd) { + if (__T('\"') == *szCmd) { szCmd++; break; } } else { - while (*szCmd && ' ' != *szCmd) + while (*szCmd && __T(' ') != *szCmd) szCmd++; } - while (' ' == *szCmd) + while (__T(' ') == *szCmd) szCmd++; } @@ -43,22 +64,30 @@ int _winstart(void) if (0 == (startinfo.dwFlags & STARTF_USESHOWWINDOW)) fShow = SW_SHOWDEFAULT; - ret = WinMain(GetModuleHandle(NULL), NULL, szCmd, fShow); + ret = _tWinMain(GetModuleHandle(NULL), NULL, szCmd, fShow); exit(ret); } -int _runwinmain(int argc, char **argv) +int _runtwinmain(int argc0, /* as tcc passed in */ char **argv0) { - char *szCmd, *p; + _TCHAR *szCmd, *p; + + int argc; + _TCHAR **argv; + _TCHAR **env; + _startupinfo start_info; + + start_info.newmode = 0; + __tgetmainargs(&argc, &argv, &env, 0, &start_info); p = GetCommandLine(); szCmd = NULL; - if (argc > 1) - szCmd = strstr(p, argv[1]); + if (argc0 > 1) + szCmd = _tcsstr(p, argv[argc - argc0 + 1]); if (NULL == szCmd) - szCmd = ""; - else if (szCmd > p && szCmd[-1] == '\"') + szCmd = __T(""); + else if (szCmd > p && szCmd[-1] == __T('\"')) --szCmd; _controlfp(0x10000, 0x30000); - return WinMain(GetModuleHandle(NULL), NULL, szCmd, SW_SHOWDEFAULT); + return _tWinMain(GetModuleHandle(NULL), NULL, szCmd, SW_SHOWDEFAULT); } |
