[Python-checkins] CVS: python/dist/src/Objects fileobject.c,2.130,2.131
Tim Peters
tim_one@users.sourceforge.net
2001年9月22日 21:06:07 -0700
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv18490/python/Objects
Modified Files:
fileobject.c
Log Message:
Generalize file.writelines() to allow iterable objects.
Index: fileobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/fileobject.c,v
retrieving revision 2.130
retrieving revision 2.131
diff -C2 -d -r2.130 -r2.131
*** fileobject.c 2001年09月20日 21:45:26 2.130
--- fileobject.c 2001年09月23日 04:06:05 2.131
***************
*** 1165,1217 ****
static PyObject *
! file_writelines(PyFileObject *f, PyObject *args)
{
#define CHUNKSIZE 1000
PyObject *list, *line;
PyObject *result;
int i, j, index, len, nwritten, islist;
if (f->f_fp == NULL)
return err_closed();
- if (args == NULL || !PySequence_Check(args)) {
- PyErr_SetString(PyExc_TypeError,
- "writelines() argument must be a sequence of strings");
- return NULL;
- }
- islist = PyList_Check(args);
! /* Strategy: slurp CHUNKSIZE lines into a private list,
! checking that they are all strings, then write that list
! without holding the interpreter lock, then come back for more. */
! index = 0;
! if (islist)
! list = NULL;
else {
list = PyList_New(CHUNKSIZE);
if (list == NULL)
! return NULL;
}
- result = NULL;
! for (;;) {
if (islist) {
Py_XDECREF(list);
! list = PyList_GetSlice(args, index, index+CHUNKSIZE);
if (list == NULL)
! return NULL;
j = PyList_GET_SIZE(list);
}
else {
for (j = 0; j < CHUNKSIZE; j++) {
! line = PySequence_GetItem(args, index+j);
if (line == NULL) {
! if (PyErr_ExceptionMatches(
! PyExc_IndexError)) {
! PyErr_Clear();
! break;
! }
! /* Some other error occurred.
! XXX We may lose some output. */
! goto error;
}
PyList_SetItem(list, j, line);
--- 1165,1216 ----
static PyObject *
! file_writelines(PyFileObject *f, PyObject *seq)
{
#define CHUNKSIZE 1000
PyObject *list, *line;
+ PyObject *it; /* iter(seq) */
PyObject *result;
int i, j, index, len, nwritten, islist;
+ assert(seq != NULL);
if (f->f_fp == NULL)
return err_closed();
! result = NULL;
! list = NULL;
! islist = PyList_Check(seq);
! if (islist)
! it = NULL;
else {
+ it = PyObject_GetIter(seq);
+ if (it == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "writelines() requires an iterable argument");
+ return NULL;
+ }
+ /* From here on, fail by going to error, to reclaim "it". */
list = PyList_New(CHUNKSIZE);
if (list == NULL)
! goto error;
}
! /* Strategy: slurp CHUNKSIZE lines into a private list,
! checking that they are all strings, then write that list
! without holding the interpreter lock, then come back for more. */
! for (index = 0; ; index += CHUNKSIZE) {
if (islist) {
Py_XDECREF(list);
! list = PyList_GetSlice(seq, index, index+CHUNKSIZE);
if (list == NULL)
! goto error;
j = PyList_GET_SIZE(list);
}
else {
for (j = 0; j < CHUNKSIZE; j++) {
! line = PyIter_Next(it);
if (line == NULL) {
! if (PyErr_Occurred())
! goto error;
! break;
}
PyList_SetItem(list, j, line);
***************
*** 1272,1276 ****
if (j < CHUNKSIZE)
break;
- index += CHUNKSIZE;
}
--- 1271,1274 ----
***************
*** 1279,1283 ****
--- 1277,1283 ----
error:
Py_XDECREF(list);
+ Py_XDECREF(it);
return result;
+ #undef CHUNKSIZE
}
***************
*** 1343,1350 ****
static char writelines_doc[] =
! "writelines(list of strings) -> None. Write the strings to the file.\n"
"\n"
! "Note that newlines are not added. This is equivalent to calling write()\n"
! "for each string in the list.";
static char flush_doc[] =
--- 1343,1350 ----
static char writelines_doc[] =
! "writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
"\n"
! "Note that newlines are not added. The sequence can be any iterable object\n"
! "producing strings. This is equivalent to calling write() for each string.";
static char flush_doc[] =