blob: dd052ae6e9d586a2bc35f20095def338a053a533 [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
162PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000163_PyIOBase_check_closed(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000164{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000165 if (iobase_closed(self)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000166 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file.");
167 return NULL;
168 }
169 if (args == Py_True)
170 return Py_None;
171 else
172 Py_RETURN_NONE;
173}
174
175/* XXX: IOBase thinks it has to maintain its own internal state in
176 `__IOBase_closed` and call flush() by itself, but it is redundant with
177 whatever behaviour a non-trivial derived class will implement. */
178
179static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000180iobase_close(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000181{
182 PyObject *res;
Martin v. Löwis767046a2011-10-14 15:35:36 +0200183 _Py_IDENTIFIER(__IOBase_closed);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000184
185 if (IS_CLOSED(self))
186 Py_RETURN_NONE;
187
188 res = PyObject_CallMethodObjArgs(self, _PyIO_str_flush, NULL);
Martin v. Löwis767046a2011-10-14 15:35:36 +0200189 _PyObject_SetAttrId(self, &PyId___IOBase_closed, Py_True);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000190 if (res == NULL) {
Antoine Pitrou6be88762010-05-03 16:48:20 +0000191 return NULL;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000192 }
193 Py_XDECREF(res);
194 Py_RETURN_NONE;
195}
196
197/* Finalization and garbage collection support */
198
199int
200_PyIOBase_finalize(PyObject *self)
201{
202 PyObject *res;
203 PyObject *tp, *v, *tb;
204 int closed = 1;
205 int is_zombie;
206
207 /* If _PyIOBase_finalize() is called from a destructor, we need to
208 resurrect the object as calling close() can invoke arbitrary code. */
209 is_zombie = (Py_REFCNT(self) == 0);
210 if (is_zombie) {
211 ++Py_REFCNT(self);
212 }
213 PyErr_Fetch(&tp, &v, &tb);
214 /* If `closed` doesn't exist or can't be evaluated as bool, then the
215 object is probably in an unusable state, so ignore. */
216 res = PyObject_GetAttr(self, _PyIO_str_closed);
217 if (res == NULL)
218 PyErr_Clear();
219 else {
220 closed = PyObject_IsTrue(res);
221 Py_DECREF(res);
222 if (closed == -1)
223 PyErr_Clear();
224 }
225 if (closed == 0) {
226 res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_close,
227 NULL);
228 /* Silencing I/O errors is bad, but printing spurious tracebacks is
229 equally as bad, and potentially more frequent (because of
230 shutdown issues). */
231 if (res == NULL)
232 PyErr_Clear();
233 else
234 Py_DECREF(res);
235 }
236 PyErr_Restore(tp, v, tb);
237 if (is_zombie) {
238 if (--Py_REFCNT(self) != 0) {
239 /* The object lives again. The following code is taken from
240 slot_tp_del in typeobject.c. */
241 Py_ssize_t refcnt = Py_REFCNT(self);
242 _Py_NewReference(self);
243 Py_REFCNT(self) = refcnt;
244 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
245 * we need to undo that. */
246 _Py_DEC_REFTOTAL;
247 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
248 * chain, so no more to do there.
249 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
250 * _Py_NewReference bumped tp_allocs: both of those need to be
251 * undone.
252 */
253#ifdef COUNT_ALLOCS
254 --Py_TYPE(self)->tp_frees;
255 --Py_TYPE(self)->tp_allocs;
256#endif
257 return -1;
258 }
259 }
260 return 0;
261}
262
263static int
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000264iobase_traverse(iobase *self, visitproc visit, void *arg)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000265{
266 Py_VISIT(self->dict);
267 return 0;
268}
269
270static int
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000271iobase_clear(iobase *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000272{
273 if (_PyIOBase_finalize((PyObject *) self) < 0)
274 return -1;
275 Py_CLEAR(self->dict);
276 return 0;
277}
278
279/* Destructor */
280
281static void
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000282iobase_dealloc(iobase *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000283{
284 /* NOTE: since IOBaseObject has its own dict, Python-defined attributes
285 are still available here for close() to use.
286 However, if the derived class declares a __slots__, those slots are
287 already gone.
288 */
289 if (_PyIOBase_finalize((PyObject *) self) < 0) {
290 /* When called from a heap type's dealloc, the type will be
291 decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */
292 if (PyType_HasFeature(Py_TYPE(self), Py_TPFLAGS_HEAPTYPE))
293 Py_INCREF(Py_TYPE(self));
294 return;
295 }
296 _PyObject_GC_UNTRACK(self);
297 if (self->weakreflist != NULL)
298 PyObject_ClearWeakRefs((PyObject *) self);
299 Py_CLEAR(self->dict);
300 Py_TYPE(self)->tp_free((PyObject *) self);
301}
302
303/* Inquiry methods */
304
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000305PyDoc_STRVAR(iobase_seekable_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000306 "Return whether object supports random access.\n"
307 "\n"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +0000308 "If False, seek(), tell() and truncate() will raise UnsupportedOperation.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000309 "This method may need to do a test seek().");
310
311static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000312iobase_seekable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000313{
314 Py_RETURN_FALSE;
315}
316
317PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000318_PyIOBase_check_seekable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000319{
320 PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_seekable, NULL);
321 if (res == NULL)
322 return NULL;
323 if (res != Py_True) {
324 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000325 iobase_unsupported("File or stream is not seekable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000326 return NULL;
327 }
328 if (args == Py_True) {
329 Py_DECREF(res);
330 }
331 return res;
332}
333
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000334PyDoc_STRVAR(iobase_readable_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000335 "Return whether object was opened for reading.\n"
336 "\n"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +0000337 "If False, read() will raise UnsupportedOperation.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000338
339static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000340iobase_readable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000341{
342 Py_RETURN_FALSE;
343}
344
345/* May be called with any object */
346PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000347_PyIOBase_check_readable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000348{
349 PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_readable, NULL);
350 if (res == NULL)
351 return NULL;
352 if (res != Py_True) {
353 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000354 iobase_unsupported("File or stream is not readable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000355 return NULL;
356 }
357 if (args == Py_True) {
358 Py_DECREF(res);
359 }
360 return res;
361}
362
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000363PyDoc_STRVAR(iobase_writable_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000364 "Return whether object was opened for writing.\n"
365 "\n"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +0000366 "If False, write() will raise UnsupportedOperation.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000367
368static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000369iobase_writable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000370{
371 Py_RETURN_FALSE;
372}
373
374/* May be called with any object */
375PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000376_PyIOBase_check_writable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000377{
378 PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_writable, NULL);
379 if (res == NULL)
380 return NULL;
381 if (res != Py_True) {
382 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000383 iobase_unsupported("File or stream is not writable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000384 return NULL;
385 }
386 if (args == Py_True) {
387 Py_DECREF(res);
388 }
389 return res;
390}
391
392/* Context manager */
393
394static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000395iobase_enter(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000396{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000397 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000398 return NULL;
399
400 Py_INCREF(self);
401 return self;
402}
403
404static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000405iobase_exit(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000406{
407 return PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL);
408}
409
410/* Lower-level APIs */
411
412/* XXX Should these be present even if unimplemented? */
413
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000414PyDoc_STRVAR(iobase_fileno_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000415 "Returns underlying file descriptor if one exists.\n"
416 "\n"
417 "An IOError is raised if the IO object does not use a file descriptor.\n");
418
419static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000420iobase_fileno(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000421{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000422 return iobase_unsupported("fileno");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000423}
424
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000425PyDoc_STRVAR(iobase_isatty_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000426 "Return whether this is an 'interactive' stream.\n"
427 "\n"
428 "Return False if it can't be determined.\n");
429
430static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000431iobase_isatty(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000432{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000433 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000434 return NULL;
435 Py_RETURN_FALSE;
436}
437
438/* Readline(s) and writelines */
439
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000440PyDoc_STRVAR(iobase_readline_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000441 "Read and return a line from the stream.\n"
442 "\n"
443 "If limit is specified, at most limit bytes will be read.\n"
444 "\n"
445 "The line terminator is always b'\n' for binary files; for text\n"
446 "files, the newlines argument to open can be used to select the line\n"
447 "terminator(s) recognized.\n");
448
449static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000450iobase_readline(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000451{
452 /* For backwards compatibility, a (slowish) readline(). */
453
454 Py_ssize_t limit = -1;
455 int has_peek = 0;
456 PyObject *buffer, *result;
457 Py_ssize_t old_size = -1;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200458 _Py_IDENTIFIER(read);
Martin v. Löwis767046a2011-10-14 15:35:36 +0200459 _Py_IDENTIFIER(peek);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000460
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000461 if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000462 return NULL;
463 }
464
Martin v. Löwis767046a2011-10-14 15:35:36 +0200465 if (_PyObject_HasAttrId(self, &PyId_peek))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000466 has_peek = 1;
467
468 buffer = PyByteArray_FromStringAndSize(NULL, 0);
469 if (buffer == NULL)
470 return NULL;
471
472 while (limit < 0 || Py_SIZE(buffer) < limit) {
473 Py_ssize_t nreadahead = 1;
474 PyObject *b;
475
476 if (has_peek) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200477 PyObject *readahead = _PyObject_CallMethodId(self, &PyId_peek, "i", 1);
Gregory P. Smith51359922012-06-23 23:55:39 -0700478 if (readahead == NULL) {
479 /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
480 when EINTR occurs so we needn't do it ourselves. */
481 if (_PyIO_trap_eintr()) {
482 continue;
483 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000484 goto fail;
Gregory P. Smith51359922012-06-23 23:55:39 -0700485 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000486 if (!PyBytes_Check(readahead)) {
487 PyErr_Format(PyExc_IOError,
488 "peek() should have returned a bytes object, "
489 "not '%.200s'", Py_TYPE(readahead)->tp_name);
490 Py_DECREF(readahead);
491 goto fail;
492 }
493 if (PyBytes_GET_SIZE(readahead) > 0) {
494 Py_ssize_t n = 0;
495 const char *buf = PyBytes_AS_STRING(readahead);
496 if (limit >= 0) {
497 do {
498 if (n >= PyBytes_GET_SIZE(readahead) || n >= limit)
499 break;
500 if (buf[n++] == '\n')
501 break;
502 } while (1);
503 }
504 else {
505 do {
506 if (n >= PyBytes_GET_SIZE(readahead))
507 break;
508 if (buf[n++] == '\n')
509 break;
510 } while (1);
511 }
512 nreadahead = n;
513 }
514 Py_DECREF(readahead);
515 }
516
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200517 b = _PyObject_CallMethodId(self, &PyId_read, "n", nreadahead);
Gregory P. Smith51359922012-06-23 23:55:39 -0700518 if (b == NULL) {
519 /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
520 when EINTR occurs so we needn't do it ourselves. */
521 if (_PyIO_trap_eintr()) {
522 continue;
523 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000524 goto fail;
Gregory P. Smith51359922012-06-23 23:55:39 -0700525 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000526 if (!PyBytes_Check(b)) {
527 PyErr_Format(PyExc_IOError,
528 "read() should have returned a bytes object, "
529 "not '%.200s'", Py_TYPE(b)->tp_name);
530 Py_DECREF(b);
531 goto fail;
532 }
533 if (PyBytes_GET_SIZE(b) == 0) {
534 Py_DECREF(b);
535 break;
536 }
537
538 old_size = PyByteArray_GET_SIZE(buffer);
539 PyByteArray_Resize(buffer, old_size + PyBytes_GET_SIZE(b));
540 memcpy(PyByteArray_AS_STRING(buffer) + old_size,
541 PyBytes_AS_STRING(b), PyBytes_GET_SIZE(b));
542
543 Py_DECREF(b);
544
545 if (PyByteArray_AS_STRING(buffer)[PyByteArray_GET_SIZE(buffer) - 1] == '\n')
546 break;
547 }
548
549 result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(buffer),
550 PyByteArray_GET_SIZE(buffer));
551 Py_DECREF(buffer);
552 return result;
553 fail:
554 Py_DECREF(buffer);
555 return NULL;
556}
557
558static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000559iobase_iter(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000560{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000561 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000562 return NULL;
563
564 Py_INCREF(self);
565 return self;
566}
567
568static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000569iobase_iternext(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000570{
571 PyObject *line = PyObject_CallMethodObjArgs(self, _PyIO_str_readline, NULL);
572
573 if (line == NULL)
574 return NULL;
575
576 if (PyObject_Size(line) == 0) {
577 Py_DECREF(line);
578 return NULL;
579 }
580
581 return line;
582}
583
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000584PyDoc_STRVAR(iobase_readlines_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000585 "Return a list of lines from the stream.\n"
586 "\n"
587 "hint can be specified to control the number of lines read: no more\n"
588 "lines will be read if the total size (in bytes/characters) of all\n"
589 "lines so far exceeds hint.");
590
591static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000592iobase_readlines(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000593{
594 Py_ssize_t hint = -1, length = 0;
Benjamin Peterson05516132009-12-13 19:28:09 +0000595 PyObject *result;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000596
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000597 if (!PyArg_ParseTuple(args, "|O&:readlines", &_PyIO_ConvertSsize_t, &hint)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000598 return NULL;
599 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000600
601 result = PyList_New(0);
602 if (result == NULL)
603 return NULL;
604
605 if (hint <= 0) {
606 /* XXX special-casing this made sense in the Python version in order
607 to remove the bytecode interpretation overhead, but it could
608 probably be removed here. */
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200609 _Py_IDENTIFIER(extend);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200610 PyObject *ret = _PyObject_CallMethodId(result, &PyId_extend, "O", self);
611
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000612 if (ret == NULL) {
613 Py_DECREF(result);
614 return NULL;
615 }
616 Py_DECREF(ret);
617 return result;
618 }
619
620 while (1) {
621 PyObject *line = PyIter_Next(self);
622 if (line == NULL) {
623 if (PyErr_Occurred()) {
624 Py_DECREF(result);
625 return NULL;
626 }
627 else
628 break; /* StopIteration raised */
629 }
630
631 if (PyList_Append(result, line) < 0) {
632 Py_DECREF(line);
633 Py_DECREF(result);
634 return NULL;
635 }
636 length += PyObject_Size(line);
637 Py_DECREF(line);
638
639 if (length > hint)
640 break;
641 }
642 return result;
643}
644
645static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000646iobase_writelines(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000647{
648 PyObject *lines, *iter, *res;
649
650 if (!PyArg_ParseTuple(args, "O:writelines", &lines)) {
651 return NULL;
652 }
653
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000654 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000655 return NULL;
656
657 iter = PyObject_GetIter(lines);
658 if (iter == NULL)
659 return NULL;
660
661 while (1) {
662 PyObject *line = PyIter_Next(iter);
663 if (line == NULL) {
664 if (PyErr_Occurred()) {
665 Py_DECREF(iter);
666 return NULL;
667 }
668 else
669 break; /* Stop Iteration */
670 }
671
672 res = PyObject_CallMethodObjArgs(self, _PyIO_str_write, line, NULL);
673 Py_DECREF(line);
674 if (res == NULL) {
675 Py_DECREF(iter);
676 return NULL;
677 }
678 Py_DECREF(res);
679 }
680 Py_DECREF(iter);
681 Py_RETURN_NONE;
682}
683
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000684static PyMethodDef iobase_methods[] = {
685 {"seek", iobase_seek, METH_VARARGS, iobase_seek_doc},
686 {"tell", iobase_tell, METH_NOARGS, iobase_tell_doc},
687 {"truncate", iobase_truncate, METH_VARARGS, iobase_truncate_doc},
688 {"flush", iobase_flush, METH_NOARGS, iobase_flush_doc},
689 {"close", iobase_close, METH_NOARGS, iobase_close_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000690
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000691 {"seekable", iobase_seekable, METH_NOARGS, iobase_seekable_doc},
692 {"readable", iobase_readable, METH_NOARGS, iobase_readable_doc},
693 {"writable", iobase_writable, METH_NOARGS, iobase_writable_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000694
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000695 {"_checkClosed", _PyIOBase_check_closed, METH_NOARGS},
696 {"_checkSeekable", _PyIOBase_check_seekable, METH_NOARGS},
697 {"_checkReadable", _PyIOBase_check_readable, METH_NOARGS},
698 {"_checkWritable", _PyIOBase_check_writable, METH_NOARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000699
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000700 {"fileno", iobase_fileno, METH_NOARGS, iobase_fileno_doc},
701 {"isatty", iobase_isatty, METH_NOARGS, iobase_isatty_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000702
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000703 {"__enter__", iobase_enter, METH_NOARGS},
704 {"__exit__", iobase_exit, METH_VARARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000705
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000706 {"readline", iobase_readline, METH_VARARGS, iobase_readline_doc},
707 {"readlines", iobase_readlines, METH_VARARGS, iobase_readlines_doc},
708 {"writelines", iobase_writelines, METH_VARARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000709
710 {NULL, NULL}
711};
712
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000713static PyGetSetDef iobase_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500714 {"__dict__", PyObject_GenericGetDict, NULL, NULL},
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000715 {"closed", (getter)iobase_closed_get, NULL, NULL},
Benjamin Peterson1fea3212009-04-19 03:15:20 +0000716 {NULL}
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000717};
718
719
720PyTypeObject PyIOBase_Type = {
721 PyVarObject_HEAD_INIT(NULL, 0)
722 "_io._IOBase", /*tp_name*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000723 sizeof(iobase), /*tp_basicsize*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000724 0, /*tp_itemsize*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000725 (destructor)iobase_dealloc, /*tp_dealloc*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000726 0, /*tp_print*/
727 0, /*tp_getattr*/
728 0, /*tp_setattr*/
729 0, /*tp_compare */
730 0, /*tp_repr*/
731 0, /*tp_as_number*/
732 0, /*tp_as_sequence*/
733 0, /*tp_as_mapping*/
734 0, /*tp_hash */
735 0, /*tp_call*/
736 0, /*tp_str*/
737 0, /*tp_getattro*/
738 0, /*tp_setattro*/
739 0, /*tp_as_buffer*/
740 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
741 | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000742 iobase_doc, /* tp_doc */
743 (traverseproc)iobase_traverse, /* tp_traverse */
744 (inquiry)iobase_clear, /* tp_clear */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000745 0, /* tp_richcompare */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000746 offsetof(iobase, weakreflist), /* tp_weaklistoffset */
747 iobase_iter, /* tp_iter */
748 iobase_iternext, /* tp_iternext */
749 iobase_methods, /* tp_methods */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000750 0, /* tp_members */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000751 iobase_getset, /* tp_getset */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000752 0, /* tp_base */
753 0, /* tp_dict */
754 0, /* tp_descr_get */
755 0, /* tp_descr_set */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000756 offsetof(iobase, dict), /* tp_dictoffset */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000757 0, /* tp_init */
758 0, /* tp_alloc */
759 PyType_GenericNew, /* tp_new */
760};
761
762
763/*
764 * RawIOBase class, Inherits from IOBase.
765 */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000766PyDoc_STRVAR(rawiobase_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000767 "Base class for raw binary I/O.");
768
769/*
770 * The read() method is implemented by calling readinto(); derived classes
771 * that want to support read() only need to implement readinto() as a
772 * primitive operation. In general, readinto() can be more efficient than
773 * read().
774 *
775 * (It would be tempting to also provide an implementation of readinto() in
776 * terms of read(), in case the latter is a more suitable primitive operation,
777 * but that would lead to nasty recursion in case a subclass doesn't implement
778 * either.)
779*/
780
781static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000782rawiobase_read(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000783{
784 Py_ssize_t n = -1;
785 PyObject *b, *res;
786
787 if (!PyArg_ParseTuple(args, "|n:read", &n)) {
788 return NULL;
789 }
790
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200791 if (n < 0) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200792 _Py_IDENTIFIER(readall);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200793
794 return _PyObject_CallMethodId(self, &PyId_readall, NULL);
795 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000796
797 /* TODO: allocate a bytes object directly instead and manually construct
798 a writable memoryview pointing to it. */
799 b = PyByteArray_FromStringAndSize(NULL, n);
800 if (b == NULL)
801 return NULL;
802
803 res = PyObject_CallMethodObjArgs(self, _PyIO_str_readinto, b, NULL);
Antoine Pitrou328ec742010-09-14 18:37:24 +0000804 if (res == NULL || res == Py_None) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000805 Py_DECREF(b);
Antoine Pitrou328ec742010-09-14 18:37:24 +0000806 return res;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000807 }
808
809 n = PyNumber_AsSsize_t(res, PyExc_ValueError);
810 Py_DECREF(res);
811 if (n == -1 && PyErr_Occurred()) {
812 Py_DECREF(b);
813 return NULL;
814 }
815
816 res = PyBytes_FromStringAndSize(PyByteArray_AsString(b), n);
817 Py_DECREF(b);
818 return res;
819}
820
821
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000822PyDoc_STRVAR(rawiobase_readall_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000823 "Read until EOF, using multiple read() call.");
824
825static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000826rawiobase_readall(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000827{
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000828 int r;
829 PyObject *chunks = PyList_New(0);
830 PyObject *result;
831
832 if (chunks == NULL)
833 return NULL;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000834
835 while (1) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200836 _Py_IDENTIFIER(read);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200837 PyObject *data = _PyObject_CallMethodId(self, &PyId_read,
838 "i", DEFAULT_BUFFER_SIZE);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000839 if (!data) {
Gregory P. Smith51359922012-06-23 23:55:39 -0700840 /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
841 when EINTR occurs so we needn't do it ourselves. */
842 if (_PyIO_trap_eintr()) {
843 continue;
844 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000845 Py_DECREF(chunks);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000846 return NULL;
847 }
Victor Stinnera80987f2011-05-25 22:47:16 +0200848 if (data == Py_None) {
849 if (PyList_GET_SIZE(chunks) == 0) {
850 Py_DECREF(chunks);
851 return data;
852 }
853 Py_DECREF(data);
854 break;
855 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000856 if (!PyBytes_Check(data)) {
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000857 Py_DECREF(chunks);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000858 Py_DECREF(data);
859 PyErr_SetString(PyExc_TypeError, "read() should return bytes");
860 return NULL;
861 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000862 if (PyBytes_GET_SIZE(data) == 0) {
863 /* EOF */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000864 Py_DECREF(data);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000865 break;
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000866 }
867 r = PyList_Append(chunks, data);
868 Py_DECREF(data);
869 if (r < 0) {
870 Py_DECREF(chunks);
871 return NULL;
872 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000873 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000874 result = _PyBytes_Join(_PyIO_empty_bytes, chunks);
875 Py_DECREF(chunks);
876 return result;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000877}
878
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000879static PyMethodDef rawiobase_methods[] = {
880 {"read", rawiobase_read, METH_VARARGS},
881 {"readall", rawiobase_readall, METH_NOARGS, rawiobase_readall_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000882 {NULL, NULL}
883};
884
885PyTypeObject PyRawIOBase_Type = {
886 PyVarObject_HEAD_INIT(NULL, 0)
887 "_io._RawIOBase", /*tp_name*/
888 0, /*tp_basicsize*/
889 0, /*tp_itemsize*/
890 0, /*tp_dealloc*/
891 0, /*tp_print*/
892 0, /*tp_getattr*/
893 0, /*tp_setattr*/
894 0, /*tp_compare */
895 0, /*tp_repr*/
896 0, /*tp_as_number*/
897 0, /*tp_as_sequence*/
898 0, /*tp_as_mapping*/
899 0, /*tp_hash */
900 0, /*tp_call*/
901 0, /*tp_str*/
902 0, /*tp_getattro*/
903 0, /*tp_setattro*/
904 0, /*tp_as_buffer*/
905 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000906 rawiobase_doc, /* tp_doc */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000907 0, /* tp_traverse */
908 0, /* tp_clear */
909 0, /* tp_richcompare */
910 0, /* tp_weaklistoffset */
911 0, /* tp_iter */
912 0, /* tp_iternext */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000913 rawiobase_methods, /* tp_methods */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000914 0, /* tp_members */
915 0, /* tp_getset */
916 &PyIOBase_Type, /* tp_base */
917 0, /* tp_dict */
918 0, /* tp_descr_get */
919 0, /* tp_descr_set */
920 0, /* tp_dictoffset */
921 0, /* tp_init */
922 0, /* tp_alloc */
923 0, /* tp_new */
924};