1/*
2    An implementation of the new I/O lib as defined by PEP 3116 - "New I/O"
3
4    Classes defined here: UnsupportedOperation, BlockingIOError.
5    Functions defined here: open().
6
7    Mostly written by Amaury Forgeot d'Arc
8*/
9
10#define PY_SSIZE_T_CLEAN
11#include "Python.h"
12#include "structmember.h"
13#include "_iomodule.h"
14
15#ifdef HAVE_SYS_TYPES_H
16#include <sys/types.h>
17#endif /* HAVE_SYS_TYPES_H */
18
19#ifdef HAVE_SYS_STAT_H
20#include <sys/stat.h>
21#endif /* HAVE_SYS_STAT_H */
22
23
24/* Various interned strings */
25
26PyObject *_PyIO_str_close;
27PyObject *_PyIO_str_closed;
28PyObject *_PyIO_str_decode;
29PyObject *_PyIO_str_encode;
30PyObject *_PyIO_str_fileno;
31PyObject *_PyIO_str_flush;
32PyObject *_PyIO_str_getstate;
33PyObject *_PyIO_str_isatty;
34PyObject *_PyIO_str_newlines;
35PyObject *_PyIO_str_nl;
36PyObject *_PyIO_str_read;
37PyObject *_PyIO_str_read1;
38PyObject *_PyIO_str_readable;
39PyObject *_PyIO_str_readinto;
40PyObject *_PyIO_str_readline;
41PyObject *_PyIO_str_reset;
42PyObject *_PyIO_str_seek;
43PyObject *_PyIO_str_seekable;
44PyObject *_PyIO_str_setstate;
45PyObject *_PyIO_str_tell;
46PyObject *_PyIO_str_truncate;
47PyObject *_PyIO_str_writable;
48PyObject *_PyIO_str_write;
49
50PyObject *_PyIO_empty_str;
51PyObject *_PyIO_empty_bytes;
52PyObject *_PyIO_zero;
53
54
55PyDoc_STRVAR(module_doc,
56"The io module provides the Python interfaces to stream handling. The\n"
57"builtin open function is defined in this module.\n"
58"\n"
59"At the top of the I/O hierarchy is the abstract base class IOBase. It\n"
60"defines the basic interface to a stream. Note, however, that there is no\n"
61"seperation between reading and writing to streams; implementations are\n"
62"allowed to throw an IOError if they do not support a given operation.\n"
63"\n"
64"Extending IOBase is RawIOBase which deals simply with the reading and\n"
65"writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide\n"
66"an interface to OS files.\n"
67"\n"
68"BufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its\n"
69"subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer\n"
70"streams that are readable, writable, and both respectively.\n"
71"BufferedRandom provides a buffered interface to random access\n"
72"streams. BytesIO is a simple stream of in-memory bytes.\n"
73"\n"
74"Another IOBase subclass, TextIOBase, deals with the encoding and decoding\n"
75"of streams into text. TextIOWrapper, which extends it, is a buffered text\n"
76"interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO\n"
77"is a in-memory stream for text.\n"
78"\n"
79"Argument names are not part of the specification, and only the arguments\n"
80"of open() are intended to be used as keyword arguments.\n"
81"\n"
82"data:\n"
83"\n"
84"DEFAULT_BUFFER_SIZE\n"
85"\n"
86"   An int containing the default buffer size used by the module's buffered\n"
87"   I/O classes. open() uses the file's blksize (as obtained by os.stat) if\n"
88"   possible.\n"
89    );
90
91
92/*
93 * BlockingIOError extends IOError
94 */
95
96static int
97blockingioerror_init(PyBlockingIOErrorObject *self, PyObject *args,
98                     PyObject *kwds)
99{
100    PyObject *myerrno = NULL, *strerror = NULL;
101    PyObject *baseargs = NULL;
102    Py_ssize_t written = 0;
103
104    assert(PyTuple_Check(args));
105
106    self->written = 0;
107    if (!PyArg_ParseTuple(args, "OO|n:BlockingIOError",
108                          &myerrno, &strerror, &written))
109        return -1;
110
111    baseargs = PyTuple_Pack(2, myerrno, strerror);
112    if (baseargs == NULL)
113        return -1;
114    /* This will take care of initializing of myerrno and strerror members */
115    if (((PyTypeObject *)PyExc_IOError)->tp_init(
116                (PyObject *)self, baseargs, kwds) == -1) {
117        Py_DECREF(baseargs);
118        return -1;
119    }
120    Py_DECREF(baseargs);
121
122    self->written = written;
123    return 0;
124}
125
126static PyMemberDef blockingioerror_members[] = {
127    {"characters_written", T_PYSSIZET, offsetof(PyBlockingIOErrorObject, written), 0},
128    {NULL}  /* Sentinel */
129};
130
131static PyTypeObject _PyExc_BlockingIOError = {
132    PyVarObject_HEAD_INIT(NULL, 0)
133    "BlockingIOError", /*tp_name*/
134    sizeof(PyBlockingIOErrorObject), /*tp_basicsize*/
135    0,                          /*tp_itemsize*/
136    0,                          /*tp_dealloc*/
137    0,                          /*tp_print*/
138    0,                          /*tp_getattr*/
139    0,                          /*tp_setattr*/
140    0,                          /*tp_compare */
141    0,                          /*tp_repr*/
142    0,                          /*tp_as_number*/
143    0,                          /*tp_as_sequence*/
144    0,                          /*tp_as_mapping*/
145    0,                          /*tp_hash */
146    0,                          /*tp_call*/
147    0,                          /*tp_str*/
148    0,                          /*tp_getattro*/
149    0,                          /*tp_setattro*/
150    0,                          /*tp_as_buffer*/
151    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
152    PyDoc_STR("Exception raised when I/O would block "
153              "on a non-blocking I/O stream"), /* tp_doc */
154    0,                          /* tp_traverse */
155    0,                          /* tp_clear */
156    0,                          /* tp_richcompare */
157    0,                          /* tp_weaklistoffset */
158    0,                          /* tp_iter */
159    0,                          /* tp_iternext */
160    0,                          /* tp_methods */
161    blockingioerror_members,    /* tp_members */
162    0,                          /* tp_getset */
163    0,                          /* tp_base */
164    0,                          /* tp_dict */
165    0,                          /* tp_descr_get */
166    0,                          /* tp_descr_set */
167    0,                          /* tp_dictoffset */
168    (initproc)blockingioerror_init, /* tp_init */
169    0,                          /* tp_alloc */
170    0,                          /* tp_new */
171};
172PyObject *PyExc_BlockingIOError = (PyObject *)&_PyExc_BlockingIOError;
173
174
175/*
176 * The main open() function
177 */
178PyDoc_STRVAR(open_doc,
179"Open file and return a stream.  Raise IOError upon failure.\n"
180"\n"
181"file is either a text or byte string giving the name (and the path\n"
182"if the file isn't in the current working directory) of the file to\n"
183"be opened or an integer file descriptor of the file to be\n"
184"wrapped. (If a file descriptor is given, it is closed when the\n"
185"returned I/O object is closed, unless closefd is set to False.)\n"
186"\n"
187"mode is an optional string that specifies the mode in which the file\n"
188"is opened. It defaults to 'r' which means open for reading in text\n"
189"mode.  Other common values are 'w' for writing (truncating the file if\n"
190"it already exists), and 'a' for appending (which on some Unix systems,\n"
191"means that all writes append to the end of the file regardless of the\n"
192"current seek position). In text mode, if encoding is not specified the\n"
193"encoding used is platform dependent. (For reading and writing raw\n"
194"bytes use binary mode and leave encoding unspecified.) The available\n"
195"modes are:\n"
196"\n"
197"========= ===============================================================\n"
198"Character Meaning\n"
199"--------- ---------------------------------------------------------------\n"
200"'r'       open for reading (default)\n"
201"'w'       open for writing, truncating the file first\n"
202"'a'       open for writing, appending to the end of the file if it exists\n"
203"'b'       binary mode\n"
204"'t'       text mode (default)\n"
205"'+'       open a disk file for updating (reading and writing)\n"
206"'U'       universal newline mode (for backwards compatibility; unneeded\n"
207"          for new code)\n"
208"========= ===============================================================\n"
209"\n"
210"The default mode is 'rt' (open for reading text). For binary random\n"
211"access, the mode 'w+b' opens and truncates the file to 0 bytes, while\n"
212"'r+b' opens the file without truncation.\n"
213"\n"
214"Python distinguishes between files opened in binary and text modes,\n"
215"even when the underlying operating system doesn't. Files opened in\n"
216"binary mode (appending 'b' to the mode argument) return contents as\n"
217"bytes objects without any decoding. In text mode (the default, or when\n"
218"'t' is appended to the mode argument), the contents of the file are\n"
219"returned as strings, the bytes having been first decoded using a\n"
220"platform-dependent encoding or using the specified encoding if given.\n"
221"\n"
222"buffering is an optional integer used to set the buffering policy.\n"
223"Pass 0 to switch buffering off (only allowed in binary mode), 1 to select\n"
224"line buffering (only usable in text mode), and an integer > 1 to indicate\n"
225"the size of a fixed-size chunk buffer.  When no buffering argument is\n"
226"given, the default buffering policy works as follows:\n"
227"\n"
228"* Binary files are buffered in fixed-size chunks; the size of the buffer\n"
229"  is chosen using a heuristic trying to determine the underlying device's\n"
230"  \"block size\" and falling back on `io.DEFAULT_BUFFER_SIZE`.\n"
231"  On many systems, the buffer will typically be 4096 or 8192 bytes long.\n"
232"\n"
233"* \"Interactive\" text files (files for which isatty() returns True)\n"
234"  use line buffering.  Other text files use the policy described above\n"
235"  for binary files.\n"
236"\n"
237"encoding is the name of the encoding used to decode or encode the\n"
238"file. This should only be used in text mode. The default encoding is\n"
239"platform dependent, but any encoding supported by Python can be\n"
240"passed.  See the codecs module for the list of supported encodings.\n"
241"\n"
242"errors is an optional string that specifies how encoding errors are to\n"
243"be handled---this argument should not be used in binary mode. Pass\n"
244"'strict' to raise a ValueError exception if there is an encoding error\n"
245"(the default of None has the same effect), or pass 'ignore' to ignore\n"
246"errors. (Note that ignoring encoding errors can lead to data loss.)\n"
247"See the documentation for codecs.register for a list of the permitted\n"
248"encoding error strings.\n"
249"\n"
250"newline controls how universal newlines works (it only applies to text\n"
251"mode). It can be None, '', '\\n', '\\r', and '\\r\\n'.  It works as\n"
252"follows:\n"
253"\n"
254"* On input, if newline is None, universal newlines mode is\n"
255"  enabled. Lines in the input can end in '\\n', '\\r', or '\\r\\n', and\n"
256"  these are translated into '\\n' before being returned to the\n"
257"  caller. If it is '', universal newline mode is enabled, but line\n"
258"  endings are returned to the caller untranslated. If it has any of\n"
259"  the other legal values, input lines are only terminated by the given\n"
260"  string, and the line ending is returned to the caller untranslated.\n"
261"\n"
262"* On output, if newline is None, any '\\n' characters written are\n"
263"  translated to the system default line separator, os.linesep. If\n"
264"  newline is '', no translation takes place. If newline is any of the\n"
265"  other legal values, any '\\n' characters written are translated to\n"
266"  the given string.\n"
267"\n"
268"If closefd is False, the underlying file descriptor will be kept open\n"
269"when the file is closed. This does not work when a file name is given\n"
270"and must be True in that case.\n"
271"\n"
272"open() returns a file object whose type depends on the mode, and\n"
273"through which the standard file operations such as reading and writing\n"
274"are performed. When open() is used to open a file in a text mode ('w',\n"
275"'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open\n"
276"a file in a binary mode, the returned class varies: in read binary\n"
277"mode, it returns a BufferedReader; in write binary and append binary\n"
278"modes, it returns a BufferedWriter, and in read/write mode, it returns\n"
279"a BufferedRandom.\n"
280"\n"
281"It is also possible to use a string or bytearray as a file for both\n"
282"reading and writing. For strings StringIO can be used like a file\n"
283"opened in a text mode, and for bytes a BytesIO can be used like a file\n"
284"opened in a binary mode.\n"
285    );
286
287static PyObject *
288io_open(PyObject *self, PyObject *args, PyObject *kwds)
289{
290    char *kwlist[] = {"file", "mode", "buffering",
291                      "encoding", "errors", "newline",
292                      "closefd", NULL};
293    PyObject *file;
294    char *mode = "r";
295    int buffering = -1, closefd = 1;
296    char *encoding = NULL, *errors = NULL, *newline = NULL;
297    unsigned i;
298
299    int reading = 0, writing = 0, appending = 0, updating = 0;
300    int text = 0, binary = 0, universal = 0;
301
302    char rawmode[5], *m;
303    int line_buffering, isatty;
304
305    PyObject *raw, *modeobj = NULL, *buffer = NULL, *wrapper = NULL;
306
307    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzzi:open", kwlist,
308                                     &file, &mode, &buffering,
309                                     &encoding, &errors, &newline,
310                                     &closefd)) {
311        return NULL;
312    }
313
314    if (!PyUnicode_Check(file) &&
315	!PyBytes_Check(file) &&
316	!PyNumber_Check(file)) {
317        PyObject *repr = PyObject_Repr(file);
318        if (repr != NULL) {
319            PyErr_Format(PyExc_TypeError, "invalid file: %s",
320                         PyString_AS_STRING(repr));
321            Py_DECREF(repr);
322        }
323        return NULL;
324    }
325
326    /* Decode mode */
327    for (i = 0; i < strlen(mode); i++) {
328        char c = mode[i];
329
330        switch (c) {
331        case 'r':
332            reading = 1;
333            break;
334        case 'w':
335            writing = 1;
336            break;
337        case 'a':
338            appending = 1;
339            break;
340        case '+':
341            updating = 1;
342            break;
343        case 't':
344            text = 1;
345            break;
346        case 'b':
347            binary = 1;
348            break;
349        case 'U':
350            universal = 1;
351            reading = 1;
352            break;
353        default:
354            goto invalid_mode;
355        }
356
357        /* c must not be duplicated */
358        if (strchr(mode+i+1, c)) {
359          invalid_mode:
360            PyErr_Format(PyExc_ValueError, "invalid mode: '%s'", mode);
361            return NULL;
362        }
363
364    }
365
366    m = rawmode;
367    if (reading)   *(m++) = 'r';
368    if (writing)   *(m++) = 'w';
369    if (appending) *(m++) = 'a';
370    if (updating)  *(m++) = '+';
371    *m = '\0';
372
373    /* Parameters validation */
374    if (universal) {
375        if (writing || appending) {
376            PyErr_SetString(PyExc_ValueError,
377                            "can't use U and writing mode at once");
378            return NULL;
379        }
380        reading = 1;
381    }
382
383    if (text && binary) {
384        PyErr_SetString(PyExc_ValueError,
385                        "can't have text and binary mode at once");
386        return NULL;
387    }
388
389    if (reading + writing + appending > 1) {
390        PyErr_SetString(PyExc_ValueError,
391                        "must have exactly one of read/write/append mode");
392        return NULL;
393    }
394
395    if (binary && encoding != NULL) {
396        PyErr_SetString(PyExc_ValueError,
397                        "binary mode doesn't take an encoding argument");
398        return NULL;
399    }
400
401    if (binary && errors != NULL) {
402        PyErr_SetString(PyExc_ValueError,
403                        "binary mode doesn't take an errors argument");
404        return NULL;
405    }
406
407    if (binary && newline != NULL) {
408        PyErr_SetString(PyExc_ValueError,
409                        "binary mode doesn't take a newline argument");
410        return NULL;
411    }
412
413    /* Create the Raw file stream */
414    raw = PyObject_CallFunction((PyObject *)&PyFileIO_Type,
415				"Osi", file, rawmode, closefd);
416    if (raw == NULL)
417        return NULL;
418
419    modeobj = PyUnicode_FromString(mode);
420    if (modeobj == NULL)
421        goto error;
422
423    /* buffering */
424    {
425        PyObject *res = PyObject_CallMethod(raw, "isatty", NULL);
426        if (res == NULL)
427            goto error;
428        isatty = PyLong_AsLong(res);
429        Py_DECREF(res);
430        if (isatty == -1 && PyErr_Occurred())
431            goto error;
432    }
433
434    if (buffering == 1 || (buffering < 0 && isatty)) {
435        buffering = -1;
436        line_buffering = 1;
437    }
438    else
439        line_buffering = 0;
440
441    if (buffering < 0) {
442        buffering = DEFAULT_BUFFER_SIZE;
443#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
444        {
445            struct stat st;
446            long fileno;
447            PyObject *res = PyObject_CallMethod(raw, "fileno", NULL);
448            if (res == NULL)
449                goto error;
450
451            fileno = PyInt_AsLong(res);
452            Py_DECREF(res);
453            if (fileno == -1 && PyErr_Occurred())
454                goto error;
455
456            if (fstat(fileno, &st) >= 0 && st.st_blksize > 1)
457                buffering = st.st_blksize;
458        }
459#endif
460    }
461    if (buffering < 0) {
462        PyErr_SetString(PyExc_ValueError,
463                        "invalid buffering size");
464        goto error;
465    }
466
467    /* if not buffering, returns the raw file object */
468    if (buffering == 0) {
469        if (!binary) {
470            PyErr_SetString(PyExc_ValueError,
471                            "can't have unbuffered text I/O");
472            goto error;
473        }
474
475        Py_DECREF(modeobj);
476        return raw;
477    }
478
479    /* wraps into a buffered file */
480    {
481        PyObject *Buffered_class;
482
483        if (updating)
484            Buffered_class = (PyObject *)&PyBufferedRandom_Type;
485        else if (writing || appending)
486            Buffered_class = (PyObject *)&PyBufferedWriter_Type;
487        else if (reading)
488            Buffered_class = (PyObject *)&PyBufferedReader_Type;
489        else {
490            PyErr_Format(PyExc_ValueError,
491                         "unknown mode: '%s'", mode);
492            goto error;
493        }
494
495        buffer = PyObject_CallFunction(Buffered_class, "Oi", raw, buffering);
496    }
497    Py_CLEAR(raw);
498    if (buffer == NULL)
499        goto error;
500
501
502    /* if binary, returns the buffered file */
503    if (binary) {
504        Py_DECREF(modeobj);
505        return buffer;
506    }
507
508    /* wraps into a TextIOWrapper */
509    wrapper = PyObject_CallFunction((PyObject *)&PyTextIOWrapper_Type,
510				    "Osssi",
511				    buffer,
512				    encoding, errors, newline,
513				    line_buffering);
514    Py_CLEAR(buffer);
515    if (wrapper == NULL)
516        goto error;
517
518    if (PyObject_SetAttrString(wrapper, "mode", modeobj) < 0)
519        goto error;
520    Py_DECREF(modeobj);
521    return wrapper;
522
523  error:
524    Py_XDECREF(raw);
525    Py_XDECREF(modeobj);
526    Py_XDECREF(buffer);
527    Py_XDECREF(wrapper);
528    return NULL;
529}
530
531/*
532 * Private helpers for the io module.
533 */
534
535Py_off_t
536PyNumber_AsOff_t(PyObject *item, PyObject *err)
537{
538    Py_off_t result;
539    PyObject *runerr;
540    PyObject *value = PyNumber_Index(item);
541    if (value == NULL)
542        return -1;
543
544    if (PyInt_Check(value)) {
545        /* We assume a long always fits in a Py_off_t... */
546        result = (Py_off_t) PyInt_AS_LONG(value);
547        goto finish;
548    }
549
550    /* We're done if PyLong_AsSsize_t() returns without error. */
551    result = PyLong_AsOff_t(value);
552    if (result != -1 || !(runerr = PyErr_Occurred()))
553        goto finish;
554
555    /* Error handling code -- only manage OverflowError differently */
556    if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
557        goto finish;
558
559    PyErr_Clear();
560    /* If no error-handling desired then the default clipping
561       is sufficient.
562     */
563    if (!err) {
564        assert(PyLong_Check(value));
565        /* Whether or not it is less than or equal to
566           zero is determined by the sign of ob_size
567        */
568        if (_PyLong_Sign(value) < 0)
569            result = PY_OFF_T_MIN;
570        else
571            result = PY_OFF_T_MAX;
572    }
573    else {
574        /* Otherwise replace the error with caller's error object. */
575        PyErr_Format(err,
576                     "cannot fit '%.200s' into an offset-sized integer",
577                     item->ob_type->tp_name);
578    }
579
580 finish:
581    Py_DECREF(value);
582    return result;
583}
584
585
586/* Basically the "n" format code with the ability to turn None into -1. */
587int
588_PyIO_ConvertSsize_t(PyObject *obj, void *result) {
589    Py_ssize_t limit;
590    if (obj == Py_None) {
591        limit = -1;
592    }
593    else if (PyNumber_Check(obj)) {
594        limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
595        if (limit == -1 && PyErr_Occurred())
596            return 0;
597    }
598    else {
599        PyErr_Format(PyExc_TypeError,
600                     "integer argument expected, got '%.200s'",
601                     Py_TYPE(obj)->tp_name);
602        return 0;
603    }
604    *((Py_ssize_t *)result) = limit;
605    return 1;
606}
607
608
609/*
610 * Module definition
611 */
612
613PyObject *_PyIO_os_module = NULL;
614PyObject *_PyIO_locale_module = NULL;
615PyObject *_PyIO_unsupported_operation = NULL;
616
617static PyMethodDef module_methods[] = {
618    {"open", (PyCFunction)io_open, METH_VARARGS|METH_KEYWORDS, open_doc},
619    {NULL, NULL}
620};
621
622PyMODINIT_FUNC
623init_io(void)
624{
625    PyObject *m = Py_InitModule4("_io", module_methods,
626                                 module_doc, NULL, PYTHON_API_VERSION);
627    if (m == NULL)
628        return;
629
630    /* put os in the module state */
631    _PyIO_os_module = PyImport_ImportModule("os");
632    if (_PyIO_os_module == NULL)
633        goto fail;
634
635#define ADD_TYPE(type, name) \
636    if (PyType_Ready(type) < 0) \
637        goto fail; \
638    Py_INCREF(type); \
639    if (PyModule_AddObject(m, name, (PyObject *)type) < 0) {  \
640        Py_DECREF(type); \
641        goto fail; \
642    }
643
644    /* DEFAULT_BUFFER_SIZE */
645    if (PyModule_AddIntMacro(m, DEFAULT_BUFFER_SIZE) < 0)
646        goto fail;
647
648    /* UnsupportedOperation inherits from ValueError and IOError */
649    _PyIO_unsupported_operation = PyObject_CallFunction(
650        (PyObject *)&PyType_Type, "s(OO){}",
651        "UnsupportedOperation", PyExc_ValueError, PyExc_IOError);
652    if (_PyIO_unsupported_operation == NULL)
653        goto fail;
654    Py_INCREF(_PyIO_unsupported_operation);
655    if (PyModule_AddObject(m, "UnsupportedOperation",
656                           _PyIO_unsupported_operation) < 0)
657        goto fail;
658
659    /* BlockingIOError */
660    _PyExc_BlockingIOError.tp_base = (PyTypeObject *) PyExc_IOError;
661    ADD_TYPE(&_PyExc_BlockingIOError, "BlockingIOError");
662
663    /* Concrete base types of the IO ABCs.
664       (the ABCs themselves are declared through inheritance in io.py)
665    */
666    ADD_TYPE(&PyIOBase_Type, "_IOBase");
667    ADD_TYPE(&PyRawIOBase_Type, "_RawIOBase");
668    ADD_TYPE(&PyBufferedIOBase_Type, "_BufferedIOBase");
669    ADD_TYPE(&PyTextIOBase_Type, "_TextIOBase");
670
671    /* Implementation of concrete IO objects. */
672    /* FileIO */
673    PyFileIO_Type.tp_base = &PyRawIOBase_Type;
674    ADD_TYPE(&PyFileIO_Type, "FileIO");
675
676    /* BytesIO */
677    PyBytesIO_Type.tp_base = &PyBufferedIOBase_Type;
678    ADD_TYPE(&PyBytesIO_Type, "BytesIO");
679
680    /* StringIO */
681    PyStringIO_Type.tp_base = &PyTextIOBase_Type;
682    ADD_TYPE(&PyStringIO_Type, "StringIO");
683
684    /* BufferedReader */
685    PyBufferedReader_Type.tp_base = &PyBufferedIOBase_Type;
686    ADD_TYPE(&PyBufferedReader_Type, "BufferedReader");
687
688    /* BufferedWriter */
689    PyBufferedWriter_Type.tp_base = &PyBufferedIOBase_Type;
690    ADD_TYPE(&PyBufferedWriter_Type, "BufferedWriter");
691
692    /* BufferedRWPair */
693    PyBufferedRWPair_Type.tp_base = &PyBufferedIOBase_Type;
694    ADD_TYPE(&PyBufferedRWPair_Type, "BufferedRWPair");
695
696    /* BufferedRandom */
697    PyBufferedRandom_Type.tp_base = &PyBufferedIOBase_Type;
698    ADD_TYPE(&PyBufferedRandom_Type, "BufferedRandom");
699
700    /* TextIOWrapper */
701    PyTextIOWrapper_Type.tp_base = &PyTextIOBase_Type;
702    ADD_TYPE(&PyTextIOWrapper_Type, "TextIOWrapper");
703
704    /* IncrementalNewlineDecoder */
705    ADD_TYPE(&PyIncrementalNewlineDecoder_Type, "IncrementalNewlineDecoder");
706
707    /* Interned strings */
708    if (!(_PyIO_str_close = PyString_InternFromString("close")))
709        goto fail;
710    if (!(_PyIO_str_closed = PyString_InternFromString("closed")))
711        goto fail;
712    if (!(_PyIO_str_decode = PyString_InternFromString("decode")))
713        goto fail;
714    if (!(_PyIO_str_encode = PyString_InternFromString("encode")))
715        goto fail;
716    if (!(_PyIO_str_fileno = PyString_InternFromString("fileno")))
717        goto fail;
718    if (!(_PyIO_str_flush = PyString_InternFromString("flush")))
719        goto fail;
720    if (!(_PyIO_str_getstate = PyString_InternFromString("getstate")))
721        goto fail;
722    if (!(_PyIO_str_isatty = PyString_InternFromString("isatty")))
723        goto fail;
724    if (!(_PyIO_str_newlines = PyString_InternFromString("newlines")))
725        goto fail;
726    if (!(_PyIO_str_nl = PyString_InternFromString("\n")))
727        goto fail;
728    if (!(_PyIO_str_read = PyString_InternFromString("read")))
729        goto fail;
730    if (!(_PyIO_str_read1 = PyString_InternFromString("read1")))
731        goto fail;
732    if (!(_PyIO_str_readable = PyString_InternFromString("readable")))
733        goto fail;
734    if (!(_PyIO_str_readinto = PyString_InternFromString("readinto")))
735        goto fail;
736    if (!(_PyIO_str_readline = PyString_InternFromString("readline")))
737        goto fail;
738    if (!(_PyIO_str_reset = PyString_InternFromString("reset")))
739        goto fail;
740    if (!(_PyIO_str_seek = PyString_InternFromString("seek")))
741        goto fail;
742    if (!(_PyIO_str_seekable = PyString_InternFromString("seekable")))
743        goto fail;
744    if (!(_PyIO_str_setstate = PyString_InternFromString("setstate")))
745        goto fail;
746    if (!(_PyIO_str_tell = PyString_InternFromString("tell")))
747        goto fail;
748    if (!(_PyIO_str_truncate = PyString_InternFromString("truncate")))
749        goto fail;
750    if (!(_PyIO_str_write = PyString_InternFromString("write")))
751        goto fail;
752    if (!(_PyIO_str_writable = PyString_InternFromString("writable")))
753        goto fail;
754
755    if (!(_PyIO_empty_str = PyUnicode_FromStringAndSize(NULL, 0)))
756        goto fail;
757    if (!(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))
758        goto fail;
759    if (!(_PyIO_zero = PyLong_FromLong(0L)))
760        goto fail;
761
762    return;
763
764  fail:
765    Py_CLEAR(_PyIO_os_module);
766    Py_CLEAR(_PyIO_unsupported_operation);
767    Py_DECREF(m);
768}
769