comparison Python/pythonrun.c @ 43225:38f3f9ef193d

Convert code from sys.stdin.encoding to UTF-8 in interactive mode. Fixes #1100.
author Martin v. Löwis <martin@v.loewis.de>
date Tue, 04 Sep 2007 09:18:06 +0000
parents 06dc4321a56a
children b9d19d51de36
comparison
equal deleted inserted replaced
43224:0294bb2e95de 43225:38f3f9ef193d
742 #endif 742 #endif
743 743
744 int 744 int
745 PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) 745 PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
746 { 746 {
747 PyObject *m, *d, *v, *w; 747 PyObject *m, *d, *v, *w, *oenc = NULL;
748 mod_ty mod; 748 mod_ty mod;
749 PyArena *arena; 749 PyArena *arena;
750 char *ps1 = "", *ps2 = ""; 750 char *ps1 = "", *ps2 = "", *enc = NULL;
751 int errcode = 0; 751 int errcode = 0;
752 752
753 if (fp == stdin) {
754 /* Fetch encoding from sys.stdin */
755 v = PySys_GetObject("stdin");
756 if (!v)
757 return -1;
758 oenc = PyObject_GetAttrString(v, "encoding");
759 if (!oenc)
760 return -1;
761 enc = PyUnicode_AsString(oenc);
762 }
753 v = PySys_GetObject("ps1"); 763 v = PySys_GetObject("ps1");
754 if (v != NULL) { 764 if (v != NULL) {
755 v = PyObject_Str(v); 765 v = PyObject_Str(v);
756 if (v == NULL) 766 if (v == NULL)
757 PyErr_Clear(); 767 PyErr_Clear();
768 } 778 }
769 arena = PyArena_New(); 779 arena = PyArena_New();
770 if (arena == NULL) { 780 if (arena == NULL) {
771 Py_XDECREF(v); 781 Py_XDECREF(v);
772 Py_XDECREF(w); 782 Py_XDECREF(w);
783 Py_XDECREF(oenc);
773 return -1; 784 return -1;
774 } 785 }
775 mod = PyParser_ASTFromFile(fp, filename, 786 mod = PyParser_ASTFromFile(fp, filename, enc,
776 Py_single_input, ps1, ps2, 787 Py_single_input, ps1, ps2,
777 flags, &errcode, arena); 788 flags, &errcode, arena);
778 Py_XDECREF(v); 789 Py_XDECREF(v);
779 Py_XDECREF(w); 790 Py_XDECREF(w);
791 Py_XDECREF(oenc);
780 if (mod == NULL) { 792 if (mod == NULL) {
781 PyArena_Free(arena); 793 PyArena_Free(arena);
782 if (errcode == E_EOF) { 794 if (errcode == E_EOF) {
783 PyErr_Clear(); 795 PyErr_Clear();
784 return E_EOF; 796 return E_EOF;
1252 mod_ty mod; 1264 mod_ty mod;
1253 PyArena *arena = PyArena_New(); 1265 PyArena *arena = PyArena_New();
1254 if (arena == NULL) 1266 if (arena == NULL)
1255 return NULL; 1267 return NULL;
1256 1268
1257 mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, 1269 mod = PyParser_ASTFromFile(fp, filename, NULL, start, 0, 0,
1258 flags, NULL, arena); 1270 flags, NULL, arena);
1259 if (closeit) 1271 if (closeit)
1260 fclose(fp); 1272 fclose(fp);
1261 if (mod == NULL) { 1273 if (mod == NULL) {
1262 PyArena_Free(arena); 1274 PyArena_Free(arena);
1377 return NULL; 1389 return NULL;
1378 } 1390 }
1379 } 1391 }
1380 1392
1381 mod_ty 1393 mod_ty
1382 PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1, 1394 PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc,
1395 int start, char *ps1,
1383 char *ps2, PyCompilerFlags *flags, int *errcode, 1396 char *ps2, PyCompilerFlags *flags, int *errcode,
1384 PyArena *arena) 1397 PyArena *arena)
1385 { 1398 {
1386 mod_ty mod; 1399 mod_ty mod;
1387 perrdetail err; 1400 perrdetail err;
1388 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, 1401 node *n = PyParser_ParseFileFlags(fp, filename, enc,
1402 &_PyParser_Grammar,
1389 start, ps1, ps2, &err, PARSER_FLAGS(flags)); 1403 start, ps1, ps2, &err, PARSER_FLAGS(flags));
1390 if (n) { 1404 if (n) {
1391 mod = PyAST_FromNode(n, flags, filename, arena); 1405 mod = PyAST_FromNode(n, flags, filename, arena);
1392 PyNode_Free(n); 1406 PyNode_Free(n);
1393 return mod; 1407 return mod;
1404 1418
1405 node * 1419 node *
1406 PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) 1420 PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
1407 { 1421 {
1408 perrdetail err; 1422 perrdetail err;
1409 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, 1423 node *n = PyParser_ParseFileFlags(fp, filename, NULL,
1424 &_PyParser_Grammar,
1410 start, NULL, NULL, &err, flags); 1425 start, NULL, NULL, &err, flags);
1411 if (n == NULL) 1426 if (n == NULL)
1412 err_input(&err); 1427 err_input(&err);
1413 1428
1414 return n; 1429 return n;