blob: be0464c4fa33933578386d974eae754052a99cab [file] [log] [blame]
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00001/*
2 An implementation of the new I/O lib as defined by PEP 3116 - "New I/O"
Brett Cannonefb00c02012-02-29 18:31:31 -05003
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00004 Classes defined here: UnsupportedOperation, BlockingIOError.
5 Functions defined here: open().
Brett Cannonefb00c02012-02-29 18:31:31 -05006
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00007 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;
Victor Stinnerb57f1082011-05-26 00:19:38 +020039PyObject *_PyIO_str_readall;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000040PyObject *_PyIO_str_readinto;
41PyObject *_PyIO_str_readline;
42PyObject *_PyIO_str_reset;
43PyObject *_PyIO_str_seek;
44PyObject *_PyIO_str_seekable;
Antoine Pitroue4501852009-05-14 18:55:55 +000045PyObject *_PyIO_str_setstate;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000046PyObject *_PyIO_str_tell;
47PyObject *_PyIO_str_truncate;
48PyObject *_PyIO_str_writable;
49PyObject *_PyIO_str_write;
50
51PyObject *_PyIO_empty_str;
52PyObject *_PyIO_empty_bytes;
Antoine Pitroue4501852009-05-14 18:55:55 +000053PyObject *_PyIO_zero;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000054
55
56PyDoc_STRVAR(module_doc,
57"The io module provides the Python interfaces to stream handling. The\n"
58"builtin open function is defined in this module.\n"
59"\n"
60"At the top of the I/O hierarchy is the abstract base class IOBase. It\n"
61"defines the basic interface to a stream. Note, however, that there is no\n"
Éric Araujofab97662012-02-26 02:14:08 +010062"separation between reading and writing to streams; implementations are\n"
Andrew Svetlov737fb892012-12-18 21:14:22 +020063"allowed to raise an IOError if they do not support a given operation.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000064"\n"
65"Extending IOBase is RawIOBase which deals simply with the reading and\n"
Benjamin Peterson8f2b6652009-04-05 00:46:27 +000066"writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000067"an interface to OS files.\n"
68"\n"
69"BufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its\n"
70"subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer\n"
71"streams that are readable, writable, and both respectively.\n"
72"BufferedRandom provides a buffered interface to random access\n"
73"streams. BytesIO is a simple stream of in-memory bytes.\n"
74"\n"
75"Another IOBase subclass, TextIOBase, deals with the encoding and decoding\n"
76"of streams into text. TextIOWrapper, which extends it, is a buffered text\n"
77"interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO\n"
78"is a in-memory stream for text.\n"
79"\n"
80"Argument names are not part of the specification, and only the arguments\n"
81"of open() are intended to be used as keyword arguments.\n"
82"\n"
83"data:\n"
84"\n"
85"DEFAULT_BUFFER_SIZE\n"
86"\n"
87" An int containing the default buffer size used by the module's buffered\n"
88" I/O classes. open() uses the file's blksize (as obtained by os.stat) if\n"
89" possible.\n"
90 );
91
92
93/*
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +000094 * The main open() function
95 */
96PyDoc_STRVAR(open_doc,
Georg Brandle40ee502010-07-11 09:33:39 +000097"open(file, mode='r', buffering=-1, encoding=None,\n"
Ross Lagerwall59142db2011-10-31 20:34:46 +020098" errors=None, newline=None, closefd=True, opener=None) -> file object\n"
Georg Brandl5e8f6d12009-12-23 10:30:45 +000099"\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000100"Open file and return a stream. Raise IOError upon failure.\n"
101"\n"
102"file is either a text or byte string giving the name (and the path\n"
103"if the file isn't in the current working directory) of the file to\n"
104"be opened or an integer file descriptor of the file to be\n"
105"wrapped. (If a file descriptor is given, it is closed when the\n"
106"returned I/O object is closed, unless closefd is set to False.)\n"
107"\n"
108"mode is an optional string that specifies the mode in which the file\n"
109"is opened. It defaults to 'r' which means open for reading in text\n"
110"mode. Other common values are 'w' for writing (truncating the file if\n"
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100111"it already exists), 'x' for creating and writing to a new file, and\n"
112"'a' for appending (which on some Unix systems, means that all writes\n"
113"append to the end of the file regardless of the current seek position).\n"
114"In text mode, if encoding is not specified the encoding used is platform\n"
Victor Stinnerf86a5e82012-06-05 13:43:22 +0200115"dependent: locale.getpreferredencoding(False) is called to get the\n"
116"current locale encoding. (For reading and writing raw bytes use binary\n"
117"mode and leave encoding unspecified.) The available modes are:\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000118"\n"
119"========= ===============================================================\n"
120"Character Meaning\n"
121"--------- ---------------------------------------------------------------\n"
122"'r' open for reading (default)\n"
123"'w' open for writing, truncating the file first\n"
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100124"'x' create a new file and open it for writing\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000125"'a' open for writing, appending to the end of the file if it exists\n"
126"'b' binary mode\n"
127"'t' text mode (default)\n"
128"'+' open a disk file for updating (reading and writing)\n"
Serhiy Storchaka6787a382013-11-23 22:12:06 +0200129"'U' universal newline mode (deprecated)\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000130"========= ===============================================================\n"
131"\n"
132"The default mode is 'rt' (open for reading text). For binary random\n"
133"access, the mode 'w+b' opens and truncates the file to 0 bytes, while\n"
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100134"'r+b' opens the file without truncation. The 'x' mode implies 'w' and\n"
135"raises an `FileExistsError` if the file already exists.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000136"\n"
137"Python distinguishes between files opened in binary and text modes,\n"
138"even when the underlying operating system doesn't. Files opened in\n"
139"binary mode (appending 'b' to the mode argument) return contents as\n"
140"bytes objects without any decoding. In text mode (the default, or when\n"
141"'t' is appended to the mode argument), the contents of the file are\n"
142"returned as strings, the bytes having been first decoded using a\n"
143"platform-dependent encoding or using the specified encoding if given.\n"
144"\n"
Serhiy Storchaka6787a382013-11-23 22:12:06 +0200145"'U' mode is deprecated and will raise an exception in future versions\n"
146"of Python. It has no effect in Python 3. Use newline to control\n"
147"universal newlines mode.\n"
148"\n"
Antoine Pitroud5587bc2009-12-19 21:08:31 +0000149"buffering is an optional integer used to set the buffering policy.\n"
150"Pass 0 to switch buffering off (only allowed in binary mode), 1 to select\n"
151"line buffering (only usable in text mode), and an integer > 1 to indicate\n"
152"the size of a fixed-size chunk buffer. When no buffering argument is\n"
153"given, the default buffering policy works as follows:\n"
154"\n"
155"* Binary files are buffered in fixed-size chunks; the size of the buffer\n"
156" is chosen using a heuristic trying to determine the underlying device's\n"
157" \"block size\" and falling back on `io.DEFAULT_BUFFER_SIZE`.\n"
158" On many systems, the buffer will typically be 4096 or 8192 bytes long.\n"
159"\n"
160"* \"Interactive\" text files (files for which isatty() returns True)\n"
161" use line buffering. Other text files use the policy described above\n"
162" for binary files.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000163"\n"
164"encoding is the name of the encoding used to decode or encode the\n"
165"file. This should only be used in text mode. The default encoding is\n"
166"platform dependent, but any encoding supported by Python can be\n"
167"passed. See the codecs module for the list of supported encodings.\n"
168"\n"
169"errors is an optional string that specifies how encoding errors are to\n"
170"be handled---this argument should not be used in binary mode. Pass\n"
171"'strict' to raise a ValueError exception if there is an encoding error\n"
172"(the default of None has the same effect), or pass 'ignore' to ignore\n"
173"errors. (Note that ignoring encoding errors can lead to data loss.)\n"
Andrew Kuchlingc7b6c502013-06-16 12:58:48 -0400174"See the documentation for codecs.register or run 'help(codecs.Codec)'\n"
175"for a list of the permitted encoding error strings.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000176"\n"
177"newline controls how universal newlines works (it only applies to text\n"
178"mode). It can be None, '', '\\n', '\\r', and '\\r\\n'. It works as\n"
179"follows:\n"
180"\n"
181"* On input, if newline is None, universal newlines mode is\n"
182" enabled. Lines in the input can end in '\\n', '\\r', or '\\r\\n', and\n"
183" these are translated into '\\n' before being returned to the\n"
184" caller. If it is '', universal newline mode is enabled, but line\n"
185" endings are returned to the caller untranslated. If it has any of\n"
186" the other legal values, input lines are only terminated by the given\n"
187" string, and the line ending is returned to the caller untranslated.\n"
188"\n"
189"* On output, if newline is None, any '\\n' characters written are\n"
190" translated to the system default line separator, os.linesep. If\n"
Ezio Melotti16d2b472012-09-18 07:20:18 +0300191" newline is '' or '\\n', no translation takes place. If newline is any\n"
Victor Stinner401e17d2012-08-04 01:18:56 +0200192" of the other legal values, any '\\n' characters written are translated\n"
193" to the given string.\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000194"\n"
195"If closefd is False, the underlying file descriptor will be kept open\n"
196"when the file is closed. This does not work when a file name is given\n"
197"and must be True in that case.\n"
198"\n"
Ross Lagerwall59142db2011-10-31 20:34:46 +0200199"A custom opener can be used by passing a callable as *opener*. The\n"
200"underlying file descriptor for the file object is then obtained by\n"
201"calling *opener* with (*file*, *flags*). *opener* must return an open\n"
202"file descriptor (passing os.open as *opener* results in functionality\n"
203"similar to passing None).\n"
204"\n"
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000205"open() returns a file object whose type depends on the mode, and\n"
206"through which the standard file operations such as reading and writing\n"
207"are performed. When open() is used to open a file in a text mode ('w',\n"
208"'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open\n"
209"a file in a binary mode, the returned class varies: in read binary\n"
210"mode, it returns a BufferedReader; in write binary and append binary\n"
211"modes, it returns a BufferedWriter, and in read/write mode, it returns\n"
212"a BufferedRandom.\n"
213"\n"
214"It is also possible to use a string or bytearray as a file for both\n"
215"reading and writing. For strings StringIO can be used like a file\n"
216"opened in a text mode, and for bytes a BytesIO can be used like a file\n"
217"opened in a binary mode.\n"
218 );
219
220static PyObject *
221io_open(PyObject *self, PyObject *args, PyObject *kwds)
222{
223 char *kwlist[] = {"file", "mode", "buffering",
224 "encoding", "errors", "newline",
Ross Lagerwall59142db2011-10-31 20:34:46 +0200225 "closefd", "opener", NULL};
226 PyObject *file, *opener = Py_None;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000227 char *mode = "r";
228 int buffering = -1, closefd = 1;
229 char *encoding = NULL, *errors = NULL, *newline = NULL;
230 unsigned i;
231
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100232 int creating = 0, reading = 0, writing = 0, appending = 0, updating = 0;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000233 int text = 0, binary = 0, universal = 0;
234
Christian Heimes89ff3c72012-09-10 03:50:48 +0200235 char rawmode[6], *m;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000236 int line_buffering, isatty;
237
238 PyObject *raw, *modeobj = NULL, *buffer = NULL, *wrapper = NULL;
239
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200240 _Py_IDENTIFIER(isatty);
241 _Py_IDENTIFIER(fileno);
Martin v. Löwis767046a2011-10-14 15:35:36 +0200242 _Py_IDENTIFIER(mode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200243
Ross Lagerwall59142db2011-10-31 20:34:46 +0200244 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzziO:open", kwlist,
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000245 &file, &mode, &buffering,
246 &encoding, &errors, &newline,
Ross Lagerwall59142db2011-10-31 20:34:46 +0200247 &closefd, &opener)) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000248 return NULL;
249 }
250
251 if (!PyUnicode_Check(file) &&
252 !PyBytes_Check(file) &&
253 !PyNumber_Check(file)) {
254 PyErr_Format(PyExc_TypeError, "invalid file: %R", file);
255 return NULL;
256 }
257
258 /* Decode mode */
259 for (i = 0; i < strlen(mode); i++) {
260 char c = mode[i];
261
262 switch (c) {
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100263 case 'x':
264 creating = 1;
265 break;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000266 case 'r':
267 reading = 1;
268 break;
269 case 'w':
270 writing = 1;
271 break;
272 case 'a':
273 appending = 1;
274 break;
275 case '+':
276 updating = 1;
277 break;
278 case 't':
279 text = 1;
280 break;
281 case 'b':
282 binary = 1;
283 break;
284 case 'U':
285 universal = 1;
286 reading = 1;
287 break;
288 default:
289 goto invalid_mode;
290 }
291
292 /* c must not be duplicated */
293 if (strchr(mode+i+1, c)) {
294 invalid_mode:
295 PyErr_Format(PyExc_ValueError, "invalid mode: '%s'", mode);
296 return NULL;
297 }
298
299 }
300
301 m = rawmode;
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100302 if (creating) *(m++) = 'x';
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000303 if (reading) *(m++) = 'r';
304 if (writing) *(m++) = 'w';
305 if (appending) *(m++) = 'a';
306 if (updating) *(m++) = '+';
307 *m = '\0';
308
309 /* Parameters validation */
310 if (universal) {
311 if (writing || appending) {
312 PyErr_SetString(PyExc_ValueError,
313 "can't use U and writing mode at once");
314 return NULL;
315 }
Serhiy Storchaka6787a382013-11-23 22:12:06 +0200316 if (PyErr_WarnEx(PyExc_DeprecationWarning,
317 "'U' mode is deprecated", 1) < 0)
318 return NULL;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000319 reading = 1;
320 }
321
322 if (text && binary) {
323 PyErr_SetString(PyExc_ValueError,
324 "can't have text and binary mode at once");
325 return NULL;
326 }
327
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100328 if (creating + reading + writing + appending > 1) {
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000329 PyErr_SetString(PyExc_ValueError,
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100330 "must have exactly one of create/read/write/append mode");
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000331 return NULL;
332 }
333
334 if (binary && encoding != NULL) {
335 PyErr_SetString(PyExc_ValueError,
336 "binary mode doesn't take an encoding argument");
337 return NULL;
338 }
339
340 if (binary && errors != NULL) {
341 PyErr_SetString(PyExc_ValueError,
342 "binary mode doesn't take an errors argument");
343 return NULL;
344 }
345
346 if (binary && newline != NULL) {
347 PyErr_SetString(PyExc_ValueError,
348 "binary mode doesn't take a newline argument");
349 return NULL;
350 }
351
352 /* Create the Raw file stream */
353 raw = PyObject_CallFunction((PyObject *)&PyFileIO_Type,
Ross Lagerwall59142db2011-10-31 20:34:46 +0200354 "OsiO", file, rawmode, closefd, opener);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000355 if (raw == NULL)
356 return NULL;
357
358 modeobj = PyUnicode_FromString(mode);
359 if (modeobj == NULL)
360 goto error;
361
362 /* buffering */
363 {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200364 PyObject *res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000365 if (res == NULL)
366 goto error;
367 isatty = PyLong_AsLong(res);
368 Py_DECREF(res);
369 if (isatty == -1 && PyErr_Occurred())
370 goto error;
371 }
372
373 if (buffering == 1 || (buffering < 0 && isatty)) {
374 buffering = -1;
375 line_buffering = 1;
376 }
377 else
378 line_buffering = 0;
379
380 if (buffering < 0) {
381 buffering = DEFAULT_BUFFER_SIZE;
382#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
383 {
384 struct stat st;
385 long fileno;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200386 PyObject *res = _PyObject_CallMethodId(raw, &PyId_fileno, NULL);
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000387 if (res == NULL)
388 goto error;
389
390 fileno = PyLong_AsLong(res);
391 Py_DECREF(res);
392 if (fileno == -1 && PyErr_Occurred())
393 goto error;
394
Antoine Pitrouea5d17d2010-10-27 19:45:43 +0000395 if (fstat(fileno, &st) >= 0 && st.st_blksize > 1)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000396 buffering = st.st_blksize;
397 }
398#endif
399 }
400 if (buffering < 0) {
401 PyErr_SetString(PyExc_ValueError,
402 "invalid buffering size");
403 goto error;
404 }
405
406 /* if not buffering, returns the raw file object */
407 if (buffering == 0) {
408 if (!binary) {
409 PyErr_SetString(PyExc_ValueError,
410 "can't have unbuffered text I/O");
411 goto error;
412 }
413
414 Py_DECREF(modeobj);
415 return raw;
416 }
417
418 /* wraps into a buffered file */
419 {
420 PyObject *Buffered_class;
421
422 if (updating)
423 Buffered_class = (PyObject *)&PyBufferedRandom_Type;
Charles-François Natalidc3044c2012-01-09 22:40:02 +0100424 else if (creating || writing || appending)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000425 Buffered_class = (PyObject *)&PyBufferedWriter_Type;
426 else if (reading)
427 Buffered_class = (PyObject *)&PyBufferedReader_Type;
428 else {
429 PyErr_Format(PyExc_ValueError,
430 "unknown mode: '%s'", mode);
431 goto error;
432 }
433
434 buffer = PyObject_CallFunction(Buffered_class, "Oi", raw, buffering);
435 }
436 Py_CLEAR(raw);
437 if (buffer == NULL)
438 goto error;
439
440
441 /* if binary, returns the buffered file */
442 if (binary) {
443 Py_DECREF(modeobj);
444 return buffer;
445 }
446
447 /* wraps into a TextIOWrapper */
448 wrapper = PyObject_CallFunction((PyObject *)&PyTextIOWrapper_Type,
449 "Osssi",
450 buffer,
451 encoding, errors, newline,
452 line_buffering);
453 Py_CLEAR(buffer);
454 if (wrapper == NULL)
455 goto error;
456
Martin v. Löwis767046a2011-10-14 15:35:36 +0200457 if (_PyObject_SetAttrId(wrapper, &PyId_mode, modeobj) < 0)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000458 goto error;
459 Py_DECREF(modeobj);
460 return wrapper;
461
462 error:
463 Py_XDECREF(raw);
464 Py_XDECREF(modeobj);
465 Py_XDECREF(buffer);
466 Py_XDECREF(wrapper);
467 return NULL;
468}
469
470/*
471 * Private helpers for the io module.
472 */
473
474Py_off_t
475PyNumber_AsOff_t(PyObject *item, PyObject *err)
476{
477 Py_off_t result;
478 PyObject *runerr;
479 PyObject *value = PyNumber_Index(item);
480 if (value == NULL)
481 return -1;
482
483 /* We're done if PyLong_AsSsize_t() returns without error. */
484 result = PyLong_AsOff_t(value);
485 if (result != -1 || !(runerr = PyErr_Occurred()))
486 goto finish;
487
488 /* Error handling code -- only manage OverflowError differently */
489 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
490 goto finish;
491
492 PyErr_Clear();
493 /* If no error-handling desired then the default clipping
494 is sufficient.
495 */
496 if (!err) {
497 assert(PyLong_Check(value));
498 /* Whether or not it is less than or equal to
499 zero is determined by the sign of ob_size
500 */
501 if (_PyLong_Sign(value) < 0)
502 result = PY_OFF_T_MIN;
503 else
504 result = PY_OFF_T_MAX;
505 }
506 else {
507 /* Otherwise replace the error with caller's error object. */
508 PyErr_Format(err,
509 "cannot fit '%.200s' into an offset-sized integer",
510 item->ob_type->tp_name);
511 }
512
513 finish:
514 Py_DECREF(value);
515 return result;
516}
517
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000518
519/* Basically the "n" format code with the ability to turn None into -1. */
Brett Cannonefb00c02012-02-29 18:31:31 -0500520int
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000521_PyIO_ConvertSsize_t(PyObject *obj, void *result) {
522 Py_ssize_t limit;
523 if (obj == Py_None) {
524 limit = -1;
525 }
526 else if (PyNumber_Check(obj)) {
527 limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
528 if (limit == -1 && PyErr_Occurred())
529 return 0;
530 }
531 else {
532 PyErr_Format(PyExc_TypeError,
533 "integer argument expected, got '%.200s'",
534 Py_TYPE(obj)->tp_name);
535 return 0;
536 }
537 *((Py_ssize_t *)result) = limit;
538 return 1;
539}
540
541
Antoine Pitrou712cb732013-12-21 15:51:54 +0100542_PyIO_State *
543_PyIO_get_module_state(void)
544{
545 PyObject *mod = PyState_FindModule(&_PyIO_Module);
546 _PyIO_State *state;
547 if (mod == NULL || (state = IO_MOD_STATE(mod)) == NULL) {
548 PyErr_SetString(PyExc_RuntimeError,
549 "could not find io module state "
550 "(interpreter shutdown?)");
551 return NULL;
552 }
553 return state;
554}
555
Antoine Pitrou932ff832013-08-01 21:04:50 +0200556PyObject *
557_PyIO_get_locale_module(_PyIO_State *state)
558{
559 PyObject *mod;
560 if (state->locale_module != NULL) {
561 assert(PyWeakref_CheckRef(state->locale_module));
562 mod = PyWeakref_GET_OBJECT(state->locale_module);
563 if (mod != Py_None) {
564 Py_INCREF(mod);
565 return mod;
566 }
567 Py_CLEAR(state->locale_module);
568 }
Antoine Pitroufd4722c2013-10-12 00:13:50 +0200569 mod = PyImport_ImportModule("_bootlocale");
Antoine Pitrou932ff832013-08-01 21:04:50 +0200570 if (mod == NULL)
571 return NULL;
572 state->locale_module = PyWeakref_NewRef(mod, NULL);
573 if (state->locale_module == NULL) {
574 Py_DECREF(mod);
575 return NULL;
576 }
577 return mod;
578}
579
580
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000581static int
582iomodule_traverse(PyObject *mod, visitproc visit, void *arg) {
583 _PyIO_State *state = IO_MOD_STATE(mod);
584 if (!state->initialized)
585 return 0;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000586 if (state->locale_module != NULL) {
587 Py_VISIT(state->locale_module);
588 }
589 Py_VISIT(state->unsupported_operation);
590 return 0;
591}
592
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000593
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000594static int
595iomodule_clear(PyObject *mod) {
596 _PyIO_State *state = IO_MOD_STATE(mod);
597 if (!state->initialized)
598 return 0;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000599 if (state->locale_module != NULL)
600 Py_CLEAR(state->locale_module);
601 Py_CLEAR(state->unsupported_operation);
602 return 0;
603}
604
605static void
606iomodule_free(PyObject *mod) {
607 iomodule_clear(mod);
608}
609
Benjamin Petersonbf5ff762009-12-13 19:25:34 +0000610
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000611/*
612 * Module definition
613 */
614
615static PyMethodDef module_methods[] = {
616 {"open", (PyCFunction)io_open, METH_VARARGS|METH_KEYWORDS, open_doc},
617 {NULL, NULL}
618};
619
620struct PyModuleDef _PyIO_Module = {
621 PyModuleDef_HEAD_INIT,
622 "io",
623 module_doc,
624 sizeof(_PyIO_State),
625 module_methods,
626 NULL,
627 iomodule_traverse,
628 iomodule_clear,
629 (freefunc)iomodule_free,
630};
631
632PyMODINIT_FUNC
633PyInit__io(void)
634{
635 PyObject *m = PyModule_Create(&_PyIO_Module);
636 _PyIO_State *state = NULL;
637 if (m == NULL)
638 return NULL;
639 state = IO_MOD_STATE(m);
640 state->initialized = 0;
641
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000642#define ADD_TYPE(type, name) \
643 if (PyType_Ready(type) < 0) \
644 goto fail; \
645 Py_INCREF(type); \
646 if (PyModule_AddObject(m, name, (PyObject *)type) < 0) { \
647 Py_DECREF(type); \
648 goto fail; \
649 }
650
651 /* DEFAULT_BUFFER_SIZE */
652 if (PyModule_AddIntMacro(m, DEFAULT_BUFFER_SIZE) < 0)
653 goto fail;
654
655 /* UnsupportedOperation inherits from ValueError and IOError */
656 state->unsupported_operation = PyObject_CallFunction(
657 (PyObject *)&PyType_Type, "s(OO){}",
658 "UnsupportedOperation", PyExc_ValueError, PyExc_IOError);
659 if (state->unsupported_operation == NULL)
660 goto fail;
661 Py_INCREF(state->unsupported_operation);
662 if (PyModule_AddObject(m, "UnsupportedOperation",
663 state->unsupported_operation) < 0)
664 goto fail;
665
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200666 /* BlockingIOError, for compatibility */
667 Py_INCREF(PyExc_BlockingIOError);
668 if (PyModule_AddObject(m, "BlockingIOError",
669 (PyObject *) PyExc_BlockingIOError) < 0)
670 goto fail;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000671
672 /* Concrete base types of the IO ABCs.
673 (the ABCs themselves are declared through inheritance in io.py)
674 */
675 ADD_TYPE(&PyIOBase_Type, "_IOBase");
676 ADD_TYPE(&PyRawIOBase_Type, "_RawIOBase");
677 ADD_TYPE(&PyBufferedIOBase_Type, "_BufferedIOBase");
678 ADD_TYPE(&PyTextIOBase_Type, "_TextIOBase");
679
680 /* Implementation of concrete IO objects. */
681 /* FileIO */
682 PyFileIO_Type.tp_base = &PyRawIOBase_Type;
683 ADD_TYPE(&PyFileIO_Type, "FileIO");
684
685 /* BytesIO */
686 PyBytesIO_Type.tp_base = &PyBufferedIOBase_Type;
687 ADD_TYPE(&PyBytesIO_Type, "BytesIO");
Antoine Pitrou972ee132010-09-06 18:48:21 +0000688 if (PyType_Ready(&_PyBytesIOBuffer_Type) < 0)
689 goto fail;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000690
691 /* StringIO */
692 PyStringIO_Type.tp_base = &PyTextIOBase_Type;
693 ADD_TYPE(&PyStringIO_Type, "StringIO");
694
695 /* BufferedReader */
696 PyBufferedReader_Type.tp_base = &PyBufferedIOBase_Type;
697 ADD_TYPE(&PyBufferedReader_Type, "BufferedReader");
698
699 /* BufferedWriter */
700 PyBufferedWriter_Type.tp_base = &PyBufferedIOBase_Type;
701 ADD_TYPE(&PyBufferedWriter_Type, "BufferedWriter");
702
703 /* BufferedRWPair */
704 PyBufferedRWPair_Type.tp_base = &PyBufferedIOBase_Type;
705 ADD_TYPE(&PyBufferedRWPair_Type, "BufferedRWPair");
706
707 /* BufferedRandom */
708 PyBufferedRandom_Type.tp_base = &PyBufferedIOBase_Type;
709 ADD_TYPE(&PyBufferedRandom_Type, "BufferedRandom");
710
711 /* TextIOWrapper */
712 PyTextIOWrapper_Type.tp_base = &PyTextIOBase_Type;
713 ADD_TYPE(&PyTextIOWrapper_Type, "TextIOWrapper");
714
715 /* IncrementalNewlineDecoder */
716 ADD_TYPE(&PyIncrementalNewlineDecoder_Type, "IncrementalNewlineDecoder");
717
718 /* Interned strings */
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100719#define ADD_INTERNED(name) \
720 if (!_PyIO_str_ ## name && \
721 !(_PyIO_str_ ## name = PyUnicode_InternFromString(# name))) \
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000722 goto fail;
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100723
724 ADD_INTERNED(close)
725 ADD_INTERNED(closed)
726 ADD_INTERNED(decode)
727 ADD_INTERNED(encode)
728 ADD_INTERNED(fileno)
729 ADD_INTERNED(flush)
730 ADD_INTERNED(getstate)
731 ADD_INTERNED(isatty)
732 ADD_INTERNED(newlines)
733 ADD_INTERNED(read)
734 ADD_INTERNED(read1)
735 ADD_INTERNED(readable)
Antoine Pitroubb5b92d2012-01-18 16:19:19 +0100736 ADD_INTERNED(readall)
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100737 ADD_INTERNED(readinto)
738 ADD_INTERNED(readline)
739 ADD_INTERNED(reset)
740 ADD_INTERNED(seek)
741 ADD_INTERNED(seekable)
742 ADD_INTERNED(setstate)
743 ADD_INTERNED(tell)
744 ADD_INTERNED(truncate)
745 ADD_INTERNED(write)
746 ADD_INTERNED(writable)
747
748 if (!_PyIO_str_nl &&
749 !(_PyIO_str_nl = PyUnicode_InternFromString("\n")))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000750 goto fail;
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100751
752 if (!_PyIO_empty_str &&
753 !(_PyIO_empty_str = PyUnicode_FromStringAndSize(NULL, 0)))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000754 goto fail;
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100755 if (!_PyIO_empty_bytes &&
756 !(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000757 goto fail;
Antoine Pitroufc1b6f02012-01-18 16:13:56 +0100758 if (!_PyIO_zero &&
759 !(_PyIO_zero = PyLong_FromLong(0L)))
Antoine Pitroue4501852009-05-14 18:55:55 +0000760 goto fail;
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000761
762 state->initialized = 1;
763
764 return m;
765
766 fail:
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +0000767 Py_XDECREF(state->unsupported_operation);
768 Py_DECREF(m);
769 return NULL;
770}