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

Guido van Rossum gvanrossum@users.sourceforge.net
2001年10月12日 13:01:55 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv29995
Modified Files:
	fileobject.c 
Log Message:
Band-aid solution to SF bug #470634: readlines() on linux requires 2 ^D's.
The problem is that if fread() returns a short count, we attempt
another fread() the next time through the loop, and apparently glibc
clears or ignores the eof condition so the second fread() requires
another ^D to make it see the eof condition.
According to the man page (and the C std, I hope) fread() can only
return a short count on error or eof. I'm using that in the band-aid
solution to avoid calling fread() a second time after a short read.
Note that xreadlines() still has this problem: it calls
readlines(sizehint) until it gets a zero-length return. Since
xreadlines() is mostly used for reading real files, I won't worry
about this until we get a bug report.
Index: fileobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/fileobject.c,v
retrieving revision 2.133
retrieving revision 2.134
diff -C2 -d -r2.133 -r2.134
*** fileobject.c	2001年10月10日 22:03:27	2.133
--- fileobject.c	2001年10月12日 20:01:53	2.134
***************
*** 1046,1049 ****
--- 1046,1050 ----
 	char *p, *q, *end;
 	int err;
+ 	int shortread = 0;
 
 	if (f->f_fp == NULL)
***************
*** 1054,1061 ****
 		return NULL;
 	for (;;) {
! 		Py_BEGIN_ALLOW_THREADS
! 		errno = 0;
! 		nread = fread(buffer+nfilled, 1, buffersize-nfilled, f->f_fp);
! 		Py_END_ALLOW_THREADS
 		if (nread == 0) {
 			sizehint = 0;
--- 1055,1068 ----
 		return NULL;
 	for (;;) {
! 		if (shortread)
! 			nread = 0;
! 		else {
! 			Py_BEGIN_ALLOW_THREADS
! 			errno = 0;
! 			nread = fread(buffer+nfilled, 1,
! 				 buffersize-nfilled, f->f_fp);
! 			Py_END_ALLOW_THREADS
! 			shortread = (nread < buffersize-nfilled);
! 		}
 		if (nread == 0) {
 			sizehint = 0;

AltStyle によって変換されたページ (->オリジナル) /