* filemodule.c: added writelines() -- analogous to readlines()
* import.c: fixed core dump when out-of-date .pyc file encountered (again!)
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index b981bb8..5099f3f 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -541,6 +541,47 @@
return None;
}
+static object *
+file_writelines(f, args)
+ fileobject *f;
+ object *args;
+{
+ int i, n;
+ if (f->f_fp == NULL)
+ return err_closed();
+ if (args == NULL || !is_listobject(args)) {
+ err_setstr(TypeError,
+ "writelines() requires list of strings");
+ return NULL;
+ }
+ n = getlistsize(args);
+ f->f_softspace = 0;
+ BGN_SAVE
+ errno = 0;
+ for (i = 0; i < n; i++) {
+ object *line = getlistitem(args, i);
+ int len;
+ int nwritten;
+ if (!is_stringobject(line)) {
+ RET_SAVE
+ err_setstr(TypeError,
+ "writelines() requires list of strings");
+ return NULL;
+ }
+ len = getstringsize(line);
+ nwritten = fwrite(getstringvalue(line), 1, len, f->f_fp);
+ if (nwritten != len) {
+ RET_SAVE
+ err_errno(IOError);
+ clearerr(f->f_fp);
+ return NULL;
+ }
+ }
+ END_SAVE
+ INCREF(None);
+ return None;
+}
+
static struct methodlist file_methods[] = {
{"close", file_close},
{"flush", file_flush},
@@ -552,6 +593,7 @@
{"seek", file_seek},
{"tell", file_tell},
{"write", file_write},
+ {"writelines", file_writelines},
{NULL, NULL} /* sentinel */
};