aboutsummaryrefslogtreecommitdiff
path: root/win32/lib/wincrt1.c
blob: 83e2f746b04263f89f377a068f005e2d25f8efa0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//+---------------------------------------------------------------------------

// _UNICODE for tchar.h, UNICODE for API
#include <tchar.h>

#include <windows.h>
#include <stdlib.h>

#define __UNKNOWN_APP    0
#define __CONSOLE_APP    1
#define __GUI_APP        2
void __set_app_type(int);
void _controlfp(unsigned a, unsigned b);

#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__
    _TCHAR *szCmd, *p;
    STARTUPINFO startinfo;
    _startupinfo start_info_con = {0};
    int fShow;
    int ret;

    __set_app_type(__GUI_APP);
    _controlfp(0x10000, 0x30000);

    start_info_con.newmode = 0;
    __tgetmainargs(&__argc, &__targv, &_tenviron, 0, &start_info_con);

    p = GetCommandLine();
    if (__argc > 1)
        szCmd = _tcsstr(p, __targv[1]);
    if (NULL == szCmd)
        szCmd = __T("");
    else if (szCmd > p && szCmd[-1] == __T('\"'))
        --szCmd;

    GetStartupInfo(&startinfo);
    fShow = startinfo.wShowWindow;
    if (0 == (startinfo.dwFlags & STARTF_USESHOWWINDOW))
        fShow = SW_SHOWDEFAULT;

    ret = _tWinMain(GetModuleHandle(NULL), NULL, szCmd, fShow);
    exit(ret);
}

int _runtwinmain(int argc, /* as tcc passed in */ char **argv)
{
    _TCHAR *szCmd, *p;

#ifdef UNICODE
    _startupinfo start_info = {0};

    __tgetmainargs(&__argc, &__targv, &_tenviron, 0, &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

    p = GetCommandLine();
    szCmd = NULL;
    if (argc > 1)
        szCmd = _tcsstr(p, __targv[1]);
    if (NULL == szCmd)
        szCmd = __T("");
    else if (szCmd > p && szCmd[-1] == __T('\"'))
        --szCmd;
    _controlfp(0x10000, 0x30000);
    return _tWinMain(GetModuleHandle(NULL), NULL, szCmd, SW_SHOWDEFAULT);
}