# HG changeset patch
# User Alexander De Sousa <aphanic@hotmail.com>
# Date 1408211220 -7200
#      Sat Aug 16 19:47:00 2014 +0200
# Node ID 59a07c85e37afb8edb6366647bc3f8eb7dcdc99a
# Parent  43af69c7eec0898a94acc77bea6f97a409feb1fc
Windows: Add Unicode startup code to libtcc.

diff -r 43af69c7eec0 -r 59a07c85e37a win32/lib/crt1.c
--- a/win32/lib/crt1.c	Mon Jul 07 19:00:02 2014 +0200
+++ b/win32/lib/crt1.c	Sat Aug 16 19:47:00 2014 +0200
@@ -2,6 +2,8 @@
 // crt1.c
 
 #include <stdlib.h>
+#include <tchar.h>
+#include <windows.h>
 
 #define __UNKNOWN_APP    0
 #define __CONSOLE_APP    1
@@ -14,26 +16,35 @@
     int newmode;
 } _startupinfo;
 
-int __getmainargs(int *pargc, char ***pargv, char ***penv, int globb, _startupinfo*);
-int main(int argc, char **argv, char **env);
+#ifdef _UNICODE
+   int __wgetmainargs(int *pargc, wchar_t ***pargv, wchar_t ***penv, int globb, _startupinfo *);
+   int wmain(int argc, wchar_t *argv[], wchar_t *envp[]);
+   #define _tstart _wstart
+   #define __tgetmainargs __wgetmainargs
+#else
+   int __getmainargs(int *pargc, char ***pargv, char ***penv, int globb, _startupinfo *);
+   int main(int argc, char *argv[], char *env[]);
+   #define _tstart _start
+   #define __tgetmainargs __getmainargs
+#endif
 
-int _start(void)
+int _tstart(void)
 {
     __TRY__
-    int argc; char **argv; char **env;
+    int argc; _TCHAR **argv; _TCHAR **env;
     _startupinfo start_info = {0};
 
     _controlfp(0x10000, 0x30000);
     __set_app_type(__CONSOLE_APP);
 
-    if (! __getmainargs(&argc, &argv, &env, 0, &start_info))
+    if (! __tgetmainargs(&argc, &argv, &env, 0, &start_info))
     {
         int ret;
 
-        ret = main(argc, argv, env);
+        ret = _tmain(argc, argv, env);
         exit(ret);
     }
-    // __getmainargs failed because possible few memory on the heap.
+    // __getmainargs possibly failed because of not enough memory in heap.
     // end with exit code of 3, similar to abort()
     ExitProcess(3);
 }
diff -r 43af69c7eec0 -r 59a07c85e37a win32/lib/wincrt1.c
--- a/win32/lib/wincrt1.c	Mon Jul 07 19:00:02 2014 +0200
+++ b/win32/lib/wincrt1.c	Sat Aug 16 19:47:00 2014 +0200
@@ -2,6 +2,7 @@
 
 #include <windows.h>
 #include <stdlib.h>
+#include <tchar.h>
 
 #define __UNKNOWN_APP    0
 #define __CONSOLE_APP    1
@@ -9,10 +10,18 @@
 void __set_app_type(int);
 void _controlfp(unsigned a, unsigned b);
 
-int _winstart(void)
+#ifdef _UNICODE
+   int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
+   #define _twinstart _wwinstart
+#else
+   int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow);
+   #define _twinstart _winstart
+#endif
+
+int _twinstart(void)
 {
     __TRY__
-    char *szCmd;
+    _TCHAR *szCmd;
     STARTUPINFO startinfo;
     int fShow;
     int ret;
@@ -43,10 +52,12 @@
     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);
 }
 
+#ifndef _UNICODE // Running Unicode builds directly is not supported.
+
 int _runwinmain(int argc, char **argv)
 {
     char *szCmd, *p;
@@ -62,3 +73,5 @@
     _controlfp(0x10000, 0x30000);
     return WinMain(GetModuleHandle(NULL), NULL, szCmd, SW_SHOWDEFAULT);
 }
+
+#endif
\ No newline at end of file
