aboutsummaryrefslogtreecommitdiff
path: root/tinycc/win32/lib/crt1.c
diff options
context:
space:
mode:
authorUneven Prankster <unevenprankster@protonmail.com>2023-07-12 13:22:29 -0300
committerUneven Prankster <unevenprankster@protonmail.com>2023-07-12 13:22:29 -0300
commitfa2bdd711212ba6b7a94a20971e8bfa281e73296 (patch)
tree6713b3c0379507d49558287b71dd360ce188a2f0 /tinycc/win32/lib/crt1.c
lol
Diffstat (limited to 'tinycc/win32/lib/crt1.c')
-rw-r--r--tinycc/win32/lib/crt1.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/tinycc/win32/lib/crt1.c b/tinycc/win32/lib/crt1.c
new file mode 100644
index 0000000..0686302
--- /dev/null
+++ b/tinycc/win32/lib/crt1.c
@@ -0,0 +1,95 @@
+// =============================================
+// crt1.c
+
+// _UNICODE for tchar.h, UNICODE for API
+#include <tchar.h>
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define _UNKNOWN_APP 0
+#define _CONSOLE_APP 1
+#define _GUI_APP 2
+
+#define _MCW_PC 0x00030000 // Precision Control
+#define _PC_24 0x00020000 // 24 bits
+#define _PC_53 0x00010000 // 53 bits
+#define _PC_64 0x00000000 // 64 bits
+
+#ifdef _UNICODE
+#define __tgetmainargs __wgetmainargs
+#define _tstart _wstart
+#define _tmain wmain
+#define _runtmain _runwmain
+#else
+#define __tgetmainargs __getmainargs
+#define _tstart _start
+#define _tmain main
+#define _runtmain _runmain
+#endif
+
+typedef struct { int newmode; } _startupinfo;
+int __cdecl __tgetmainargs(int *pargc, _TCHAR ***pargv, _TCHAR ***penv, int globb, _startupinfo*);
+void __cdecl __set_app_type(int apptype);
+unsigned int __cdecl _controlfp(unsigned int new_value, unsigned int mask);
+extern int _tmain(int argc, _TCHAR * argv[], _TCHAR * env[]);
+
+#include "crtinit.c"
+
+static int do_main (int argc, _TCHAR * argv[], _TCHAR * env[])
+{
+ int retval;
+ run_ctors(argc, argv, env);
+ retval = _tmain(__argc, __targv, _tenviron);
+ run_dtors();
+ return retval;
+}
+
+/* Allow command-line globbing with "int _dowildcard = 1;" in the user source */
+int _dowildcard;
+
+static LONG WINAPI catch_sig(EXCEPTION_POINTERS *ex)
+{
+ return _XcptFilter(ex->ExceptionRecord->ExceptionCode, ex);
+}
+
+void _tstart(void)
+{
+ _startupinfo start_info = {0};
+ SetUnhandledExceptionFilter(catch_sig);
+ // Sets the current application type
+ __set_app_type(_CONSOLE_APP);
+
+ // Set default FP precision to 53 bits (8-byte double)
+ // _MCW_PC (Precision control) is not supported on ARM
+#if defined __i386__ || defined __x86_64__
+ _controlfp(_PC_53, _MCW_PC);
+#endif
+
+ __tgetmainargs( &__argc, &__targv, &_tenviron, _dowildcard, &start_info);
+ exit(do_main(__argc, __targv, _tenviron));
+}
+
+int _runtmain(int argc, /* as tcc passed in */ char **argv)
+{
+#ifdef UNICODE
+ _startupinfo start_info = {0};
+
+ __tgetmainargs(&__argc, &__targv, &_tenviron, _dowildcard, &start_info);
+ /* may be wrong when tcc has received wildcards (*.c) */
+ if (argc < __argc) {
+ __targv += __argc - argc;
+ __argc = argc;
+ }
+#else
+ __argc = argc;
+ __targv = argv;
+#endif
+#if defined __i386__ || defined __x86_64__
+ _controlfp(_PC_53, _MCW_PC);
+#endif
+ return _tmain(__argc, __targv, _tenviron);
+}
+
+// =============================================