frozenmain.c 2.71 KB
Newer Older
1 2 3

/* Python interpreter main program for frozen scripts */

Guido van Rossum's avatar
Guido van Rossum committed
4
#include "Python.h"
5
#include <locale.h>
6

7
#ifdef MS_WINDOWS
8 9 10
extern void PyWinFreeze_ExeInit(void);
extern void PyWinFreeze_ExeTerm(void);
extern int PyInitFrozenExtensions(void);
11 12
#endif

13 14 15
/* Main program */

int
16
Py_FrozenMain(int argc, char **argv)
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
    char *p;
    int i, n, sts;
    int inspect = 0;
    int unbuffered = 0;
    char *oldloc;
    wchar_t **argv_copy = PyMem_Malloc(sizeof(wchar_t*)*argc);
    /* We need a second copies, as Python might modify the first one. */
    wchar_t **argv_copy2 = PyMem_Malloc(sizeof(wchar_t*)*argc);

    Py_FrozenFlag = 1; /* 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);
    }

    if (!argv_copy) {
        fprintf(stderr, "out of memory\n");
        return 1;
    }

    oldloc = setlocale(LC_ALL, NULL);
    setlocale(LC_ALL, "");
    for (i = 0; i < argc; i++) {
48
#ifdef HAVE_BROKEN_MBSTOWCS
49
        size_t argsize = strlen(argv[i]);
50
#else
51
        size_t argsize = mbstowcs(NULL, argv[i], 0);
52
#endif
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
        size_t count;
        if (argsize == (size_t)-1) {
            fprintf(stderr, "Could not convert argument %d to string\n", i);
            return 1;
        }
        argv_copy[i] = PyMem_Malloc((argsize+1)*sizeof(wchar_t));
        argv_copy2[i] = argv_copy[i];
        if (!argv_copy[i]) {
            fprintf(stderr, "out of memory\n");
            return 1;
        }
        count = mbstowcs(argv_copy[i], argv[i], argsize+1);
        if (count == (size_t)-1) {
            fprintf(stderr, "Could not convert argument %d to string\n", i);
            return 1;
        }
    }
    setlocale(LC_ALL, oldloc);
71

72
#ifdef MS_WINDOWS
73
    PyInitFrozenExtensions();
74
#endif /* MS_WINDOWS */
75 76
    Py_SetProgramName(argv_copy[0]);
    Py_Initialize();
77
#ifdef MS_WINDOWS
78
    PyWinFreeze_ExeInit();
79
#endif
80

81 82 83
    if (Py_VerboseFlag)
        fprintf(stderr, "Python %s\n%s\n",
            Py_GetVersion(), Py_GetCopyright());
84

85
    PySys_SetArgv(argc, argv_copy);
86

87 88 89 90 91 92 93 94 95
    n = PyImport_ImportFrozenModule("__main__");
    if (n == 0)
        Py_FatalError("__main__ not frozen");
    if (n < 0) {
        PyErr_Print();
        sts = 1;
    }
    else
        sts = 0;
96

97 98
    if (inspect && isatty((int)fileno(stdin)))
        sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
99

100
#ifdef MS_WINDOWS
101
    PyWinFreeze_ExeTerm();
102
#endif
103 104 105 106 107 108 109
    Py_Finalize();
    for (i = 0; i < argc; i++) {
        PyMem_Free(argv_copy2[i]);
    }
    PyMem_Free(argv_copy);
    PyMem_Free(argv_copy2);
    return sts;
110
}