blob: 3bce1a5c8e90449fb194c01ab4769675680a991a [file] [log] [blame]
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001/*
2 An implementation of the I/O abstract base classes hierarchy
3 as defined by PEP 3116 - "New I/O"
4
5 Classes defined here: IOBase, RawIOBase.
6
7 Written by Amaury Forgeot d'Arc and Antoine Pitrou
8*/
9
10
11#define PY_SSIZE_T_CLEAN
12#include "Python.h"
13#include "structmember.h"
14#include "_iomodule.h"
15
16/*
17 * IOBase class, an abstract class
18 */
19
20typedef struct {
21 PyObject_HEAD
22
23 PyObject *dict;
24 PyObject *weakreflist;
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000025} iobase;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000026
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000027PyDoc_STRVAR(iobase_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000028 "The abstract base class for all I/O classes, acting on streams of\n"
29 "bytes. There is no public constructor.\n"
30 "\n"
31 "This class provides dummy implementations for many methods that\n"
32 "derived classes can override selectively; the default implementations\n"
33 "represent a file that cannot be read, written or seeked.\n"
34 "\n"
35 "Even though IOBase does not declare read, readinto, or write because\n"
36 "their signatures will vary, implementations and clients should\n"
37 "consider those methods part of the interface. Also, implementations\n"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +000038 "may raise UnsupportedOperation when operations they do not support are\n"
39 "called.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000040 "\n"
41 "The basic type used for binary data read from or written to a file is\n"
42 "bytes. bytearrays are accepted too, and in some cases (such as\n"
43 "readinto) needed. Text I/O classes work with str data.\n"
44 "\n"
45 "Note that calling any method (even inquiries) on a closed stream is\n"
46 "undefined. Implementations may raise IOError in this case.\n"
47 "\n"
48 "IOBase (and its subclasses) support the iterator protocol, meaning\n"
49 "that an IOBase object can be iterated over yielding the lines in a\n"
50 "stream.\n"
51 "\n"
52 "IOBase also supports the :keyword:`with` statement. In this example,\n"
Ezio Melotti13925002011-03-16 11:05:33 +020053 "fp is closed after the suite of the with statement is complete:\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000054 "\n"
55 "with open('spam.txt', 'r') as fp:\n"
56 " fp.write('Spam and eggs!')\n");
57
58/* Use this macro whenever you want to check the internal `closed` status
59 of the IOBase object rather than the virtual `closed` attribute as returned
60 by whatever subclass. */
61
Martin v. Löwis767046a2011-10-14 15:35:36 +020062_Py_IDENTIFIER(__IOBase_closed);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000063#define IS_CLOSED(self) \
Martin v. Löwis767046a2011-10-14 15:35:36 +020064 _PyObject_HasAttrId(self, &PyId___IOBase_closed)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000065
66/* Internal methods */
67static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000068iobase_unsupported(const char *message)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000069{
70 PyErr_SetString(IO_STATE->unsupported_operation, message);
71 return NULL;
72}
73
74/* Positionning */
75
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000076PyDoc_STRVAR(iobase_seek_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000077 "Change stream position.\n"
78 "\n"
79 "Change the stream position to byte offset offset. offset is\n"
80 "interpreted relative to the position indicated by whence. Values\n"
81 "for whence are:\n"
82 "\n"
83 "* 0 -- start of stream (the default); offset should be zero or positive\n"
84 "* 1 -- current stream position; offset may be negative\n"
85 "* 2 -- end of stream; offset is usually negative\n"
86 "\n"
87 "Return the new absolute position.");
88
89static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000090iobase_seek(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000091{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000092 return iobase_unsupported("seek");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000093}
94
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000095PyDoc_STRVAR(iobase_tell_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000096 "Return current stream position.");
97
98static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +000099iobase_tell(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000100{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200101 _Py_IDENTIFIER(seek);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200102
103 return _PyObject_CallMethodId(self, &PyId_seek, "ii", 0, 1);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000104}
105
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000106PyDoc_STRVAR(iobase_truncate_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000107 "Truncate file to size bytes.\n"
108 "\n"
Antoine Pitrou905a2ff2010-01-31 22:47:27 +0000109 "File pointer is left unchanged. Size defaults to the current IO\n"
110 "position as reported by tell(). Returns the new size.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000111
112static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000113iobase_truncate(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000114{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000115 return iobase_unsupported("truncate");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000116}
117
118/* Flush and close methods */
119
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000120PyDoc_STRVAR(iobase_flush_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000121 "Flush write buffers, if applicable.\n"
122 "\n"
123 "This is not implemented for read-only and non-blocking streams.\n");
124
125static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000126iobase_flush(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000127{
128 /* XXX Should this return the number of bytes written??? */
129 if (IS_CLOSED(self)) {
130 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file.");
131 return NULL;
132 }
133 Py_RETURN_NONE;
134}
135
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000136PyDoc_STRVAR(iobase_close_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000137 "Flush and close the IO object.\n"
138 "\n"
139 "This method has no effect if the file is already closed.\n");
140
141static int
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000142iobase_closed(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000143{
144 PyObject *res;
145 int closed;
146 /* This gets the derived attribute, which is *not* __IOBase_closed
147 in most cases! */
148 res = PyObject_GetAttr(self, _PyIO_str_closed);
149 if (res == NULL)
150 return 0;
151 closed = PyObject_IsTrue(res);
152 Py_DECREF(res);
153 return closed;
154}
155
156static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000157iobase_closed_get(PyObject *self, void *context)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000158{
159 return PyBool_FromLong(IS_CLOSED(self));
160}
161
Benjamin Petersonf6f3a352011-09-03 09:26:20 -0400162static PyObject *
163iobase_get_dict(PyObject *self)
164{
165 PyObject **dictptr = _PyObject_GetDictPtr(self);
166 PyObject *dict;
167 assert(dictptr);
168 dict = *dictptr;
169 if (dict == NULL)
170 dict = *dictptr = PyDict_New();
171 Py_XINCREF(dict);
172 return dict;
173}
174
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000175PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000176_PyIOBase_check_closed(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000177{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000178 if (iobase_closed(self)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000179 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file.");
180 return NULL;
181 }
182 if (args == Py_True)
183 return Py_None;
184 else
185 Py_RETURN_NONE;
186}
187
188/* XXX: IOBase thinks it has to maintain its own internal state in
189 `__IOBase_closed` and call flush() by itself, but it is redundant with
190 whatever behaviour a non-trivial derived class will implement. */
191
192static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000193iobase_close(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000194{
195 PyObject *res;
Martin v. Löwis767046a2011-10-14 15:35:36 +0200196 _Py_IDENTIFIER(__IOBase_closed);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000197
198 if (IS_CLOSED(self))
199 Py_RETURN_NONE;
200
201 res = PyObject_CallMethodObjArgs(self, _PyIO_str_flush, NULL);
Martin v. Löwis767046a2011-10-14 15:35:36 +0200202 _PyObject_SetAttrId(self, &PyId___IOBase_closed, Py_True);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000203 if (res == NULL) {
Antoine Pitrou6be88762010-05-03 16:48:20 +0000204 return NULL;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000205 }
206 Py_XDECREF(res);
207 Py_RETURN_NONE;
208}
209
210/* Finalization and garbage collection support */
211
212int
213_PyIOBase_finalize(PyObject *self)
214{
215 PyObject *res;
216 PyObject *tp, *v, *tb;
217 int closed = 1;
218 int is_zombie;
219
220 /* If _PyIOBase_finalize() is called from a destructor, we need to
221 resurrect the object as calling close() can invoke arbitrary code. */
222 is_zombie = (Py_REFCNT(self) == 0);
223 if (is_zombie) {
224 ++Py_REFCNT(self);
225 }
226 PyErr_Fetch(&tp, &v, &tb);
227 /* If `closed` doesn't exist or can't be evaluated as bool, then the
228 object is probably in an unusable state, so ignore. */
229 res = PyObject_GetAttr(self, _PyIO_str_closed);
230 if (res == NULL)
231 PyErr_Clear();
232 else {
233 closed = PyObject_IsTrue(res);
234 Py_DECREF(res);
235 if (closed == -1)
236 PyErr_Clear();
237 }
238 if (closed == 0) {
239 res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_close,
240 NULL);
241 /* Silencing I/O errors is bad, but printing spurious tracebacks is
242 equally as bad, and potentially more frequent (because of
243 shutdown issues). */
244 if (res == NULL)
245 PyErr_Clear();
246 else
247 Py_DECREF(res);
248 }
249 PyErr_Restore(tp, v, tb);
250 if (is_zombie) {
251 if (--Py_REFCNT(self) != 0) {
252 /* The object lives again. The following code is taken from
253 slot_tp_del in typeobject.c. */
254 Py_ssize_t refcnt = Py_REFCNT(self);
255 _Py_NewReference(self);
256 Py_REFCNT(self) = refcnt;
257 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
258 * we need to undo that. */
259 _Py_DEC_REFTOTAL;
260 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
261 * chain, so no more to do there.
262 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
263 * _Py_NewReference bumped tp_allocs: both of those need to be
264 * undone.
265 */
266#ifdef COUNT_ALLOCS
267 --Py_TYPE(self)->tp_frees;
268 --Py_TYPE(self)->tp_allocs;
269#endif
270 return -1;
271 }
272 }
273 return 0;
274}
275
276static int
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000277iobase_traverse(iobase *self, visitproc visit, void *arg)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000278{
279 Py_VISIT(self->dict);
280 return 0;
281}
282
283static int
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000284iobase_clear(iobase *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000285{
286 if (_PyIOBase_finalize((PyObject *) self) < 0)
287 return -1;
288 Py_CLEAR(self->dict);
289 return 0;
290}
291
292/* Destructor */
293
294static void
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000295iobase_dealloc(iobase *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000296{
297 /* NOTE: since IOBaseObject has its own dict, Python-defined attributes
298 are still available here for close() to use.
299 However, if the derived class declares a __slots__, those slots are
300 already gone.
301 */
302 if (_PyIOBase_finalize((PyObject *) self) < 0) {
303 /* When called from a heap type's dealloc, the type will be
304 decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */
305 if (PyType_HasFeature(Py_TYPE(self), Py_TPFLAGS_HEAPTYPE))
306 Py_INCREF(Py_TYPE(self));
307 return;
308 }
309 _PyObject_GC_UNTRACK(self);
310 if (self->weakreflist != NULL)
311 PyObject_ClearWeakRefs((PyObject *) self);
312 Py_CLEAR(self->dict);
313 Py_TYPE(self)->tp_free((PyObject *) self);
314}
315
316/* Inquiry methods */
317
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000318PyDoc_STRVAR(iobase_seekable_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000319 "Return whether object supports random access.\n"
320 "\n"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +0000321 "If False, seek(), tell() and truncate() will raise UnsupportedOperation.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000322 "This method may need to do a test seek().");
323
324static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000325iobase_seekable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000326{
327 Py_RETURN_FALSE;
328}
329
330PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000331_PyIOBase_check_seekable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000332{
333 PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_seekable, NULL);
334 if (res == NULL)
335 return NULL;
336 if (res != Py_True) {
337 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000338 iobase_unsupported("File or stream is not seekable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000339 return NULL;
340 }
341 if (args == Py_True) {
342 Py_DECREF(res);
343 }
344 return res;
345}
346
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000347PyDoc_STRVAR(iobase_readable_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000348 "Return whether object was opened for reading.\n"
349 "\n"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +0000350 "If False, read() will raise UnsupportedOperation.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000351
352static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000353iobase_readable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000354{
355 Py_RETURN_FALSE;
356}
357
358/* May be called with any object */
359PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000360_PyIOBase_check_readable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000361{
362 PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_readable, NULL);
363 if (res == NULL)
364 return NULL;
365 if (res != Py_True) {
366 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000367 iobase_unsupported("File or stream is not readable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000368 return NULL;
369 }
370 if (args == Py_True) {
371 Py_DECREF(res);
372 }
373 return res;
374}
375
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000376PyDoc_STRVAR(iobase_writable_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000377 "Return whether object was opened for writing.\n"
378 "\n"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +0000379 "If False, write() will raise UnsupportedOperation.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000380
381static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000382iobase_writable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000383{
384 Py_RETURN_FALSE;
385}
386
387/* May be called with any object */
388PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000389_PyIOBase_check_writable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000390{
391 PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_writable, NULL);
392 if (res == NULL)
393 return NULL;
394 if (res != Py_True) {
395 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000396 iobase_unsupported("File or stream is not writable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000397 return NULL;
398 }
399 if (args == Py_True) {
400 Py_DECREF(res);
401 }
402 return res;
403}
404
405/* Context manager */
406
407static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000408iobase_enter(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000409{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000410 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000411 return NULL;
412
413 Py_INCREF(self);
414 return self;
415}
416
417static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000418iobase_exit(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000419{
420 return PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL);
421}
422
423/* Lower-level APIs */
424
425/* XXX Should these be present even if unimplemented? */
426
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000427PyDoc_STRVAR(iobase_fileno_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000428 "Returns underlying file descriptor if one exists.\n"
429 "\n"
430 "An IOError is raised if the IO object does not use a file descriptor.\n");
431
432static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000433iobase_fileno(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000434{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000435 return iobase_unsupported("fileno");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000436}
437
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000438PyDoc_STRVAR(iobase_isatty_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000439 "Return whether this is an 'interactive' stream.\n"
440 "\n"
441 "Return False if it can't be determined.\n");
442
443static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000444iobase_isatty(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000445{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000446 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000447 return NULL;
448 Py_RETURN_FALSE;
449}
450
451/* Readline(s) and writelines */
452
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000453PyDoc_STRVAR(iobase_readline_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000454 "Read and return a line from the stream.\n"
455 "\n"
456 "If limit is specified, at most limit bytes will be read.\n"
457 "\n"
458 "The line terminator is always b'\n' for binary files; for text\n"
459 "files, the newlines argument to open can be used to select the line\n"
460 "terminator(s) recognized.\n");
461
462static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000463iobase_readline(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000464{
465 /* For backwards compatibility, a (slowish) readline(). */
466
467 Py_ssize_t limit = -1;
468 int has_peek = 0;
469 PyObject *buffer, *result;
470 Py_ssize_t old_size = -1;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200471 _Py_IDENTIFIER(read);
Martin v. Löwis767046a2011-10-14 15:35:36 +0200472 _Py_IDENTIFIER(peek);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000473
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000474 if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000475 return NULL;
476 }
477
Martin v. Löwis767046a2011-10-14 15:35:36 +0200478 if (_PyObject_HasAttrId(self, &PyId_peek))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000479 has_peek = 1;
480
481 buffer = PyByteArray_FromStringAndSize(NULL, 0);
482 if (buffer == NULL)
483 return NULL;
484
485 while (limit < 0 || Py_SIZE(buffer) < limit) {
486 Py_ssize_t nreadahead = 1;
487 PyObject *b;
488
489 if (has_peek) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200490 _Py_IDENTIFIER(peek);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200491 PyObject *readahead = _PyObject_CallMethodId(self, &PyId_peek, "i", 1);
492
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000493 if (readahead == NULL)
494 goto fail;
495 if (!PyBytes_Check(readahead)) {
496 PyErr_Format(PyExc_IOError,
497 "peek() should have returned a bytes object, "
498 "not '%.200s'", Py_TYPE(readahead)->tp_name);
499 Py_DECREF(readahead);
500 goto fail;
501 }
502 if (PyBytes_GET_SIZE(readahead) > 0) {
503 Py_ssize_t n = 0;
504 const char *buf = PyBytes_AS_STRING(readahead);
505 if (limit >= 0) {
506 do {
507 if (n >= PyBytes_GET_SIZE(readahead) || n >= limit)
508 break;
509 if (buf[n++] == '\n')
510 break;
511 } while (1);
512 }
513 else {
514 do {
515 if (n >= PyBytes_GET_SIZE(readahead))
516 break;
517 if (buf[n++] == '\n')
518 break;
519 } while (1);
520 }
521 nreadahead = n;
522 }
523 Py_DECREF(readahead);
524 }
525
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200526 b = _PyObject_CallMethodId(self, &PyId_read, "n", nreadahead);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000527 if (b == NULL)
528 goto fail;
529 if (!PyBytes_Check(b)) {
530 PyErr_Format(PyExc_IOError,
531 "read() should have returned a bytes object, "
532 "not '%.200s'", Py_TYPE(b)->tp_name);
533 Py_DECREF(b);
534 goto fail;
535 }
536 if (PyBytes_GET_SIZE(b) == 0) {
537 Py_DECREF(b);
538 break;
539 }
540
541 old_size = PyByteArray_GET_SIZE(buffer);
542 PyByteArray_Resize(buffer, old_size + PyBytes_GET_SIZE(b));
543 memcpy(PyByteArray_AS_STRING(buffer) + old_size,
544 PyBytes_AS_STRING(b), PyBytes_GET_SIZE(b));
545
546 Py_DECREF(b);
547
548 if (PyByteArray_AS_STRING(buffer)[PyByteArray_GET_SIZE(buffer) - 1] == '\n')
549 break;
550 }
551
552 result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(buffer),
553 PyByteArray_GET_SIZE(buffer));
554 Py_DECREF(buffer);
555 return result;
556 fail:
557 Py_DECREF(buffer);
558 return NULL;
559}
560
561static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000562iobase_iter(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000563{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000564 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000565 return NULL;
566
567 Py_INCREF(self);
568 return self;
569}
570
571static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000572iobase_iternext(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000573{
574 PyObject *line = PyObject_CallMethodObjArgs(self, _PyIO_str_readline, NULL);
575
576 if (line == NULL)
577 return NULL;
578
579 if (PyObject_Size(line) == 0) {
580 Py_DECREF(line);
581 return NULL;
582 }
583
584 return line;
585}
586
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000587PyDoc_STRVAR(iobase_readlines_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000588 "Return a list of lines from the stream.\n"
589 "\n"
590 "hint can be specified to control the number of lines read: no more\n"
591 "lines will be read if the total size (in bytes/characters) of all\n"
592 "lines so far exceeds hint.");
593
594static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000595iobase_readlines(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000596{
597 Py_ssize_t hint = -1, length = 0;
Benjamin Peterson05516132009-12-13 19:28:09 +0000598 PyObject *result;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000599
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000600 if (!PyArg_ParseTuple(args, "|O&:readlines", &_PyIO_ConvertSsize_t, &hint)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000601 return NULL;
602 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000603
604 result = PyList_New(0);
605 if (result == NULL)
606 return NULL;
607
608 if (hint <= 0) {
609 /* XXX special-casing this made sense in the Python version in order
610 to remove the bytecode interpretation overhead, but it could
611 probably be removed here. */
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200612 _Py_IDENTIFIER(extend);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200613 PyObject *ret = _PyObject_CallMethodId(result, &PyId_extend, "O", self);
614
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000615 if (ret == NULL) {
616 Py_DECREF(result);
617 return NULL;
618 }
619 Py_DECREF(ret);
620 return result;
621 }
622
623 while (1) {
624 PyObject *line = PyIter_Next(self);
625 if (line == NULL) {
626 if (PyErr_Occurred()) {
627 Py_DECREF(result);
628 return NULL;
629 }
630 else
631 break; /* StopIteration raised */
632 }
633
634 if (PyList_Append(result, line) < 0) {
635 Py_DECREF(line);
636 Py_DECREF(result);
637 return NULL;
638 }
639 length += PyObject_Size(line);
640 Py_DECREF(line);
641
642 if (length > hint)
643 break;
644 }
645 return result;
646}
647
648static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000649iobase_writelines(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000650{
651 PyObject *lines, *iter, *res;
652
653 if (!PyArg_ParseTuple(args, "O:writelines", &lines)) {
654 return NULL;
655 }
656
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000657 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000658 return NULL;
659
660 iter = PyObject_GetIter(lines);
661 if (iter == NULL)
662 return NULL;
663
664 while (1) {
665 PyObject *line = PyIter_Next(iter);
666 if (line == NULL) {
667 if (PyErr_Occurred()) {
668 Py_DECREF(iter);
669 return NULL;
670 }
671 else
672 break; /* Stop Iteration */
673 }
674
675 res = PyObject_CallMethodObjArgs(self, _PyIO_str_write, line, NULL);
676 Py_DECREF(line);
677 if (res == NULL) {
678 Py_DECREF(iter);
679 return NULL;
680 }
681 Py_DECREF(res);
682 }
683 Py_DECREF(iter);
684 Py_RETURN_NONE;
685}
686
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000687static PyMethodDef iobase_methods[] = {
688 {"seek", iobase_seek, METH_VARARGS, iobase_seek_doc},
689 {"tell", iobase_tell, METH_NOARGS, iobase_tell_doc},
690 {"truncate", iobase_truncate, METH_VARARGS, iobase_truncate_doc},
691 {"flush", iobase_flush, METH_NOARGS, iobase_flush_doc},
692 {"close", iobase_close, METH_NOARGS, iobase_close_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000693
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000694 {"seekable", iobase_seekable, METH_NOARGS, iobase_seekable_doc},
695 {"readable", iobase_readable, METH_NOARGS, iobase_readable_doc},
696 {"writable", iobase_writable, METH_NOARGS, iobase_writable_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000697
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000698 {"_checkClosed", _PyIOBase_check_closed, METH_NOARGS},
699 {"_checkSeekable", _PyIOBase_check_seekable, METH_NOARGS},
700 {"_checkReadable", _PyIOBase_check_readable, METH_NOARGS},
701 {"_checkWritable", _PyIOBase_check_writable, METH_NOARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000702
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000703 {"fileno", iobase_fileno, METH_NOARGS, iobase_fileno_doc},
704 {"isatty", iobase_isatty, METH_NOARGS, iobase_isatty_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000705
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000706 {"__enter__", iobase_enter, METH_NOARGS},
707 {"__exit__", iobase_exit, METH_VARARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000708
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000709 {"readline", iobase_readline, METH_VARARGS, iobase_readline_doc},
710 {"readlines", iobase_readlines, METH_VARARGS, iobase_readlines_doc},
711 {"writelines", iobase_writelines, METH_VARARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000712
713 {NULL, NULL}
714};
715
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000716static PyGetSetDef iobase_getset[] = {
Benjamin Petersonf22913b2011-09-06 07:55:34 -0400717 {"__dict__", (getter)iobase_get_dict, NULL, NULL},
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000718 {"closed", (getter)iobase_closed_get, NULL, NULL},
Benjamin Peterson1fea3212009-04-19 03:15:20 +0000719 {NULL}
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000720};
721
722
723PyTypeObject PyIOBase_Type = {
724 PyVarObject_HEAD_INIT(NULL, 0)
725 "_io._IOBase", /*tp_name*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000726 sizeof(iobase), /*tp_basicsize*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000727 0, /*tp_itemsize*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000728 (destructor)iobase_dealloc, /*tp_dealloc*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000729 0, /*tp_print*/
730 0, /*tp_getattr*/
731 0, /*tp_setattr*/
732 0, /*tp_compare */
733 0, /*tp_repr*/
734 0, /*tp_as_number*/
735 0, /*tp_as_sequence*/
736 0, /*tp_as_mapping*/
737 0, /*tp_hash */
738 0, /*tp_call*/
739 0, /*tp_str*/
740 0, /*tp_getattro*/
741 0, /*tp_setattro*/
742 0, /*tp_as_buffer*/
743 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
744 | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000745 iobase_doc, /* tp_doc */
746 (traverseproc)iobase_traverse, /* tp_traverse */
747 (inquiry)iobase_clear, /* tp_clear */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000748 0, /* tp_richcompare */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000749 offsetof(iobase, weakreflist), /* tp_weaklistoffset */
750 iobase_iter, /* tp_iter */
751 iobase_iternext, /* tp_iternext */
752 iobase_methods, /* tp_methods */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000753 0, /* tp_members */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000754 iobase_getset, /* tp_getset */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000755 0, /* tp_base */
756 0, /* tp_dict */
757 0, /* tp_descr_get */
758 0, /* tp_descr_set */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000759 offsetof(iobase, dict), /* tp_dictoffset */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000760 0, /* tp_init */
761 0, /* tp_alloc */
762 PyType_GenericNew, /* tp_new */
763};
764
765
766/*
767 * RawIOBase class, Inherits from IOBase.
768 */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000769PyDoc_STRVAR(rawiobase_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000770 "Base class for raw binary I/O.");
771
772/*
773 * The read() method is implemented by calling readinto(); derived classes
774 * that want to support read() only need to implement readinto() as a
775 * primitive operation. In general, readinto() can be more efficient than
776 * read().
777 *
778 * (It would be tempting to also provide an implementation of readinto() in
779 * terms of read(), in case the latter is a more suitable primitive operation,
780 * but that would lead to nasty recursion in case a subclass doesn't implement
781 * either.)
782*/
783
784static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000785rawiobase_read(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000786{
787 Py_ssize_t n = -1;
788 PyObject *b, *res;
789
790 if (!PyArg_ParseTuple(args, "|n:read", &n)) {
791 return NULL;
792 }
793
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200794 if (n < 0) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200795 _Py_IDENTIFIER(readall);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200796
797 return _PyObject_CallMethodId(self, &PyId_readall, NULL);
798 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000799
800 /* TODO: allocate a bytes object directly instead and manually construct
801 a writable memoryview pointing to it. */
802 b = PyByteArray_FromStringAndSize(NULL, n);
803 if (b == NULL)
804 return NULL;
805
806 res = PyObject_CallMethodObjArgs(self, _PyIO_str_readinto, b, NULL);
Antoine Pitrou328ec742010-09-14 18:37:24 +0000807 if (res == NULL || res == Py_None) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000808 Py_DECREF(b);
Antoine Pitrou328ec742010-09-14 18:37:24 +0000809 return res;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000810 }
811
812 n = PyNumber_AsSsize_t(res, PyExc_ValueError);
813 Py_DECREF(res);
814 if (n == -1 && PyErr_Occurred()) {
815 Py_DECREF(b);
816 return NULL;
817 }
818
819 res = PyBytes_FromStringAndSize(PyByteArray_AsString(b), n);
820 Py_DECREF(b);
821 return res;
822}
823
824
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000825PyDoc_STRVAR(rawiobase_readall_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000826 "Read until EOF, using multiple read() call.");
827
828static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000829rawiobase_readall(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000830{
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000831 int r;
832 PyObject *chunks = PyList_New(0);
833 PyObject *result;
834
835 if (chunks == NULL)
836 return NULL;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000837
838 while (1) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200839 _Py_IDENTIFIER(read);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200840 PyObject *data = _PyObject_CallMethodId(self, &PyId_read,
841 "i", DEFAULT_BUFFER_SIZE);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000842 if (!data) {
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000843 Py_DECREF(chunks);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000844 return NULL;
845 }
Victor Stinnera80987f2011-05-25 22:47:16 +0200846 if (data == Py_None) {
847 if (PyList_GET_SIZE(chunks) == 0) {
848 Py_DECREF(chunks);
849 return data;
850 }
851 Py_DECREF(data);
852 break;
853 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000854 if (!PyBytes_Check(data)) {
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000855 Py_DECREF(chunks);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000856 Py_DECREF(data);
857 PyErr_SetString(PyExc_TypeError, "read() should return bytes");
858 return NULL;
859 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000860 if (PyBytes_GET_SIZE(data) == 0) {
861 /* EOF */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000862 Py_DECREF(data);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000863 break;
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000864 }
865 r = PyList_Append(chunks, data);
866 Py_DECREF(data);
867 if (r < 0) {
868 Py_DECREF(chunks);
869 return NULL;
870 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000871 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000872 result = _PyBytes_Join(_PyIO_empty_bytes, chunks);
873 Py_DECREF(chunks);
874 return result;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000875}
876
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000877static PyMethodDef rawiobase_methods[] = {
878 {"read", rawiobase_read, METH_VARARGS},
879 {"readall", rawiobase_readall, METH_NOARGS, rawiobase_readall_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000880 {NULL, NULL}
881};
882
883PyTypeObject PyRawIOBase_Type = {
884 PyVarObject_HEAD_INIT(NULL, 0)
885 "_io._RawIOBase", /*tp_name*/
886 0, /*tp_basicsize*/
887 0, /*tp_itemsize*/
888 0, /*tp_dealloc*/
889 0, /*tp_print*/
890 0, /*tp_getattr*/
891 0, /*tp_setattr*/
892 0, /*tp_compare */
893 0, /*tp_repr*/
894 0, /*tp_as_number*/
895 0, /*tp_as_sequence*/
896 0, /*tp_as_mapping*/
897 0, /*tp_hash */
898 0, /*tp_call*/
899 0, /*tp_str*/
900 0, /*tp_getattro*/
901 0, /*tp_setattro*/
902 0, /*tp_as_buffer*/
903 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000904 rawiobase_doc, /* tp_doc */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000905 0, /* tp_traverse */
906 0, /* tp_clear */
907 0, /* tp_richcompare */
908 0, /* tp_weaklistoffset */
909 0, /* tp_iter */
910 0, /* tp_iternext */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000911 rawiobase_methods, /* tp_methods */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000912 0, /* tp_members */
913 0, /* tp_getset */
914 &PyIOBase_Type, /* tp_base */
915 0, /* tp_dict */
916 0, /* tp_descr_get */
917 0, /* tp_descr_set */
918 0, /* tp_dictoffset */
919 0, /* tp_init */
920 0, /* tp_alloc */
921 0, /* tp_new */
922};