[Python-checkins] CVS: python/dist/src/Objects fileobject.c,2.97,2.98

Guido van Rossum python-dev@python.org
Sun, 07 Jan 2001 12:51:41 -0800


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv17414

Modified Files:
	fileobject.c 
Log Message:
Tim noticed that I had botched get_line_raw().  Looking again, I
realized that this behavior is already present in PyFile_GetLine(),
which is the only place that needs it.  A little refactoring of that
function made get_line_raw() redundant.


Index: fileobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/fileobject.c,v
retrieving revision 2.97
retrieving revision 2.98
diff -C2 -r2.97 -r2.98
*** fileobject.c	2001/01/05 14:43:05	2.97
--- fileobject.c	2001/01/07 20:51:39	2.98
***************
*** 640,644 ****
     > 0: max length;
     = 0: read arbitrary line;
!    < 0: illegal (use get_line_raw() instead)
  */
  
--- 640,644 ----
     > 0: max length;
     = 0: read arbitrary line;
!    < 0: invalid
  */
  
***************
*** 710,732 ****
  }
  
- /* Internal routine to get a line for raw_input():
-    strip trailing '\n', raise EOFError if EOF reached immediately
- */
- 
- static PyObject *
- get_line_raw(PyFileObject *f)
- {
- 	PyObject *line;
- 
- 	line = get_line(f, 0);
- 	if (line == NULL || PyString_GET_SIZE(line) > 0)
- 		return line;
- 	else {
- 		Py_DECREF(line);
- 		PyErr_SetString(PyExc_EOFError, "EOF when reading a line");
- 		return NULL;
- 	}
- }
- 
  /* External C interface */
  
--- 710,713 ----
***************
*** 734,745 ****
  PyFile_GetLine(PyObject *f, int n)
  {
  	if (f == NULL) {
  		PyErr_BadInternalCall();
  		return NULL;
  	}
! 	if (!PyFile_Check(f)) {
  		PyObject *reader;
  		PyObject *args;
! 		PyObject *result;
  		reader = PyObject_GetAttrString(f, "readline");
  		if (reader == NULL)
--- 715,734 ----
  PyFile_GetLine(PyObject *f, int n)
  {
+ 	PyObject *result;
+ 
  	if (f == NULL) {
  		PyErr_BadInternalCall();
  		return NULL;
  	}
! 
! 	if (PyFile_Check(f)) {
! 		if (((PyFileObject*)f)->f_fp == NULL)
! 			return err_closed();
! 		result = get_line((PyFileObject *)f, n);
! 	}
! 	else {
  		PyObject *reader;
  		PyObject *args;
! 
  		reader = PyObject_GetAttrString(f, "readline");
  		if (reader == NULL)
***************
*** 761,794 ****
  			PyErr_SetString(PyExc_TypeError,
  				   "object.readline() returned non-string");
  		}
! 		if (n < 0 && result != NULL) {
! 			char *s = PyString_AsString(result);
! 			int len = PyString_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)
! 					_PyString_Resize(&result, len-1);
! 				else {
! 					PyObject *v;
! 					v = PyString_FromStringAndSize(s,
! 								       len-1);
! 					Py_DECREF(result);
! 					result = v;
! 				}
  			}
  		}
- 		return result;
  	}
! 	if (((PyFileObject*)f)->f_fp == NULL)
! 		return err_closed();
! 	if (n < 0)
! 		return get_line_raw((PyFileObject *)f);
! 	else
! 		return get_line((PyFileObject *)f, n);
  }
  
--- 750,777 ----
  			PyErr_SetString(PyExc_TypeError,
  				   "object.readline() returned non-string");
+ 		}
+ 	}
+ 
+ 	if (n < 0 && result != NULL && PyString_Check(result)) {
+ 		char *s = PyString_AS_STRING(result);
+ 		int len = PyString_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)
! 				_PyString_Resize(&result, len-1);
! 			else {
! 				PyObject *v;
! 				v = PyString_FromStringAndSize(s, len-1);
  				Py_DECREF(result);
! 				result = v;
  			}
  		}
  	}
! 	return result;
  }