Files for 2.1b1 distribution.
[python/dscho.git] / Modules / xreadlinesmodule.c
blob4cdef8a7289e4a8d2e9c002f24f1bba83120323c
1 #include "Python.h"
3 static char xreadlines_doc [] =
4 "xreadlines(f)\n\
5 \n\
6 Return an xreadlines object for the file f.";
8 typedef struct {
9 PyObject_HEAD
10 PyObject *file;
11 PyObject *lines;
12 int lineslen;
13 int lineno;
14 int abslineno;
15 } PyXReadlinesObject;
17 staticforward PyTypeObject XReadlinesObject_Type;
19 static void
20 xreadlines_dealloc(PyXReadlinesObject *op)
22 Py_XDECREF(op->file);
23 Py_XDECREF(op->lines);
24 PyObject_DEL(op);
27 /* A larger chunk size doesn't seem to make a difference */
28 #define CHUNKSIZE 8192
30 static PyXReadlinesObject *
31 newreadlinesobject(PyObject *file)
33 PyXReadlinesObject *op;
34 op = PyObject_NEW(PyXReadlinesObject, &XReadlinesObject_Type);
35 if (op == NULL)
36 return NULL;
37 Py_XINCREF(file);
38 op->file = file;
39 op->lines = NULL;
40 op->abslineno = op->lineno = op->lineslen = 0;
41 return op;
44 static PyObject *
45 xreadlines(PyObject *self, PyObject *args)
47 PyObject *file;
48 PyXReadlinesObject *ret;
50 if (!PyArg_ParseTuple(args, "O:xreadlines", &file))
51 return NULL;
52 ret = newreadlinesobject(file);
53 Py_XINCREF(ret);
54 return (PyObject*)ret;
57 static PyObject *
58 xreadlines_item(PyXReadlinesObject *a, int i)
60 if (i != a->abslineno) {
61 PyErr_SetString(PyExc_RuntimeError,
62 "xreadlines object accessed out of order");
63 return NULL;
65 if (a->lineno >= a->lineslen) {
66 Py_XDECREF(a->lines);
67 a->lines = PyObject_CallMethod(a->file, "readlines", "(i)",
68 CHUNKSIZE);
69 if (a->lines == NULL)
70 return NULL;
71 a->lineno = 0;
72 if ((a->lineslen = PySequence_Size(a->lines)) < 0)
73 return NULL;
75 a->abslineno++;
76 return PySequence_GetItem(a->lines, a->lineno++);
79 static PySequenceMethods xreadlines_as_sequence = {
80 0, /*sq_length*/
81 0, /*sq_concat*/
82 0, /*sq_repeat*/
83 (intargfunc)xreadlines_item, /*sq_item*/
86 static PyTypeObject XReadlinesObject_Type = {
87 PyObject_HEAD_INIT(NULL)
89 "xreadlines",
90 sizeof(PyXReadlinesObject) + PyGC_HEAD_SIZE,
92 (destructor)xreadlines_dealloc, /*tp_dealloc*/
93 0, /*tp_print*/
94 0, /*tp_getattr*/
95 0, /*tp_setattr*/
96 0, /*tp_compare*/
97 0, /*tp_repr*/
98 0, /*tp_as_number*/
99 &xreadlines_as_sequence, /*tp_as_sequence*/
100 0, /*tp_as_mapping*/
101 0, /*tp_hash*/
102 0, /*tp_call*/
103 0, /*tp_str*/
104 0, /*tp_getattro*/
105 0, /*tp_setattro*/
106 0, /*tp_as_buffer*/
107 Py_TPFLAGS_DEFAULT, /*tp_flags*/
108 0, /* tp_doc */
111 static PyMethodDef xreadlines_methods[] = {
112 {"xreadlines", xreadlines, METH_VARARGS, xreadlines_doc},
113 {NULL, NULL}
116 DL_EXPORT(void)
117 initxreadlines(void)
119 PyObject *m;
121 XReadlinesObject_Type.ob_type = &PyType_Type;
122 m = Py_InitModule("xreadlines", xreadlines_methods);