]> granicus.if.org Git - python/commitdiff
Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
authorMartin v. Löwis <martin@v.loewis.de>
Fri, 3 Jan 2003 19:16:14 +0000 (19:16 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Fri, 3 Jan 2003 19:16:14 +0000 (19:16 +0000)
Misc/NEWS
Objects/fileobject.c

index 00008e51b11087ee4335f31661300635a9dc3b3a..0969651a0f1cdf453e2474012e51af9865512ca0 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.3 alpha 2?
 Core and builtins
 -----------------
 
+- raw_input can now return Unicode objects.
+
 - List objects' sort() method now accepts None as the comparison function.
   Passing None is semantically identical to calling sort() with no
   arguments.
index fb73385217f21c54db20e5cd9ddbaabca6119505..fb8ec90cfebcb2702479cda3498e9f0666001dae 100644 (file)
@@ -1212,7 +1212,8 @@ PyFile_GetLine(PyObject *f, int n)
                result = PyEval_CallObject(reader, args);
                Py_DECREF(reader);
                Py_DECREF(args);
-               if (result != NULL && !PyString_Check(result)) {
+               if (result != NULL && !PyString_Check(result) &&
+                   !PyUnicode_Check(result)) {
                        Py_DECREF(result);
                        result = NULL;
                        PyErr_SetString(PyExc_TypeError,
@@ -1240,6 +1241,28 @@ PyFile_GetLine(PyObject *f, int n)
                        }
                }
        }
+#ifdef Py_USING_UNICODE
+       if (n < 0 && result != NULL && PyUnicode_Check(result)) {
+               Py_UNICODE *s = PyUnicode_AS_UNICODE(result);
+               int len = PyUnicode_GET_SIZE(result);
+               if (len == 0) {
+                       Py_DECREF(result);
+                       result = NULL;
+                       PyErr_SetString(PyExc_EOFError,
+                                       "EOF when reading a line");
+               }
+               else if (s[len-1] == '\n') {
+                       if (result->ob_refcnt == 1)
+                               PyUnicode_Resize(&result, len-1);
+                       else {
+                               PyObject *v;
+                               v = PyUnicode_FromUnicode(s, len-1);
+                               Py_DECREF(result);
+                               result = v;
+                       }
+               }
+       }
+#endif
        return result;
 }