Mercurial > cpython-lru_cache-weakref
annotate Modules/python.c @ 80703:26c4748351cb 3.3
(Merge 3.2) Issue #16416: On Mac OS X, operating system data are now always
encoded/decoded to/from UTF-8/surrogateescape, instead of the locale encoding
(which may be ASCII if no locale environment variable is set), to avoid
inconsistencies with os.fsencode() and os.fsdecode() functions which are
already using UTF-8/surrogateescape.
| author | Victor Stinner <victor.stinner@gmail.com> |
|---|---|
| date | Mon, 03 Dec 2012 12:48:53 +0100 |
| parents | f77998006917 c838c9b117f1 |
| children | c02656962b9c 3b344eac6b0f |
| rev | line source |
|---|---|
|
5853
92bcf4cc9421
This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 /* Minimal main program -- everything is loaded from the library */ |
|
92bcf4cc9421
This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 |
| 8894 | 3 #include "Python.h" |
|
46318
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
26815
diff
changeset
|
4 #include <locale.h> |
| 8894 | 5 |
|
26815
8eccfae04bb4
Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents:
24471
diff
changeset
|
6 #ifdef __FreeBSD__ |
|
8eccfae04bb4
Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents:
24471
diff
changeset
|
7 #include <floatingpoint.h> |
|
8eccfae04bb4
Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents:
24471
diff
changeset
|
8 #endif |
|
8eccfae04bb4
Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents:
24471
diff
changeset
|
9 |
|
46318
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
26815
diff
changeset
|
10 #ifdef MS_WINDOWS |
|
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
26815
diff
changeset
|
11 int |
|
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
26815
diff
changeset
|
12 wmain(int argc, wchar_t **argv) |
|
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
26815
diff
changeset
|
13 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
14 return Py_Main(argc, argv); |
|
46318
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
26815
diff
changeset
|
15 } |
|
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
26815
diff
changeset
|
16 #else |
|
53767
ac209f132b17
Issue #5915: Implement PEP 383, Non-decodable Bytes in
Martin v. Löwis <martin@v.loewis.de>
parents:
51902
diff
changeset
|
17 |
| 6055 | 18 int |
| 13481 | 19 main(int argc, char **argv) |
|
5853
92bcf4cc9421
This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 { |
|
75944
c0900fd6e4b3
Issue #3367: NULL-terminate argv[] copies to prevent an invalid access
Stefan Krah <skrah@bytereef.org>
parents:
74000
diff
changeset
|
21 wchar_t **argv_copy = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*(argc+1)); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
22 /* We need a second copies, as Python might modify the first one. */ |
|
75944
c0900fd6e4b3
Issue #3367: NULL-terminate argv[] copies to prevent an invalid access
Stefan Krah <skrah@bytereef.org>
parents:
74000
diff
changeset
|
23 wchar_t **argv_copy2 = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*(argc+1)); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
24 int i, res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
25 char *oldloc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
26 /* 754 requires that FP exceptions run in "no stop" mode by default, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
27 * and until C vendors implement C99's ways to control FP exceptions, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
28 * Python requires non-stop mode. Alas, some platforms enable FP |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
29 * exceptions by default. Here we disable them. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
30 */ |
|
26815
8eccfae04bb4
Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents:
24471
diff
changeset
|
31 #ifdef __FreeBSD__ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
32 fp_except_t m; |
|
26815
8eccfae04bb4
Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents:
24471
diff
changeset
|
33 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
34 m = fpgetmask(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
35 fpsetmask(m & ~FP_X_OFL); |
|
26815
8eccfae04bb4
Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents:
24471
diff
changeset
|
36 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
37 if (!argv_copy || !argv_copy2) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
38 fprintf(stderr, "out of memory\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
39 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
40 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
41 oldloc = strdup(setlocale(LC_ALL, NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
42 setlocale(LC_ALL, ""); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
43 for (i = 0; i < argc; i++) { |
|
65412
3794c9b50824
Add an optional size argument to _Py_char2wchar()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65277
diff
changeset
|
44 argv_copy[i] = _Py_char2wchar(argv[i], NULL); |
|
74000
3b17210f34d9
main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
45 if (!argv_copy[i]) { |
|
77782
f77998006917
If main() is called and an argument cannot be decoded, make sure to
Brett Cannon <brett@python.org>
parents:
75944
diff
changeset
|
46 free(oldloc); |
|
74000
3b17210f34d9
main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
47 fprintf(stderr, "Fatal Python error: " |
|
3b17210f34d9
main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
48 "unable to decode the command line argument #%i\n", |
|
3b17210f34d9
main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
49 i + 1); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
50 return 1; |
|
74000
3b17210f34d9
main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
51 } |
|
65277
49df778889e6
Revert r85435 (and r85440): decode command line arguments from utf-8
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65275
diff
changeset
|
52 argv_copy2[i] = argv_copy[i]; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
53 } |
|
75944
c0900fd6e4b3
Issue #3367: NULL-terminate argv[] copies to prevent an invalid access
Stefan Krah <skrah@bytereef.org>
parents:
74000
diff
changeset
|
54 argv_copy2[argc] = argv_copy[argc] = NULL; |
|
c0900fd6e4b3
Issue #3367: NULL-terminate argv[] copies to prevent an invalid access
Stefan Krah <skrah@bytereef.org>
parents:
74000
diff
changeset
|
55 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
56 setlocale(LC_ALL, oldloc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
57 free(oldloc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
58 res = Py_Main(argc, argv_copy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
59 for (i = 0; i < argc; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
60 PyMem_Free(argv_copy2[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
61 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
62 PyMem_Free(argv_copy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
63 PyMem_Free(argv_copy2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54427
diff
changeset
|
64 return res; |
|
5853
92bcf4cc9421
This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
65 } |
|
46318
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
26815
diff
changeset
|
66 #endif |
