From af6a27a704cd832f91e25b1052f4b6cc52a4e704 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= <martin@v.loewis.de>
Date: Fri, 3 Jan 2003 19:16:14 +0000
Subject: Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.

---
 Misc/NEWS            |  2 ++
 Objects/fileobject.c | 25 ++++++++++++++++++++++++-
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/Misc/NEWS b/Misc/NEWS
index 00008e5..0969651 100644
--- 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.
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index fb73385..fb8ec90 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -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;
 }
 
-- 
cgit v0.12

