0
0
mirror of https://github.com/python/cpython.git synced 2024-12-01 11:15:56 +01:00

Jeff Epler's xreadlines module, with slight reformatting and some

changes for safety and tuning.
This commit is contained in:
Guido van Rossum 2001-01-09 21:46:50 +00:00
parent c49480ed51
commit ea3375d96b
2 changed files with 121 additions and 0 deletions

View File

@ -156,6 +156,9 @@ _socket socketmodule.c # socket(2)
# Memory-mapped files (also works on Win32).
mmap mmapmodule.c
# Dynamic readlines
xreadlines xreadlinesmodule.c
# Socket module compiled with SSL support; you must edit the SSL variable:
#SSL=/usr/local/ssl
#_socket socketmodule.c \

118
Modules/xreadlinesmodule.c Normal file
View File

@ -0,0 +1,118 @@
#include "Python.h"
static char xreadlines_doc [] =
"xreadlines(f)\n\
\n\
Return an xreadlines object for the file f.";
typedef struct {
PyObject_HEAD
PyObject *file;
PyObject *lines;
int lineslen;
int lineno;
int abslineno;
} PyXReadlinesObject;
staticforward PyTypeObject XReadlinesObject_Type;
static void
xreadlines_dealloc(PyXReadlinesObject *op) {
Py_XDECREF(op->file);
Py_XDECREF(op->lines);
PyObject_DEL(op);
}
/* A larger chunk size doesn't seem to make a difference */
#define CHUNKSIZE 8192
static PyXReadlinesObject *
newreadlinesobject(PyObject *file) {
PyXReadlinesObject *op;
op = PyObject_NEW(PyXReadlinesObject, &XReadlinesObject_Type);
if (op == NULL)
return NULL;
Py_XINCREF(file);
op->file = file;
op->lines = NULL;
op->abslineno = op->lineno = op->lineslen = 0;
return op;
}
static PyObject *
xreadlines(PyObject *self, PyObject *args) {
PyObject *file;
PyXReadlinesObject *ret;
if (!PyArg_ParseTuple(args, "O:xreadlines", &file))
return NULL;
ret = newreadlinesobject(file);
Py_XINCREF(ret);
return (PyObject*)ret;
}
static PyObject*
xreadlines_item(PyXReadlinesObject *a, int i) {
if (i != a->abslineno) {
PyErr_SetString(PyExc_RuntimeError,
"xreadlines object accessed out of order");
return NULL;
}
if (a->lineno >= a->lineslen) {
Py_XDECREF(a->lines);
a->lines = PyObject_CallMethod(a->file, "readlines", "(i)",
CHUNKSIZE);
if (a->lines == NULL)
return NULL;
a->lineno = 0;
if ((a->lineslen = PySequence_Size(a->lines)) < 0)
return NULL;
}
a->abslineno++;
return PySequence_GetItem(a->lines, a->lineno++);
}
static PySequenceMethods xreadlines_as_sequence = {
0, /*sq_length*/
0, /*sq_concat*/
0, /*sq_repeat*/
(intargfunc)xreadlines_item, /*sq_item*/
};
static PyTypeObject XReadlinesObject_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0,
"xreadlines",
sizeof(PyXReadlinesObject) + PyGC_HEAD_SIZE,
0,
(destructor)xreadlines_dealloc, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
0, /*tp_as_number*/
&xreadlines_as_sequence, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash*/
0, /*tp_call*/
0, /*tp_str*/
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT, /*tp_flags*/
0, /* tp_doc */
};
static PyMethodDef xreadlines_methods[] = {
{"xreadlines", xreadlines, METH_VARARGS, xreadlines_doc},
{NULL, NULL}
};
void
initxreadlines(void)
{
PyObject *m;
m = Py_InitModule("xreadlines", xreadlines_methods);
}