Mercurial > cpython-lru_cache-weakref
annotate Modules/python.c @ 65270:3335edce48a3
Issue #9992: On Mac OS X, decode command line arguments from utf-8 instead of
the locale encoding.
| author | Victor Stinner <victor.stinner@haypocalc.com> |
|---|---|
| date | Wed, 13 Oct 2010 22:15:06 +0000 |
| parents | cab14be0ada1 |
| children | e9ea09787a35 |
| 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 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
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 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
21 wchar_t **argv_copy = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*argc); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
22 /* We need a second copies, as Python might modify the first one. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
23 wchar_t **argv_copy2 = (wchar_t **)PyMem_Malloc(sizeof(wchar_t*)*argc); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
24 int i, res; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
25 char *oldloc; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
26 /* 754 requires that FP exceptions run in "no stop" mode by default, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
27 * and until C vendors implement C99's ways to control FP exceptions, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
28 * Python requires non-stop mode. Alas, some platforms enable FP |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
29 * exceptions by default. Here we disable them. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
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__ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
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 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
34 m = fpgetmask(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
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 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
37 if (!argv_copy || !argv_copy2) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
38 fprintf(stderr, "out of memory\n"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
39 return 1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
40 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
41 oldloc = strdup(setlocale(LC_ALL, NULL)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
42 setlocale(LC_ALL, ""); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
43 for (i = 0; i < argc; i++) { |
|
65270
3335edce48a3
Issue #9992: On Mac OS X, decode command line arguments from utf-8 instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
44 #ifdef __APPLE__ |
|
3335edce48a3
Issue #9992: On Mac OS X, decode command line arguments from utf-8 instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
45 /* Use utf-8 on Mac OS X */ |
|
3335edce48a3
Issue #9992: On Mac OS X, decode command line arguments from utf-8 instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
46 PyObject *unicode = PyUnicode_FromString(argv[i]); |
|
3335edce48a3
Issue #9992: On Mac OS X, decode command line arguments from utf-8 instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
47 argv_copy[i] = PyUnicode_AsWideCharString(unicode, NULL); |
|
3335edce48a3
Issue #9992: On Mac OS X, decode command line arguments from utf-8 instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
48 Py_DECREF(unicode); |
|
3335edce48a3
Issue #9992: On Mac OS X, decode command line arguments from utf-8 instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
49 #else |
|
3335edce48a3
Issue #9992: On Mac OS X, decode command line arguments from utf-8 instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
50 argv_copy[i] = _Py_char2wchar(argv[i]); |
|
3335edce48a3
Issue #9992: On Mac OS X, decode command line arguments from utf-8 instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
51 #endif |
|
3335edce48a3
Issue #9992: On Mac OS X, decode command line arguments from utf-8 instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
52 argv_copy2[i] = argv_copy[i]; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
53 if (!argv_copy[i]) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
54 return 1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
55 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
56 setlocale(LC_ALL, oldloc); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
57 free(oldloc); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
58 res = Py_Main(argc, argv_copy); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
59 for (i = 0; i < argc; i++) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
60 PyMem_Free(argv_copy2[i]); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
61 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
62 PyMem_Free(argv_copy); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
diff
changeset
|
63 PyMem_Free(argv_copy2); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60688
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 |
