aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Python/frozenmain.c
blob: c7da481601b29ad15b8eb93fa2e0e56011f42025 (plain) (blame)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
 
/* Python interpreter main program for frozen scripts */ 
 
#include "Python.h" 
#include "pycore_runtime.h"  // _PyRuntime_Initialize()
#include <locale.h> 
 
#ifdef MS_WINDOWS 
extern void PyWinFreeze_ExeInit(void); 
extern void PyWinFreeze_ExeTerm(void); 
extern int PyInitFrozenExtensions(void); 
#endif 
 
/* Main program */ 
 
int 
Py_FrozenMain(int argc, char **argv) 
{ 
    PyStatus status = _PyRuntime_Initialize();
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    } 
 
    const char *p; 
    int i, n, sts = 1; 
    int inspect = 0; 
    int unbuffered = 0; 
    char *oldloc = NULL; 
    wchar_t **argv_copy = NULL; 
    /* We need a second copies, as Python might modify the first one. */ 
    wchar_t **argv_copy2 = NULL; 
 
    if (argc > 0) { 
        argv_copy = PyMem_RawMalloc(sizeof(wchar_t*) * argc); 
        argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*) * argc); 
        if (!argv_copy || !argv_copy2) { 
            fprintf(stderr, "out of memory\n"); 
            goto error; 
        } 
    } 
 
    PyConfig config;
    PyConfig_InitPythonConfig(&config);
    config.pathconfig_warnings = 0;   /* Suppress errors from getpath.c */
 
    if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') 
        inspect = 1; 
    if ((p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') 
        unbuffered = 1; 
 
    if (unbuffered) { 
        setbuf(stdin, (char *)NULL); 
        setbuf(stdout, (char *)NULL); 
        setbuf(stderr, (char *)NULL); 
    } 
 
    oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL)); 
    if (!oldloc) { 
        fprintf(stderr, "out of memory\n"); 
        goto error; 
    } 
 
    setlocale(LC_ALL, ""); 
    for (i = 0; i < argc; i++) { 
        argv_copy[i] = Py_DecodeLocale(argv[i], NULL); 
        argv_copy2[i] = argv_copy[i]; 
        if (!argv_copy[i]) { 
            fprintf(stderr, "Unable to decode the command line argument #%i\n", 
                            i + 1); 
            argc = i; 
            goto error; 
        } 
    } 
    setlocale(LC_ALL, oldloc); 
    PyMem_RawFree(oldloc); 
    oldloc = NULL; 
 
#ifdef MS_WINDOWS 
    PyInitFrozenExtensions(); 
#endif /* MS_WINDOWS */ 
    if (argc >= 1) 
        Py_SetProgramName(argv_copy[0]); 

    status = Py_InitializeFromConfig(&config);
    PyConfig_Clear(&config);
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }

#ifdef MS_WINDOWS 
    PyWinFreeze_ExeInit(); 
#endif 
 
    if (Py_VerboseFlag) 
        fprintf(stderr, "Python %s\n%s\n", 
            Py_GetVersion(), Py_GetCopyright()); 
 
    PySys_SetArgv(argc, argv_copy); 
 
    n = PyImport_ImportFrozenModule("__main__"); 
    if (n == 0) 
        Py_FatalError("the __main__ module is not frozen");
    if (n < 0) { 
        PyErr_Print(); 
        sts = 1; 
    } 
    else 
        sts = 0; 
 
    if (inspect && isatty((int)fileno(stdin))) 
        sts = PyRun_AnyFile(stdin, "<stdin>") != 0; 
 
#ifdef MS_WINDOWS 
    PyWinFreeze_ExeTerm(); 
#endif 
    if (Py_FinalizeEx() < 0) { 
        sts = 120; 
    } 
 
error: 
    PyMem_RawFree(argv_copy); 
    if (argv_copy2) { 
        for (i = 0; i < argc; i++) 
            PyMem_RawFree(argv_copy2[i]); 
        PyMem_RawFree(argv_copy2); 
    } 
    PyMem_RawFree(oldloc); 
    return sts; 
}