blob: ae188dd7fe2db375be6147b5c406f3d0d5adcc22 [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"
Terry Jan Reedy0158af32013-03-11 17:42:46 -040079 "Change the stream position to the given byte offset. The offset is\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000080 "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
Antoine Pitrou796564c2013-07-30 19:59:21 +0200199static void
200iobase_finalize(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000201{
202 PyObject *res;
Antoine Pitrou796564c2013-07-30 19:59:21 +0200203 PyObject *error_type, *error_value, *error_traceback;
204 int closed;
205 _Py_IDENTIFIER(_finalizing);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000206
Antoine Pitrou796564c2013-07-30 19:59:21 +0200207 /* Save the current exception, if any. */
208 PyErr_Fetch(&error_type, &error_value, &error_traceback);
209
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000210 /* If `closed` doesn't exist or can't be evaluated as bool, then the
211 object is probably in an unusable state, so ignore. */
212 res = PyObject_GetAttr(self, _PyIO_str_closed);
Christian Heimes72f455e2013-07-31 01:33:50 +0200213 if (res == NULL) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000214 PyErr_Clear();
Christian Heimes72f455e2013-07-31 01:33:50 +0200215 closed = -1;
216 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000217 else {
218 closed = PyObject_IsTrue(res);
219 Py_DECREF(res);
220 if (closed == -1)
221 PyErr_Clear();
222 }
223 if (closed == 0) {
Antoine Pitrou796564c2013-07-30 19:59:21 +0200224 /* Signal close() that it was called as part of the object
225 finalization process. */
226 if (_PyObject_SetAttrId(self, &PyId__finalizing, Py_True))
227 PyErr_Clear();
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000228 res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_close,
229 NULL);
230 /* Silencing I/O errors is bad, but printing spurious tracebacks is
231 equally as bad, and potentially more frequent (because of
232 shutdown issues). */
233 if (res == NULL)
234 PyErr_Clear();
235 else
236 Py_DECREF(res);
237 }
Antoine Pitrou796564c2013-07-30 19:59:21 +0200238
239 /* Restore the saved exception. */
240 PyErr_Restore(error_type, error_value, error_traceback);
241}
242
243int
244_PyIOBase_finalize(PyObject *self)
245{
246 int is_zombie;
247
248 /* If _PyIOBase_finalize() is called from a destructor, we need to
249 resurrect the object as calling close() can invoke arbitrary code. */
250 is_zombie = (Py_REFCNT(self) == 0);
251 if (is_zombie)
252 return PyObject_CallFinalizerFromDealloc(self);
253 else {
254 PyObject_CallFinalizer(self);
255 return 0;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000256 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000257}
258
259static int
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000260iobase_traverse(iobase *self, visitproc visit, void *arg)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000261{
262 Py_VISIT(self->dict);
263 return 0;
264}
265
266static int
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000267iobase_clear(iobase *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000268{
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000269 Py_CLEAR(self->dict);
270 return 0;
271}
272
273/* Destructor */
274
275static void
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000276iobase_dealloc(iobase *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000277{
278 /* NOTE: since IOBaseObject has its own dict, Python-defined attributes
279 are still available here for close() to use.
280 However, if the derived class declares a __slots__, those slots are
281 already gone.
282 */
283 if (_PyIOBase_finalize((PyObject *) self) < 0) {
284 /* When called from a heap type's dealloc, the type will be
285 decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */
286 if (PyType_HasFeature(Py_TYPE(self), Py_TPFLAGS_HEAPTYPE))
287 Py_INCREF(Py_TYPE(self));
288 return;
289 }
290 _PyObject_GC_UNTRACK(self);
291 if (self->weakreflist != NULL)
292 PyObject_ClearWeakRefs((PyObject *) self);
293 Py_CLEAR(self->dict);
294 Py_TYPE(self)->tp_free((PyObject *) self);
295}
296
297/* Inquiry methods */
298
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000299PyDoc_STRVAR(iobase_seekable_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000300 "Return whether object supports random access.\n"
301 "\n"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +0000302 "If False, seek(), tell() and truncate() will raise UnsupportedOperation.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000303 "This method may need to do a test seek().");
304
305static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000306iobase_seekable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000307{
308 Py_RETURN_FALSE;
309}
310
311PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000312_PyIOBase_check_seekable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000313{
314 PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_seekable, NULL);
315 if (res == NULL)
316 return NULL;
317 if (res != Py_True) {
318 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000319 iobase_unsupported("File or stream is not seekable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000320 return NULL;
321 }
322 if (args == Py_True) {
323 Py_DECREF(res);
324 }
325 return res;
326}
327
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000328PyDoc_STRVAR(iobase_readable_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000329 "Return whether object was opened for reading.\n"
330 "\n"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +0000331 "If False, read() will raise UnsupportedOperation.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000332
333static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000334iobase_readable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000335{
336 Py_RETURN_FALSE;
337}
338
339/* May be called with any object */
340PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000341_PyIOBase_check_readable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000342{
343 PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_readable, NULL);
344 if (res == NULL)
345 return NULL;
346 if (res != Py_True) {
347 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000348 iobase_unsupported("File or stream is not readable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000349 return NULL;
350 }
351 if (args == Py_True) {
352 Py_DECREF(res);
353 }
354 return res;
355}
356
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000357PyDoc_STRVAR(iobase_writable_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000358 "Return whether object was opened for writing.\n"
359 "\n"
Amaury Forgeot d'Arc616453c2010-09-06 22:31:52 +0000360 "If False, write() will raise UnsupportedOperation.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000361
362static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000363iobase_writable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000364{
365 Py_RETURN_FALSE;
366}
367
368/* May be called with any object */
369PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000370_PyIOBase_check_writable(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000371{
372 PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_writable, NULL);
373 if (res == NULL)
374 return NULL;
375 if (res != Py_True) {
376 Py_CLEAR(res);
Antoine Pitrou0d739d72010-09-05 23:01:12 +0000377 iobase_unsupported("File or stream is not writable.");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000378 return NULL;
379 }
380 if (args == Py_True) {
381 Py_DECREF(res);
382 }
383 return res;
384}
385
386/* Context manager */
387
388static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000389iobase_enter(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000390{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000391 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000392 return NULL;
393
394 Py_INCREF(self);
395 return self;
396}
397
398static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000399iobase_exit(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000400{
401 return PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL);
402}
403
404/* Lower-level APIs */
405
406/* XXX Should these be present even if unimplemented? */
407
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000408PyDoc_STRVAR(iobase_fileno_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000409 "Returns underlying file descriptor if one exists.\n"
410 "\n"
411 "An IOError is raised if the IO object does not use a file descriptor.\n");
412
413static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000414iobase_fileno(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000415{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000416 return iobase_unsupported("fileno");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000417}
418
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000419PyDoc_STRVAR(iobase_isatty_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000420 "Return whether this is an 'interactive' stream.\n"
421 "\n"
422 "Return False if it can't be determined.\n");
423
424static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000425iobase_isatty(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000426{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000427 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000428 return NULL;
429 Py_RETURN_FALSE;
430}
431
432/* Readline(s) and writelines */
433
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000434PyDoc_STRVAR(iobase_readline_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000435 "Read and return a line from the stream.\n"
436 "\n"
437 "If limit is specified, at most limit bytes will be read.\n"
438 "\n"
Ezio Melotti16d2b472012-09-18 07:20:18 +0300439 "The line terminator is always b'\\n' for binary files; for text\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000440 "files, the newlines argument to open can be used to select the line\n"
441 "terminator(s) recognized.\n");
442
443static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000444iobase_readline(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000445{
446 /* For backwards compatibility, a (slowish) readline(). */
447
448 Py_ssize_t limit = -1;
449 int has_peek = 0;
450 PyObject *buffer, *result;
451 Py_ssize_t old_size = -1;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200452 _Py_IDENTIFIER(read);
Martin v. Löwis767046a2011-10-14 15:35:36 +0200453 _Py_IDENTIFIER(peek);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000454
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000455 if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000456 return NULL;
457 }
458
Martin v. Löwis767046a2011-10-14 15:35:36 +0200459 if (_PyObject_HasAttrId(self, &PyId_peek))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000460 has_peek = 1;
461
462 buffer = PyByteArray_FromStringAndSize(NULL, 0);
463 if (buffer == NULL)
464 return NULL;
465
466 while (limit < 0 || Py_SIZE(buffer) < limit) {
467 Py_ssize_t nreadahead = 1;
468 PyObject *b;
469
470 if (has_peek) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200471 PyObject *readahead = _PyObject_CallMethodId(self, &PyId_peek, "i", 1);
Gregory P. Smith51359922012-06-23 23:55:39 -0700472 if (readahead == NULL) {
473 /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
474 when EINTR occurs so we needn't do it ourselves. */
475 if (_PyIO_trap_eintr()) {
476 continue;
477 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000478 goto fail;
Gregory P. Smith51359922012-06-23 23:55:39 -0700479 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000480 if (!PyBytes_Check(readahead)) {
481 PyErr_Format(PyExc_IOError,
482 "peek() should have returned a bytes object, "
483 "not '%.200s'", Py_TYPE(readahead)->tp_name);
484 Py_DECREF(readahead);
485 goto fail;
486 }
487 if (PyBytes_GET_SIZE(readahead) > 0) {
488 Py_ssize_t n = 0;
489 const char *buf = PyBytes_AS_STRING(readahead);
490 if (limit >= 0) {
491 do {
492 if (n >= PyBytes_GET_SIZE(readahead) || n >= limit)
493 break;
494 if (buf[n++] == '\n')
495 break;
496 } while (1);
497 }
498 else {
499 do {
500 if (n >= PyBytes_GET_SIZE(readahead))
501 break;
502 if (buf[n++] == '\n')
503 break;
504 } while (1);
505 }
506 nreadahead = n;
507 }
508 Py_DECREF(readahead);
509 }
510
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200511 b = _PyObject_CallMethodId(self, &PyId_read, "n", nreadahead);
Gregory P. Smith51359922012-06-23 23:55:39 -0700512 if (b == NULL) {
513 /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
514 when EINTR occurs so we needn't do it ourselves. */
515 if (_PyIO_trap_eintr()) {
516 continue;
517 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000518 goto fail;
Gregory P. Smith51359922012-06-23 23:55:39 -0700519 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000520 if (!PyBytes_Check(b)) {
521 PyErr_Format(PyExc_IOError,
522 "read() should have returned a bytes object, "
523 "not '%.200s'", Py_TYPE(b)->tp_name);
524 Py_DECREF(b);
525 goto fail;
526 }
527 if (PyBytes_GET_SIZE(b) == 0) {
528 Py_DECREF(b);
529 break;
530 }
531
532 old_size = PyByteArray_GET_SIZE(buffer);
533 PyByteArray_Resize(buffer, old_size + PyBytes_GET_SIZE(b));
534 memcpy(PyByteArray_AS_STRING(buffer) + old_size,
535 PyBytes_AS_STRING(b), PyBytes_GET_SIZE(b));
536
537 Py_DECREF(b);
538
539 if (PyByteArray_AS_STRING(buffer)[PyByteArray_GET_SIZE(buffer) - 1] == '\n')
540 break;
541 }
542
543 result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(buffer),
544 PyByteArray_GET_SIZE(buffer));
545 Py_DECREF(buffer);
546 return result;
547 fail:
548 Py_DECREF(buffer);
549 return NULL;
550}
551
552static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000553iobase_iter(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000554{
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000555 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000556 return NULL;
557
558 Py_INCREF(self);
559 return self;
560}
561
562static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000563iobase_iternext(PyObject *self)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000564{
565 PyObject *line = PyObject_CallMethodObjArgs(self, _PyIO_str_readline, NULL);
566
567 if (line == NULL)
568 return NULL;
569
570 if (PyObject_Size(line) == 0) {
571 Py_DECREF(line);
572 return NULL;
573 }
574
575 return line;
576}
577
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000578PyDoc_STRVAR(iobase_readlines_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000579 "Return a list of lines from the stream.\n"
580 "\n"
581 "hint can be specified to control the number of lines read: no more\n"
582 "lines will be read if the total size (in bytes/characters) of all\n"
583 "lines so far exceeds hint.");
584
585static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000586iobase_readlines(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000587{
588 Py_ssize_t hint = -1, length = 0;
Benjamin Peterson05516132009-12-13 19:28:09 +0000589 PyObject *result;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000590
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000591 if (!PyArg_ParseTuple(args, "|O&:readlines", &_PyIO_ConvertSsize_t, &hint)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000592 return NULL;
593 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000594
595 result = PyList_New(0);
596 if (result == NULL)
597 return NULL;
598
599 if (hint <= 0) {
600 /* XXX special-casing this made sense in the Python version in order
601 to remove the bytecode interpretation overhead, but it could
602 probably be removed here. */
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200603 _Py_IDENTIFIER(extend);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200604 PyObject *ret = _PyObject_CallMethodId(result, &PyId_extend, "O", self);
605
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000606 if (ret == NULL) {
607 Py_DECREF(result);
608 return NULL;
609 }
610 Py_DECREF(ret);
611 return result;
612 }
613
614 while (1) {
615 PyObject *line = PyIter_Next(self);
616 if (line == NULL) {
617 if (PyErr_Occurred()) {
618 Py_DECREF(result);
619 return NULL;
620 }
621 else
622 break; /* StopIteration raised */
623 }
624
625 if (PyList_Append(result, line) < 0) {
626 Py_DECREF(line);
627 Py_DECREF(result);
628 return NULL;
629 }
630 length += PyObject_Size(line);
631 Py_DECREF(line);
632
633 if (length > hint)
634 break;
635 }
636 return result;
637}
638
639static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000640iobase_writelines(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000641{
642 PyObject *lines, *iter, *res;
643
644 if (!PyArg_ParseTuple(args, "O:writelines", &lines)) {
645 return NULL;
646 }
647
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000648 if (_PyIOBase_check_closed(self, Py_True) == NULL)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000649 return NULL;
650
651 iter = PyObject_GetIter(lines);
652 if (iter == NULL)
653 return NULL;
654
655 while (1) {
656 PyObject *line = PyIter_Next(iter);
657 if (line == NULL) {
658 if (PyErr_Occurred()) {
659 Py_DECREF(iter);
660 return NULL;
661 }
662 else
663 break; /* Stop Iteration */
664 }
665
Gregory P. Smithb9817b02013-02-01 13:03:39 -0800666 res = NULL;
667 do {
668 res = PyObject_CallMethodObjArgs(self, _PyIO_str_write, line, NULL);
669 } while (res == NULL && _PyIO_trap_eintr());
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000670 Py_DECREF(line);
671 if (res == NULL) {
672 Py_DECREF(iter);
673 return NULL;
674 }
675 Py_DECREF(res);
676 }
677 Py_DECREF(iter);
678 Py_RETURN_NONE;
679}
680
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000681static PyMethodDef iobase_methods[] = {
682 {"seek", iobase_seek, METH_VARARGS, iobase_seek_doc},
683 {"tell", iobase_tell, METH_NOARGS, iobase_tell_doc},
684 {"truncate", iobase_truncate, METH_VARARGS, iobase_truncate_doc},
685 {"flush", iobase_flush, METH_NOARGS, iobase_flush_doc},
686 {"close", iobase_close, METH_NOARGS, iobase_close_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000687
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000688 {"seekable", iobase_seekable, METH_NOARGS, iobase_seekable_doc},
689 {"readable", iobase_readable, METH_NOARGS, iobase_readable_doc},
690 {"writable", iobase_writable, METH_NOARGS, iobase_writable_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000691
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000692 {"_checkClosed", _PyIOBase_check_closed, METH_NOARGS},
693 {"_checkSeekable", _PyIOBase_check_seekable, METH_NOARGS},
694 {"_checkReadable", _PyIOBase_check_readable, METH_NOARGS},
695 {"_checkWritable", _PyIOBase_check_writable, METH_NOARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000696
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000697 {"fileno", iobase_fileno, METH_NOARGS, iobase_fileno_doc},
698 {"isatty", iobase_isatty, METH_NOARGS, iobase_isatty_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000699
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000700 {"__enter__", iobase_enter, METH_NOARGS},
701 {"__exit__", iobase_exit, METH_VARARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000702
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000703 {"readline", iobase_readline, METH_VARARGS, iobase_readline_doc},
704 {"readlines", iobase_readlines, METH_VARARGS, iobase_readlines_doc},
705 {"writelines", iobase_writelines, METH_VARARGS},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000706
707 {NULL, NULL}
708};
709
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000710static PyGetSetDef iobase_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500711 {"__dict__", PyObject_GenericGetDict, NULL, NULL},
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000712 {"closed", (getter)iobase_closed_get, NULL, NULL},
Benjamin Peterson1fea3212009-04-19 03:15:20 +0000713 {NULL}
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000714};
715
716
717PyTypeObject PyIOBase_Type = {
718 PyVarObject_HEAD_INIT(NULL, 0)
719 "_io._IOBase", /*tp_name*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000720 sizeof(iobase), /*tp_basicsize*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000721 0, /*tp_itemsize*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000722 (destructor)iobase_dealloc, /*tp_dealloc*/
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000723 0, /*tp_print*/
724 0, /*tp_getattr*/
725 0, /*tp_setattr*/
726 0, /*tp_compare */
727 0, /*tp_repr*/
728 0, /*tp_as_number*/
729 0, /*tp_as_sequence*/
730 0, /*tp_as_mapping*/
731 0, /*tp_hash */
732 0, /*tp_call*/
733 0, /*tp_str*/
734 0, /*tp_getattro*/
735 0, /*tp_setattro*/
736 0, /*tp_as_buffer*/
737 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
Antoine Pitrou796564c2013-07-30 19:59:21 +0200738 | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000739 iobase_doc, /* tp_doc */
740 (traverseproc)iobase_traverse, /* tp_traverse */
741 (inquiry)iobase_clear, /* tp_clear */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000742 0, /* tp_richcompare */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000743 offsetof(iobase, weakreflist), /* tp_weaklistoffset */
744 iobase_iter, /* tp_iter */
745 iobase_iternext, /* tp_iternext */
746 iobase_methods, /* tp_methods */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000747 0, /* tp_members */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000748 iobase_getset, /* tp_getset */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000749 0, /* tp_base */
750 0, /* tp_dict */
751 0, /* tp_descr_get */
752 0, /* tp_descr_set */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000753 offsetof(iobase, dict), /* tp_dictoffset */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000754 0, /* tp_init */
755 0, /* tp_alloc */
756 PyType_GenericNew, /* tp_new */
Antoine Pitrou796564c2013-07-30 19:59:21 +0200757 0, /* tp_free */
758 0, /* tp_is_gc */
759 0, /* tp_bases */
760 0, /* tp_mro */
761 0, /* tp_cache */
762 0, /* tp_subclasses */
763 0, /* tp_weaklist */
764 0, /* tp_del */
765 0, /* tp_version_tag */
766 (destructor)iobase_finalize, /* tp_finalize */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000767};
768
769
770/*
771 * RawIOBase class, Inherits from IOBase.
772 */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000773PyDoc_STRVAR(rawiobase_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000774 "Base class for raw binary I/O.");
775
776/*
777 * The read() method is implemented by calling readinto(); derived classes
778 * that want to support read() only need to implement readinto() as a
779 * primitive operation. In general, readinto() can be more efficient than
780 * read().
781 *
782 * (It would be tempting to also provide an implementation of readinto() in
783 * terms of read(), in case the latter is a more suitable primitive operation,
784 * but that would lead to nasty recursion in case a subclass doesn't implement
785 * either.)
786*/
787
788static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000789rawiobase_read(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000790{
791 Py_ssize_t n = -1;
792 PyObject *b, *res;
793
794 if (!PyArg_ParseTuple(args, "|n:read", &n)) {
795 return NULL;
796 }
797
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200798 if (n < 0) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200799 _Py_IDENTIFIER(readall);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200800
801 return _PyObject_CallMethodId(self, &PyId_readall, NULL);
802 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000803
804 /* TODO: allocate a bytes object directly instead and manually construct
805 a writable memoryview pointing to it. */
806 b = PyByteArray_FromStringAndSize(NULL, n);
807 if (b == NULL)
808 return NULL;
809
810 res = PyObject_CallMethodObjArgs(self, _PyIO_str_readinto, b, NULL);
Antoine Pitrou328ec742010-09-14 18:37:24 +0000811 if (res == NULL || res == Py_None) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000812 Py_DECREF(b);
Antoine Pitrou328ec742010-09-14 18:37:24 +0000813 return res;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000814 }
815
816 n = PyNumber_AsSsize_t(res, PyExc_ValueError);
817 Py_DECREF(res);
818 if (n == -1 && PyErr_Occurred()) {
819 Py_DECREF(b);
820 return NULL;
821 }
822
823 res = PyBytes_FromStringAndSize(PyByteArray_AsString(b), n);
824 Py_DECREF(b);
825 return res;
826}
827
828
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000829PyDoc_STRVAR(rawiobase_readall_doc,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000830 "Read until EOF, using multiple read() call.");
831
832static PyObject *
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000833rawiobase_readall(PyObject *self, PyObject *args)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000834{
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000835 int r;
836 PyObject *chunks = PyList_New(0);
837 PyObject *result;
838
839 if (chunks == NULL)
840 return NULL;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000841
842 while (1) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200843 _Py_IDENTIFIER(read);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200844 PyObject *data = _PyObject_CallMethodId(self, &PyId_read,
845 "i", DEFAULT_BUFFER_SIZE);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000846 if (!data) {
Gregory P. Smith51359922012-06-23 23:55:39 -0700847 /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()
848 when EINTR occurs so we needn't do it ourselves. */
849 if (_PyIO_trap_eintr()) {
850 continue;
851 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000852 Py_DECREF(chunks);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000853 return NULL;
854 }
Victor Stinnera80987f2011-05-25 22:47:16 +0200855 if (data == Py_None) {
856 if (PyList_GET_SIZE(chunks) == 0) {
857 Py_DECREF(chunks);
858 return data;
859 }
860 Py_DECREF(data);
861 break;
862 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000863 if (!PyBytes_Check(data)) {
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000864 Py_DECREF(chunks);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000865 Py_DECREF(data);
866 PyErr_SetString(PyExc_TypeError, "read() should return bytes");
867 return NULL;
868 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000869 if (PyBytes_GET_SIZE(data) == 0) {
870 /* EOF */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000871 Py_DECREF(data);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000872 break;
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000873 }
874 r = PyList_Append(chunks, data);
875 Py_DECREF(data);
876 if (r < 0) {
877 Py_DECREF(chunks);
878 return NULL;
879 }
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000880 }
Antoine Pitrou00a9b732009-03-29 19:19:49 +0000881 result = _PyBytes_Join(_PyIO_empty_bytes, chunks);
882 Py_DECREF(chunks);
883 return result;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000884}
885
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000886static PyMethodDef rawiobase_methods[] = {
887 {"read", rawiobase_read, METH_VARARGS},
888 {"readall", rawiobase_readall, METH_NOARGS, rawiobase_readall_doc},
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000889 {NULL, NULL}
890};
891
892PyTypeObject PyRawIOBase_Type = {
893 PyVarObject_HEAD_INIT(NULL, 0)
894 "_io._RawIOBase", /*tp_name*/
895 0, /*tp_basicsize*/
896 0, /*tp_itemsize*/
897 0, /*tp_dealloc*/
898 0, /*tp_print*/
899 0, /*tp_getattr*/
900 0, /*tp_setattr*/
901 0, /*tp_compare */
902 0, /*tp_repr*/
903 0, /*tp_as_number*/
904 0, /*tp_as_sequence*/
905 0, /*tp_as_mapping*/
906 0, /*tp_hash */
907 0, /*tp_call*/
908 0, /*tp_str*/
909 0, /*tp_getattro*/
910 0, /*tp_setattro*/
911 0, /*tp_as_buffer*/
Antoine Pitrou796564c2013-07-30 19:59:21 +0200912 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000913 rawiobase_doc, /* tp_doc */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000914 0, /* tp_traverse */
915 0, /* tp_clear */
916 0, /* tp_richcompare */
917 0, /* tp_weaklistoffset */
918 0, /* tp_iter */
919 0, /* tp_iternext */
Benjamin Peterson680bf1a2009-06-12 02:07:12 +0000920 rawiobase_methods, /* tp_methods */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000921 0, /* tp_members */
922 0, /* tp_getset */
923 &PyIOBase_Type, /* tp_base */
924 0, /* tp_dict */
925 0, /* tp_descr_get */
926 0, /* tp_descr_set */
927 0, /* tp_dictoffset */
928 0, /* tp_init */
929 0, /* tp_alloc */
930 0, /* tp_new */
Antoine Pitrou796564c2013-07-30 19:59:21 +0200931 0, /* tp_free */
932 0, /* tp_is_gc */
933 0, /* tp_bases */
934 0, /* tp_mro */
935 0, /* tp_cache */
936 0, /* tp_subclasses */
937 0, /* tp_weaklist */
938 0, /* tp_del */
939 0, /* tp_version_tag */
940 0, /* tp_finalize */
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000941};