annotate Objects/fileobject.c @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents 67dc99a989cd
children f6e74759d740
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* File object implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
3 #define PY_SSIZE_T_CLEAN
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
4 #include "Python.h"
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
5 #include "structmember.h"
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
38716
42808526511c Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 38670
diff changeset
7 #ifdef HAVE_SYS_TYPES_H
9809
93d70308be17 Need to include <sys/types.h> for off_t.
Guido van Rossum <guido@python.org>
parents: 9789
diff changeset
8 #include <sys/types.h>
38716
42808526511c Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 38670
diff changeset
9 #endif /* HAVE_SYS_TYPES_H */
9809
93d70308be17 Need to include <sys/types.h> for off_t.
Guido van Rossum <guido@python.org>
parents: 9789
diff changeset
10
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23832
diff changeset
11 #ifdef MS_WINDOWS
5414
013ff6951909 Fix by Mark Hammond to enable truncate() on Windows.
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
12 #define fileno _fileno
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
13 /* can simulate truncate with Win32 API functions; see file_truncate */
5414
013ff6951909 Fix by Mark Hammond to enable truncate() on Windows.
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
14 #define HAVE_FTRUNCATE
24233
11c4253698dc WINDOWS_LEAN_AND_MEAN: There is no such symbol, although a very few
Tim Peters <tim.peters@gmail.com>
parents: 24071
diff changeset
15 #define WIN32_LEAN_AND_MEAN
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
16 #include <windows.h>
5414
013ff6951909 Fix by Mark Hammond to enable truncate() on Windows.
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
17 #endif
013ff6951909 Fix by Mark Hammond to enable truncate() on Windows.
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
18
22053
49197fd76362 OS/2 EMX port changes (Objects part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21712
diff changeset
19 #if defined(PYOS_OS2) && defined(PYCC_GCC)
49197fd76362 OS/2 EMX port changes (Objects part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21712
diff changeset
20 #include <io.h>
49197fd76362 OS/2 EMX port changes (Objects part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21712
diff changeset
21 #endif
49197fd76362 OS/2 EMX port changes (Objects part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21712
diff changeset
22
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
23 #define BUF(v) PyString_AS_STRING((PyStringObject *)v)
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
24
59039
77d877d0bf06 #7706: DONT_HAVE_ERRNO_H is no longer defined by configure (after rev.46819).
Andrew M. Kuchling <amk@amk.ca>
parents: 58713
diff changeset
25 #ifdef HAVE_ERRNO_H
1319
cd397266dc1c * Makefile: added all: and default: targets.
Guido van Rossum <guido@python.org>
parents: 1313
diff changeset
26 #include <errno.h>
11243
6aac31cd2102 Patch by Mark Hammond to avoid certain header files on Windows/CE.
Guido van Rossum <guido@python.org>
parents: 10562
diff changeset
27 #endif
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
29 #ifdef HAVE_GETC_UNLOCKED
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
30 #define GETC(f) getc_unlocked(f)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
31 #define FLOCKFILE(f) flockfile(f)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
32 #define FUNLOCKFILE(f) funlockfile(f)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
33 #else
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
34 #define GETC(f) getc(f)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
35 #define FLOCKFILE(f)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
36 #define FUNLOCKFILE(f)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
37 #endif
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
38
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
39 /* Bits in f_newlinetypes */
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
40 #define NEWLINE_UNKNOWN 0 /* No newline seen, yet */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
41 #define NEWLINE_CR 1 /* \r newline seen */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
42 #define NEWLINE_LF 2 /* \n newline seen */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
43 #define NEWLINE_CRLF 4 /* \r\n newline seen */
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
44
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
45 /*
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
46 * These macros release the GIL while preventing the f_close() function being
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
47 * called in the interval between them. For that purpose, a running total of
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
48 * the number of currently running unlocked code sections is kept in
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
49 * the unlocked_count field of the PyFileObject. The close() method raises
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
50 * an IOError if that field is non-zero. See issue #815646, #595601.
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
51 */
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
52
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
53 #define FILE_BEGIN_ALLOW_THREADS(fobj) \
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
54 { \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
55 fobj->unlocked_count++; \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
56 Py_BEGIN_ALLOW_THREADS
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
57
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
58 #define FILE_END_ALLOW_THREADS(fobj) \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
59 Py_END_ALLOW_THREADS \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
60 fobj->unlocked_count--; \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
61 assert(fobj->unlocked_count >= 0); \
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
62 }
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
63
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
64 #define FILE_ABORT_ALLOW_THREADS(fobj) \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
65 Py_BLOCK_THREADS \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
66 fobj->unlocked_count--; \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
67 assert(fobj->unlocked_count >= 0);
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
68
37655
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
69 #ifdef __cplusplus
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
70 extern "C" {
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
71 #endif
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
72
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 FILE *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
74 PyFile_AsFile(PyObject *f)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
76 if (f == NULL || !PyFile_Check(f))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
77 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
78 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
79 return ((PyFileObject *)f)->f_fp;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
82 void PyFile_IncUseCount(PyFileObject *fobj)
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
83 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
84 fobj->unlocked_count++;
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
85 }
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
86
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
87 void PyFile_DecUseCount(PyFileObject *fobj)
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
88 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
89 fobj->unlocked_count--;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
90 assert(fobj->unlocked_count >= 0);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
93 PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
94 PyFile_Name(PyObject *f)
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
95 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
96 if (f == NULL || !PyFile_Check(f))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
97 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
98 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
99 return ((PyFileObject *)f)->f_name;
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
100 }
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
101
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
102 /* This is a safe wrapper around PyObject_Print to print to the FILE
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
103 of a PyFileObject. PyObject_Print releases the GIL but knows nothing
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
104 about PyFileObject. */
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
105 static int
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
106 file_PyObject_Print(PyObject *op, PyFileObject *f, int flags)
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
107 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
108 int result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
109 PyFile_IncUseCount(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
110 result = PyObject_Print(op, f->f_fp, flags);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
111 PyFile_DecUseCount(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
112 return result;
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
113 }
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
114
22471
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
115 /* On Unix, fopen will succeed for directories.
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
116 In Python, there should be no file objects referring to
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
117 directories, so we need a check. */
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
118
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
119 static PyFileObject*
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
120 dircheck(PyFileObject* f)
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
121 {
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
122 #if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
123 struct stat buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
124 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
125 return f;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
126 if (fstat(fileno(f->f_fp), &buf) == 0 &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
127 S_ISDIR(buf.st_mode)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
128 char *msg = strerror(EISDIR);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
129 PyObject *exc = PyObject_CallFunction(PyExc_IOError, "(isO)",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
130 EISDIR, msg, f->f_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
131 PyErr_SetObject(PyExc_IOError, exc);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
132 Py_XDECREF(exc);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
133 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
134 }
22471
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
135 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
136 return f;
22471
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
137 }
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
138
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
139
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
140 static PyObject *
31753
2eb3175fc59b Changed file.name to be the object passed as the 'name' argument to file()
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31691
diff changeset
141 fill_file_fields(PyFileObject *f, FILE *fp, PyObject *name, char *mode,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
142 int (*close)(FILE *))
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
144 assert(name != NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
145 assert(f != NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
146 assert(PyFile_Check(f));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
147 assert(f->f_fp == NULL);
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
148
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
149 Py_DECREF(f->f_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
150 Py_DECREF(f->f_mode);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
151 Py_DECREF(f->f_encoding);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
152 Py_DECREF(f->f_errors);
31753
2eb3175fc59b Changed file.name to be the object passed as the 'name' argument to file()
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31691
diff changeset
153
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
154 Py_INCREF(name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
155 f->f_name = name;
31753
2eb3175fc59b Changed file.name to be the object passed as the 'name' argument to file()
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31691
diff changeset
156
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
157 f->f_mode = PyString_FromString(mode);
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
158
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
159 f->f_close = close;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
160 f->f_softspace = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
161 f->f_binary = strchr(mode,'b') != NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
162 f->f_buf = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
163 f->f_univ_newline = (strchr(mode, 'U') != NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
164 f->f_newlinetypes = NEWLINE_UNKNOWN;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
165 f->f_skipnextlf = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
166 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
167 f->f_encoding = Py_None;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
168 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
169 f->f_errors = Py_None;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
170 f->readable = f->writable = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
171 if (strchr(mode, 'r') != NULL || f->f_univ_newline)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
172 f->readable = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
173 if (strchr(mode, 'w') != NULL || strchr(mode, 'a') != NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
174 f->writable = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
175 if (strchr(mode, '+') != NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
176 f->readable = f->writable = 1;
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
177
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
178 if (f->f_mode == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
179 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
180 f->f_fp = fp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
181 f = dircheck(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
182 return (PyObject *) f;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184
51311
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
185 #if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
186 #define Py_VERIFY_WINNT
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
187 /* The CRT on windows compiled with Visual Studio 2005 and higher may
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
188 * assert if given invalid mode strings. This is all fine and well
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
189 * in static languages like C where the mode string is typcially hard
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
190 * coded. But in Python, were we pass in the mode string from the user,
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
191 * we need to verify it first manually
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
192 */
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
193 static int _PyVerify_Mode_WINNT(const char *mode)
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
194 {
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
195 /* See if mode string is valid on Windows to avoid hard assertions */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
196 /* remove leading spacese */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
197 int singles = 0;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
198 int pairs = 0;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
199 int encoding = 0;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
200 const char *s, *c;
51311
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
201
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
202 while(*mode == ' ') /* strip initial spaces */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
203 ++mode;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
204 if (!strchr("rwa", *mode)) /* must start with one of these */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
205 return 0;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
206 while (*++mode) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
207 if (*mode == ' ' || *mode == 'N') /* ignore spaces and N */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
208 continue;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
209 s = "+TD"; /* each of this can appear only once */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
210 c = strchr(s, *mode);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
211 if (c) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
212 ptrdiff_t idx = s-c;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
213 if (singles & (1<<idx))
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
214 return 0;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
215 singles |= (1<<idx);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
216 continue;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
217 }
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
218 s = "btcnSR"; /* only one of each letter in the pairs allowed */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
219 c = strchr(s, *mode);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
220 if (c) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
221 ptrdiff_t idx = (s-c)/2;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
222 if (pairs & (1<<idx))
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
223 return 0;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
224 pairs |= (1<<idx);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
225 continue;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
226 }
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
227 if (*mode == ',') {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
228 encoding = 1;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
229 break;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
230 }
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
231 return 0; /* found an invalid char */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
232 }
51311
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
233
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
234 if (encoding) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
235 char *e[] = {"UTF-8", "UTF-16LE", "UNICODE"};
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
236 while (*mode == ' ')
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
237 ++mode;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
238 /* find 'ccs =' */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
239 if (strncmp(mode, "ccs", 3))
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
240 return 0;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
241 mode += 3;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
242 while (*mode == ' ')
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
243 ++mode;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
244 if (*mode != '=')
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
245 return 0;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
246 while (*mode == ' ')
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
247 ++mode;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
248 for(encoding = 0; encoding<_countof(e); ++encoding) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
249 size_t l = strlen(e[encoding]);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
250 if (!strncmp(mode, e[encoding], l)) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
251 mode += l; /* found a valid encoding */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
252 break;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
253 }
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
254 }
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
255 if (encoding == _countof(e))
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
256 return 0;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
257 }
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
258 /* skip trailing spaces */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
259 while (*mode == ' ')
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
260 ++mode;
51311
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
261
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
262 return *mode == '\0'; /* must be at the end of the string */
51311
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
263 }
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
264 #endif
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
265
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
266 /* check for known incorrect mode strings - problem is, platforms are
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
267 free to accept any mode characters they like and are supposed to
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
268 ignore stuff they don't understand... write or append mode with
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
269 universal newline support is expressly forbidden by PEP 278.
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
270 Additionally, remove the 'U' from the mode string as platforms
41639
fdfdee191a61 Merge change 54982 from the trunk. This fixes the test_subprocess test in the testsuite for VisualStudio2005 builds, by "sanitizing" the "mode" that is used in the posixmodule's fdopen(). In particular the non-standard "U" mode character is removed.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 40701
diff changeset
271 won't know what it is. Non-zero return signals an exception */
fdfdee191a61 Merge change 54982 from the trunk. This fixes the test_subprocess test in the testsuite for VisualStudio2005 builds, by "sanitizing" the "mode" that is used in the posixmodule's fdopen(). In particular the non-standard "U" mode character is removed.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 40701
diff changeset
272 int
fdfdee191a61 Merge change 54982 from the trunk. This fixes the test_subprocess test in the testsuite for VisualStudio2005 builds, by "sanitizing" the "mode" that is used in the posixmodule's fdopen(). In particular the non-standard "U" mode character is removed.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 40701
diff changeset
273 _PyFile_SanitizeMode(char *mode)
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
274 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
275 char *upos;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
276 size_t len = strlen(mode);
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
277
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
278 if (!len) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
279 PyErr_SetString(PyExc_ValueError, "empty mode string");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
280 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
281 }
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
282
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
283 upos = strchr(mode, 'U');
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
284 if (upos) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
285 memmove(upos, upos+1, len-(upos-mode)); /* incl null char */
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
286
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
287 if (mode[0] == 'w' || mode[0] == 'a') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
288 PyErr_Format(PyExc_ValueError, "universal newline "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
289 "mode can only be used with modes "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
290 "starting with 'r'");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
291 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
292 }
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
293
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
294 if (mode[0] != 'r') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
295 memmove(mode+1, mode, strlen(mode)+1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
296 mode[0] = 'r';
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
297 }
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
298
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
299 if (!strchr(mode, 'b')) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
300 memmove(mode+2, mode+1, strlen(mode));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
301 mode[1] = 'b';
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
302 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
303 } else if (mode[0] != 'r' && mode[0] != 'w' && mode[0] != 'a') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
304 PyErr_Format(PyExc_ValueError, "mode string must begin with "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
305 "one of 'r', 'w', 'a' or 'U', not '%.200s'", mode);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
306 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
307 }
51311
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
308 #ifdef Py_VERIFY_WINNT
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
309 /* additional checks on NT with visual studio 2005 and higher */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
310 if (!_PyVerify_Mode_WINNT(mode)) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
311 PyErr_Format(PyExc_ValueError, "Invalid mode ('%.50s')", mode);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
312 return -1;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
313 }
51311
b586ca3a3062 issue 4804: Provide checks for the format string of strftime, and for the "mode" string of fopen on Windows. These strings are user provided from python and so we can avoid invoking the C runtime invalid parameter handler by first checking that they are valid.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 50424
diff changeset
314 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
315 return 0;
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
316 }
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
317
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
318 static PyObject *
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
319 open_the_file(PyFileObject *f, char *name, char *mode)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
321 char *newmode;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
322 assert(f != NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
323 assert(PyFile_Check(f));
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
324 #ifdef MS_WINDOWS
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
325 /* windows ignores the passed name in order to support Unicode */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
326 assert(f->f_name != NULL);
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
327 #else
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
328 assert(name != NULL);
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
329 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
330 assert(mode != NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
331 assert(f->f_fp == NULL);
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
332
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
333 /* probably need to replace 'U' by 'rb' */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
334 newmode = PyMem_MALLOC(strlen(mode) + 3);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
335 if (!newmode) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
336 PyErr_NoMemory();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
337 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
338 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
339 strcpy(newmode, mode);
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
340
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
341 if (_PyFile_SanitizeMode(newmode)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
342 f = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
343 goto cleanup;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
344 }
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
345
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
346 /* rexec.py can't stop a user from getting the file() constructor --
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
347 all they have to do is get *any* file object f, and then do
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
348 type(f). Here we prevent them from doing damage with it. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
349 if (PyEval_GetRestricted()) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
350 PyErr_SetString(PyExc_IOError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
351 "file() constructor not accessible in restricted mode");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
352 f = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
353 goto cleanup;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
354 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
355 errno = 0;
32322
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
356
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
357 #ifdef MS_WINDOWS
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
358 if (PyUnicode_Check(f->f_name)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
359 PyObject *wmode;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
360 wmode = PyUnicode_DecodeASCII(newmode, strlen(newmode), NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
361 if (f->f_name && wmode) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
362 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
363 /* PyUnicode_AS_UNICODE OK without thread
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
364 lock as it is a simple dereference. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
365 f->f_fp = _wfopen(PyUnicode_AS_UNICODE(f->f_name),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
366 PyUnicode_AS_UNICODE(wmode));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
367 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
368 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
369 Py_XDECREF(wmode);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
370 }
32322
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
371 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
372 if (NULL == f->f_fp && NULL != name) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
373 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
374 f->f_fp = fopen(name, newmode);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
375 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
376 }
32322
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
377
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
378 if (f->f_fp == NULL) {
38999
75bdb1eb0766 Fix build problems with the platform SDK on windows. It is not sufficient to test for the C compiler version when determining if we have the secure CRT from microsoft. Must test with an undocumented macro, __STDC_SECURE_LIB__ too.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 38779
diff changeset
379 #if defined _MSC_VER && (_MSC_VER < 1400 || !defined(__STDC_SECURE_LIB__))
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
380 /* MSVC 6 (Microsoft) leaves errno at 0 for bad mode strings,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
381 * across all Windows flavors. When it sets EINVAL varies
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
382 * across Windows flavors, the exact conditions aren't
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
383 * documented, and the answer lies in the OS's implementation
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
384 * of Win32's CreateFile function (whose source is secret).
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
385 * Seems the best we can do is map EINVAL to ENOENT.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
386 * Starting with Visual Studio .NET 2005, EINVAL is correctly
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
387 * set by our CRT error handler (set in exceptions.c.)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
388 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
389 if (errno == 0) /* bad mode string */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
390 errno = EINVAL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
391 else if (errno == EINVAL) /* unknown, but not a mode string */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
392 errno = ENOENT;
22873
8d337b3b655a SF bug 538827: Python open w/ MSVC6: bad error msgs.
Tim Peters <tim.peters@gmail.com>
parents: 22864
diff changeset
393 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
394 /* EINVAL is returned when an invalid filename or
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
395 * an invalid mode is supplied. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
396 if (errno == EINVAL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
397 PyObject *v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
398 char message[100];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
399 PyOS_snprintf(message, 100,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
400 "invalid mode ('%.50s') or filename", mode);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
401 v = Py_BuildValue("(isO)", errno, message, f->f_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
402 if (v != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
403 PyErr_SetObject(PyExc_IOError, v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
404 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
405 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
406 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
407 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
408 PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, f->f_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
409 f = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
410 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
411 if (f != NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
412 f = dircheck(f);
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
413
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
414 cleanup:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
415 PyMem_FREE(newmode);
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
416
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
417 return (PyObject *)f;
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
418 }
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
419
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
420 static PyObject *
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
421 close_the_file(PyFileObject *f)
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
422 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
423 int sts = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
424 int (*local_close)(FILE *);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
425 FILE *local_fp = f->f_fp;
65684
5383ae8db3cd Issue #9295: Fix a crash under Windows when calling close() on a file
Antoine Pitrou <solipsis@pitrou.net>
parents: 65404
diff changeset
426 char *local_setbuf = f->f_setbuf;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
427 if (local_fp != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
428 local_close = f->f_close;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
429 if (local_close != NULL && f->unlocked_count > 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
430 if (f->ob_refcnt > 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
431 PyErr_SetString(PyExc_IOError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
432 "close() called during concurrent "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
433 "operation on the same file object.");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
434 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
435 /* This should not happen unless someone is
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
436 * carelessly playing with the PyFileObject
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
437 * struct fields and/or its associated FILE
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
438 * pointer. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
439 PyErr_SetString(PyExc_SystemError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
440 "PyFileObject locking error in "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
441 "destructor (refcnt <= 0 at close).");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
442 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
443 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
444 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
445 /* NULL out the FILE pointer before releasing the GIL, because
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
446 * it will not be valid anymore after the close() function is
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
447 * called. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
448 f->f_fp = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
449 if (local_close != NULL) {
65684
5383ae8db3cd Issue #9295: Fix a crash under Windows when calling close() on a file
Antoine Pitrou <solipsis@pitrou.net>
parents: 65404
diff changeset
450 /* Issue #9295: must temporarily reset f_setbuf so that another
5383ae8db3cd Issue #9295: Fix a crash under Windows when calling close() on a file
Antoine Pitrou <solipsis@pitrou.net>
parents: 65404
diff changeset
451 thread doesn't free it when running file_close() concurrently.
5383ae8db3cd Issue #9295: Fix a crash under Windows when calling close() on a file
Antoine Pitrou <solipsis@pitrou.net>
parents: 65404
diff changeset
452 Otherwise this close() will crash when flushing the buffer. */
5383ae8db3cd Issue #9295: Fix a crash under Windows when calling close() on a file
Antoine Pitrou <solipsis@pitrou.net>
parents: 65404
diff changeset
453 f->f_setbuf = NULL;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
454 Py_BEGIN_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
455 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
456 sts = (*local_close)(local_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
457 Py_END_ALLOW_THREADS
65684
5383ae8db3cd Issue #9295: Fix a crash under Windows when calling close() on a file
Antoine Pitrou <solipsis@pitrou.net>
parents: 65404
diff changeset
458 f->f_setbuf = local_setbuf;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
459 if (sts == EOF)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
460 return PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
461 if (sts != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
462 return PyInt_FromLong((long)sts);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
463 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
464 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
465 Py_RETURN_NONE;
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
466 }
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
467
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
468 PyObject *
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
469 PyFile_FromFile(FILE *fp, char *name, char *mode, int (*close)(FILE *))
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
470 {
72456
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
471 PyFileObject *f;
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
472 PyObject *o_name;
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
473
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
474 f = (PyFileObject *)PyFile_Type.tp_new(&PyFile_Type, NULL, NULL);
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
475 if (f == NULL)
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
476 return NULL;
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
477 o_name = PyString_FromString(name);
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
478 if (o_name == NULL) {
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
479 if (close != NULL && fp != NULL)
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
480 close(fp);
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
481 Py_DECREF(f);
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
482 return NULL;
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
483 }
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
484 if (fill_file_fields(f, fp, o_name, mode, close) == NULL) {
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
485 Py_DECREF(f);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
486 Py_DECREF(o_name);
72456
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
487 return NULL;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
488 }
72456
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
489 Py_DECREF(o_name);
0f5b64630fda Issue #7732: Fix a crash on importing a module if a directory has the same name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
490 return (PyObject *)f;
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
491 }
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
492
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
493 PyObject *
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
494 PyFile_FromString(char *name, char *mode)
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
495 {
76117
8258e5fa4a19 Issue #14505: Fix file descriptor leak when deallocating file objects created with PyFile_FromString().
Antoine Pitrou <solipsis@pitrou.net>
parents: 75528
diff changeset
496 extern int fclose(FILE *);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
497 PyFileObject *f;
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
498
76117
8258e5fa4a19 Issue #14505: Fix file descriptor leak when deallocating file objects created with PyFile_FromString().
Antoine Pitrou <solipsis@pitrou.net>
parents: 75528
diff changeset
499 f = (PyFileObject *)PyFile_FromFile((FILE *)NULL, name, mode, fclose);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
500 if (f != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
501 if (open_the_file(f, name, mode) == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
502 Py_DECREF(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
503 f = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
504 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
505 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
506 return (PyObject *)f;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
508
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
509 void
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
510 PyFile_SetBufSize(PyObject *f, int bufsize)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
511 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
512 PyFileObject *file = (PyFileObject *)f;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
513 if (bufsize >= 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
514 int type;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
515 switch (bufsize) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
516 case 0:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
517 type = _IONBF;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
518 break;
30320
521d026a8048 Patch #788249: Pass an explicit buffer to setvbuf in PyFile_SetBufSize().
Martin v. Löwis <martin@v.loewis.de>
parents: 30169
diff changeset
519 #ifdef HAVE_SETVBUF
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
520 case 1:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
521 type = _IOLBF;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
522 bufsize = BUFSIZ;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
523 break;
30320
521d026a8048 Patch #788249: Pass an explicit buffer to setvbuf in PyFile_SetBufSize().
Martin v. Löwis <martin@v.loewis.de>
parents: 30169
diff changeset
524 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
525 default:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
526 type = _IOFBF;
30320
521d026a8048 Patch #788249: Pass an explicit buffer to setvbuf in PyFile_SetBufSize().
Martin v. Löwis <martin@v.loewis.de>
parents: 30169
diff changeset
527 #ifndef HAVE_SETVBUF
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
528 bufsize = BUFSIZ;
30320
521d026a8048 Patch #788249: Pass an explicit buffer to setvbuf in PyFile_SetBufSize().
Martin v. Löwis <martin@v.loewis.de>
parents: 30169
diff changeset
529 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
530 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
531 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
532 fflush(file->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
533 if (type == _IONBF) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
534 PyMem_Free(file->f_setbuf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
535 file->f_setbuf = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
536 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
537 file->f_setbuf = (char *)PyMem_Realloc(file->f_setbuf,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
538 bufsize);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
539 }
30320
521d026a8048 Patch #788249: Pass an explicit buffer to setvbuf in PyFile_SetBufSize().
Martin v. Löwis <martin@v.loewis.de>
parents: 30169
diff changeset
540 #ifdef HAVE_SETVBUF
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
541 setvbuf(file->f_fp, file->f_setbuf, type, bufsize);
7572
c9f417124e0f When we have no setvbuf(), make the file totally unbuffered using
Guido van Rossum <guido@python.org>
parents: 7536
diff changeset
542 #else /* !HAVE_SETVBUF */
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
543 setbuf(file->f_fp, file->f_setbuf);
7572
c9f417124e0f When we have no setvbuf(), make the file totally unbuffered using
Guido van Rossum <guido@python.org>
parents: 7536
diff changeset
544 #endif /* !HAVE_SETVBUF */
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
545 }
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
546 }
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
547
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
548 /* Set the encoding used to output Unicode strings.
47413
1062b7dec95b New environment variable PYTHONIOENCODING.
Martin v. Löwis <martin@v.loewis.de>
parents: 47294
diff changeset
549 Return 1 on success, 0 on failure. */
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
550
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
551 int
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
552 PyFile_SetEncoding(PyObject *f, const char *enc)
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
553 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
554 return PyFile_SetEncodingAndErrors(f, enc, NULL);
47413
1062b7dec95b New environment variable PYTHONIOENCODING.
Martin v. Löwis <martin@v.loewis.de>
parents: 47294
diff changeset
555 }
1062b7dec95b New environment variable PYTHONIOENCODING.
Martin v. Löwis <martin@v.loewis.de>
parents: 47294
diff changeset
556
1062b7dec95b New environment variable PYTHONIOENCODING.
Martin v. Löwis <martin@v.loewis.de>
parents: 47294
diff changeset
557 int
1062b7dec95b New environment variable PYTHONIOENCODING.
Martin v. Löwis <martin@v.loewis.de>
parents: 47294
diff changeset
558 PyFile_SetEncodingAndErrors(PyObject *f, const char *enc, char* errors)
1062b7dec95b New environment variable PYTHONIOENCODING.
Martin v. Löwis <martin@v.loewis.de>
parents: 47294
diff changeset
559 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
560 PyFileObject *file = (PyFileObject*)f;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
561 PyObject *str, *oerrors;
40701
da30a26dfeb3 Backport trunk revision 53527:
Thomas Wouters <thomas@python.org>
parents: 39995
diff changeset
562
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
563 assert(PyFile_Check(f));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
564 str = PyString_FromString(enc);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
565 if (!str)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
566 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
567 if (errors) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
568 oerrors = PyString_FromString(errors);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
569 if (!oerrors) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
570 Py_DECREF(str);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
571 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
572 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
573 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
574 oerrors = Py_None;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
575 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
576 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
577 Py_DECREF(file->f_encoding);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
578 file->f_encoding = str;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
579 Py_DECREF(file->f_errors);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
580 file->f_errors = oerrors;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
581 return 1;
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
582 }
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
583
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
584 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
585 err_closed(void)
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
586 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
587 PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
588 return NULL;
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
589 }
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
590
58714
eb550e839460 Merged revisions 77989 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50424
diff changeset
591 static PyObject *
eb550e839460 Merged revisions 77989 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50424
diff changeset
592 err_mode(char *action)
eb550e839460 Merged revisions 77989 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50424
diff changeset
593 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
594 PyErr_Format(PyExc_IOError, "File not open for %s", action);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
595 return NULL;
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
596 }
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
597
36485
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
598 /* Refuse regular file I/O if there's data in the iteration-buffer.
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
599 * Mixing them would cause data to arrive out of order, as the read*
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
600 * methods don't use the iteration buffer. */
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
601 static PyObject *
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
602 err_iterbuffered(void)
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
603 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
604 PyErr_SetString(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
605 "Mixing iteration and read methods would lose data");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
606 return NULL;
36485
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
607 }
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
608
24615
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
609 static void drop_readahead(PyFileObject *);
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
610
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 /* Methods */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
612
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
613 static void
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
614 file_dealloc(PyFileObject *f)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
615 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
616 PyObject *ret;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
617 if (f->weakreflist != NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
618 PyObject_ClearWeakRefs((PyObject *) f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
619 ret = close_the_file(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
620 if (!ret) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
621 PySys_WriteStderr("close failed in file object destructor:\n");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
622 PyErr_Print();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
623 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
624 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
625 Py_DECREF(ret);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
626 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
627 PyMem_Free(f->f_setbuf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
628 Py_XDECREF(f->f_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
629 Py_XDECREF(f->f_mode);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
630 Py_XDECREF(f->f_encoding);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
631 Py_XDECREF(f->f_errors);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
632 drop_readahead(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
633 Py_TYPE(f)->tp_free((PyObject *)f);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
634 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
635
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
636 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
637 file_repr(PyFileObject *f)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
638 {
75527
6c1964dee98b #14161: fix the __repr__ of file objects to escape the file name.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 72909
diff changeset
639 PyObject *ret = NULL;
6c1964dee98b #14161: fix the __repr__ of file objects to escape the file name.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 72909
diff changeset
640 PyObject *name = NULL;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
641 if (PyUnicode_Check(f->f_name)) {
26330
3086e111783a Fix --disable-unicode compilation problems.
Martin v. Löwis <martin@v.loewis.de>
parents: 25535
diff changeset
642 #ifdef Py_USING_UNICODE
75528
86c749151660 #14161: fix compile error under Windows.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 75527
diff changeset
643 const char *name_str;
75527
6c1964dee98b #14161: fix the __repr__ of file objects to escape the file name.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 72909
diff changeset
644 name = PyUnicode_AsUnicodeEscapeString(f->f_name);
75528
86c749151660 #14161: fix compile error under Windows.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 75527
diff changeset
645 name_str = name ? PyString_AsString(name) : "?";
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
646 ret = PyString_FromFormat("<%s file u'%s', mode '%s' at %p>",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
647 f->f_fp == NULL ? "closed" : "open",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
648 name_str,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
649 PyString_AsString(f->f_mode),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
650 f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
651 Py_XDECREF(name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
652 return ret;
26330
3086e111783a Fix --disable-unicode compilation problems.
Martin v. Löwis <martin@v.loewis.de>
parents: 25535
diff changeset
653 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
654 } else {
75527
6c1964dee98b #14161: fix the __repr__ of file objects to escape the file name.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 72909
diff changeset
655 name = PyObject_Repr(f->f_name);
6c1964dee98b #14161: fix the __repr__ of file objects to escape the file name.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 72909
diff changeset
656 if (name == NULL)
6c1964dee98b #14161: fix the __repr__ of file objects to escape the file name.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 72909
diff changeset
657 return NULL;
6c1964dee98b #14161: fix the __repr__ of file objects to escape the file name.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 72909
diff changeset
658 ret = PyString_FromFormat("<%s file %s, mode '%s' at %p>",
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
659 f->f_fp == NULL ? "closed" : "open",
75527
6c1964dee98b #14161: fix the __repr__ of file objects to escape the file name.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 72909
diff changeset
660 PyString_AsString(name),
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
661 PyString_AsString(f->f_mode),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
662 f);
75527
6c1964dee98b #14161: fix the __repr__ of file objects to escape the file name.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 72909
diff changeset
663 Py_XDECREF(name);
6c1964dee98b #14161: fix the __repr__ of file objects to escape the file name.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 72909
diff changeset
664 return ret;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
665 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
666 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
667
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
668 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19105
diff changeset
669 file_close(PyFileObject *f)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
670 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
671 PyObject *sts = close_the_file(f);
61679
1757bbebf75a Merged revisions 81275 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61465
diff changeset
672 if (sts) {
1757bbebf75a Merged revisions 81275 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61465
diff changeset
673 PyMem_Free(f->f_setbuf);
1757bbebf75a Merged revisions 81275 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61465
diff changeset
674 f->f_setbuf = NULL;
1757bbebf75a Merged revisions 81275 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61465
diff changeset
675 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
676 return sts;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
677 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
678
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
679
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
680 /* Our very own off_t-like type, 64-bit if possible */
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
681 #if !defined(HAVE_LARGEFILE_SUPPORT)
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
682 typedef off_t Py_off_t;
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
683 #elif SIZEOF_OFF_T >= 8
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
684 typedef off_t Py_off_t;
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
685 #elif SIZEOF_FPOS_T >= 8
16903
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
686 typedef fpos_t Py_off_t;
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
687 #else
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
688 #error "Large file support, but neither off_t nor fpos_t is large enough."
16903
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
689 #endif
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
690
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
691
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
692 /* a portable fseek() function
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
693 return 0 on success, non-zero on failure (with errno set) */
17518
f939ce52a734 Make some private symbols static.
Guido van Rossum <guido@python.org>
parents: 16903
diff changeset
694 static int
16903
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
695 _portable_fseek(FILE *fp, Py_off_t offset, int whence)
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
696 {
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
697 #if !defined(HAVE_LARGEFILE_SUPPORT)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
698 return fseek(fp, offset, whence);
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
699 #elif defined(HAVE_FSEEKO) && SIZEOF_OFF_T >= 8
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
700 return fseeko(fp, offset, whence);
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
701 #elif defined(HAVE_FSEEK64)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
702 return fseek64(fp, offset, whence);
15068
a53f16b20f1d Donn Cave <donn@oz.net>:
Fred Drake <fdrake@acm.org>
parents: 14869
diff changeset
703 #elif defined(__BEOS__)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
704 return _fseek(fp, offset, whence);
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
705 #elif SIZEOF_FPOS_T >= 8
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
706 /* lacking a 64-bit capable fseek(), use a 64-bit capable fsetpos()
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
707 and fgetpos() to implement fseek()*/
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
708 fpos_t pos;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
709 switch (whence) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
710 case SEEK_END:
19836
5420e7d348a4 _portable_fseek():
Guido van Rossum <guido@python.org>
parents: 19754
diff changeset
711 #ifdef MS_WINDOWS
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
712 fflush(fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
713 if (_lseeki64(fileno(fp), 0, 2) == -1)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
714 return -1;
19836
5420e7d348a4 _portable_fseek():
Guido van Rossum <guido@python.org>
parents: 19754
diff changeset
715 #else
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
716 if (fseek(fp, 0, SEEK_END) != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
717 return -1;
19836
5420e7d348a4 _portable_fseek():
Guido van Rossum <guido@python.org>
parents: 19754
diff changeset
718 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
719 /* fall through */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
720 case SEEK_CUR:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
721 if (fgetpos(fp, &pos) != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
722 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
723 offset += pos;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
724 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
725 /* case SEEK_SET: break; */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
726 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
727 return fsetpos(fp, &offset);
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
728 #else
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
729 #error "Large file support, but no way to fseek."
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
730 #endif
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
731 }
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
732
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
733
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
734 /* a portable ftell() function
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
735 Return -1 on failure with errno set appropriately, current file
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
736 position on success */
17518
f939ce52a734 Make some private symbols static.
Guido van Rossum <guido@python.org>
parents: 16903
diff changeset
737 static Py_off_t
14277
984abd20eec2 Peter Schneider-Kamp <nowonder@nowonder.de>:
Fred Drake <fdrake@acm.org>
parents: 14215
diff changeset
738 _portable_ftell(FILE* fp)
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
739 {
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
740 #if !defined(HAVE_LARGEFILE_SUPPORT)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
741 return ftell(fp);
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
742 #elif defined(HAVE_FTELLO) && SIZEOF_OFF_T >= 8
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
743 return ftello(fp);
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
744 #elif defined(HAVE_FTELL64)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
745 return ftell64(fp);
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
746 #elif SIZEOF_FPOS_T >= 8
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
747 fpos_t pos;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
748 if (fgetpos(fp, &pos) != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
749 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
750 return pos;
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
751 #else
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
752 #error "Large file support, but no way to ftell."
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
753 #endif
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
754 }
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
755
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
756
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
757 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
758 file_seek(PyFileObject *f, PyObject *args)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
759 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
760 int whence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
761 int ret;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
762 Py_off_t offset;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
763 PyObject *offobj, *off_index;
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
764
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
765 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
766 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
767 drop_readahead(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
768 whence = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
769 if (!PyArg_ParseTuple(args, "O|i:seek", &offobj, &whence))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
770 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
771 off_index = PyNumber_Index(offobj);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
772 if (!off_index) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
773 if (!PyFloat_Check(offobj))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
774 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
775 /* Deprecated in 2.6 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
776 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
777 if (PyErr_WarnEx(PyExc_DeprecationWarning,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
778 "integer argument expected, got float",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
779 1) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
780 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
781 off_index = offobj;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
782 Py_INCREF(offobj);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
783 }
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
784 #if !defined(HAVE_LARGEFILE_SUPPORT)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
785 offset = PyInt_AsLong(off_index);
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
786 #else
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
787 offset = PyLong_Check(off_index) ?
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
788 PyLong_AsLongLong(off_index) : PyInt_AsLong(off_index);
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
789 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
790 Py_DECREF(off_index);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
791 if (PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
792 return NULL;
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
793
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
794 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
795 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
796 ret = _portable_fseek(f->f_fp, offset, whence);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
797 FILE_END_ALLOW_THREADS(f)
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
798
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
799 if (ret != 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
800 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
801 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
802 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
803 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
804 f->f_skipnextlf = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
805 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
806 return Py_None;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
807 }
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
808
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
809
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
810 #ifdef HAVE_FTRUNCATE
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
811 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
812 file_truncate(PyFileObject *f, PyObject *args)
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
813 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
814 Py_off_t newsize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
815 PyObject *newsizeobj = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
816 Py_off_t initialpos;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
817 int ret;
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
818
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
819 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
820 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
821 if (!f->writable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
822 return err_mode("writing");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
823 if (!PyArg_UnpackTuple(args, "truncate", 0, 1, &newsizeobj))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
824 return NULL;
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
825
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
826 /* Get current file position. If the file happens to be open for
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
827 * update and the last operation was an input operation, C doesn't
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
828 * define what the later fflush() will do, but we promise truncate()
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
829 * won't change the current position (and fflush() *does* change it
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
830 * then at least on Windows). The easiest thing is to capture
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
831 * current pos now and seek back to it at the end.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
832 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
833 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
834 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
835 initialpos = _portable_ftell(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
836 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
837 if (initialpos == -1)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
838 goto onioerror;
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
839
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
840 /* Set newsize to current postion if newsizeobj NULL, else to the
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
841 * specified value.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
842 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
843 if (newsizeobj != NULL) {
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
844 #if !defined(HAVE_LARGEFILE_SUPPORT)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
845 newsize = PyInt_AsLong(newsizeobj);
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
846 #else
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
847 newsize = PyLong_Check(newsizeobj) ?
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
848 PyLong_AsLongLong(newsizeobj) :
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
849 PyInt_AsLong(newsizeobj);
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
850 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
851 if (PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
852 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
853 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
854 else /* default to current position */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
855 newsize = initialpos;
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
856
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
857 /* Flush the stream. We're mixing stream-level I/O with lower-level
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
858 * I/O, and a flush may be necessary to synch both platform views
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
859 * of the current file state.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
860 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
861 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
862 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
863 ret = fflush(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
864 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
865 if (ret != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
866 goto onioerror;
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
867
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23832
diff changeset
868 #ifdef MS_WINDOWS
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
869 /* MS _chsize doesn't work if newsize doesn't fit in 32 bits,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
870 so don't even try using it. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
871 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
872 HANDLE hFile;
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
873
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
874 /* Have to move current pos to desired endpoint on Windows. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
875 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
876 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
877 ret = _portable_fseek(f->f_fp, newsize, SEEK_SET) != 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
878 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
879 if (ret)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
880 goto onioerror;
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
881
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
882 /* Truncate. Note that this may grow the file! */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
883 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
884 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
885 hFile = (HANDLE)_get_osfhandle(fileno(f->f_fp));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
886 ret = hFile == (HANDLE)-1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
887 if (ret == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
888 ret = SetEndOfFile(hFile) == 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
889 if (ret)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
890 errno = EACCES;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
891 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
892 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
893 if (ret)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
894 goto onioerror;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
895 }
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
896 #else
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
897 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
898 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
899 ret = ftruncate(fileno(f->f_fp), newsize);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
900 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
901 if (ret != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
902 goto onioerror;
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23832
diff changeset
903 #endif /* !MS_WINDOWS */
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
904
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
905 /* Restore original file position. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
906 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
907 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
908 ret = _portable_fseek(f->f_fp, initialpos, SEEK_SET) != 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
909 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
910 if (ret)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
911 goto onioerror;
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
912
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
913 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
914 return Py_None;
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
915
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
916 onioerror:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
917 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
918 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
919 return NULL;
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
920 }
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
921 #endif /* HAVE_FTRUNCATE */
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
922
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
923 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19105
diff changeset
924 file_tell(PyFileObject *f)
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
925 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
926 Py_off_t pos;
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
927
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
928 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
929 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
930 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
931 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
932 pos = _portable_ftell(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
933 FILE_END_ALLOW_THREADS(f)
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
934
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
935 if (pos == -1) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
936 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
937 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
938 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
939 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
940 if (f->f_skipnextlf) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
941 int c;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
942 c = GETC(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
943 if (c == '\n') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
944 f->f_newlinetypes |= NEWLINE_CRLF;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
945 pos++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
946 f->f_skipnextlf = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
947 } else if (c != EOF) ungetc(c, f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
948 }
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
949 #if !defined(HAVE_LARGEFILE_SUPPORT)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
950 return PyInt_FromLong(pos);
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
951 #else
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
952 return PyLong_FromLongLong(pos);
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
953 #endif
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
954 }
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
955
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
956 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19105
diff changeset
957 file_fileno(PyFileObject *f)
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
958 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
959 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
960 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
961 return PyInt_FromLong((long) fileno(f->f_fp));
902
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
962 }
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
963
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
964 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19105
diff changeset
965 file_flush(PyFileObject *f)
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
966 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
967 int res;
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
968
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
969 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
970 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
971 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
972 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
973 res = fflush(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
974 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
975 if (res != 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
976 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
977 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
978 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
979 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
980 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
981 return Py_None;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
982 }
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
983
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
984 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19105
diff changeset
985 file_isatty(PyFileObject *f)
261
f4a944e9835f In support of popen(), file objects are now parametrized with a close
Guido van Rossum <guido@python.org>
parents: 251
diff changeset
986 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
987 long res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
988 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
989 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
990 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
991 res = isatty((int)fileno(f->f_fp));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
992 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
993 return PyBool_FromLong(res);
261
f4a944e9835f In support of popen(), file objects are now parametrized with a close
Guido van Rossum <guido@python.org>
parents: 251
diff changeset
994 }
f4a944e9835f In support of popen(), file objects are now parametrized with a close
Guido van Rossum <guido@python.org>
parents: 251
diff changeset
995
5477
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
996
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
997 #if BUFSIZ < 8192
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
998 #define SMALLCHUNK 8192
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
999 #else
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
1000 #define SMALLCHUNK BUFSIZ
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
1001 #endif
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
1002
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
1003 static size_t
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1004 new_buffersize(PyFileObject *f, size_t currentsize)
5477
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
1005 {
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
1006 #ifdef HAVE_FSTAT
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1007 off_t pos, end;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1008 struct stat st;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1009 if (fstat(fileno(f->f_fp), &st) == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1010 end = st.st_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1011 /* The following is not a bug: we really need to call lseek()
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1012 *and* ftell(). The reason is that some stdio libraries
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1013 mistakenly flush their buffer when ftell() is called and
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1014 the lseek() call it makes fails, thereby throwing away
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1015 data that cannot be recovered in any way. To avoid this,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1016 we first test lseek(), and only call ftell() if lseek()
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1017 works. We can't use the lseek() value either, because we
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1018 need to take the amount of buffered data into account.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1019 (Yet another reason why stdio stinks. :-) */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1020 pos = lseek(fileno(f->f_fp), 0L, SEEK_CUR);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1021 if (pos >= 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1022 pos = ftell(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1023 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1024 if (pos < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1025 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1026 if (end > pos && pos >= 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1027 return currentsize + end - pos + 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1028 /* Add 1 so if the file were to grow we'd notice. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1029 }
5477
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
1030 #endif
72909
c1c434e30e06 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72456
diff changeset
1031 /* Expand the buffer by an amount proportional to the current size,
c1c434e30e06 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72456
diff changeset
1032 giving us amortized linear-time behavior. Use a less-than-double
c1c434e30e06 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72456
diff changeset
1033 growth factor to avoid excessive allocation. */
c1c434e30e06 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72456
diff changeset
1034 return currentsize + (currentsize >> 3) + 6;
5477
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
1035 }
f44a56e697fb Speed up read() (i.e. read till EOF) considerably by doing a stat() to
Guido van Rossum <guido@python.org>
parents: 5414
diff changeset
1036
26672
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1037 #if defined(EWOULDBLOCK) && defined(EAGAIN) && EWOULDBLOCK != EAGAIN
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1038 #define BLOCKED_ERRNO(x) ((x) == EWOULDBLOCK || (x) == EAGAIN)
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1039 #else
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1040 #ifdef EWOULDBLOCK
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1041 #define BLOCKED_ERRNO(x) ((x) == EWOULDBLOCK)
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1042 #else
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1043 #ifdef EAGAIN
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1044 #define BLOCKED_ERRNO(x) ((x) == EAGAIN)
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1045 #else
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1046 #define BLOCKED_ERRNO(x) 0
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1047 #endif
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1048 #endif
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1049 #endif
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1050
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1051 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1052 file_read(PyFileObject *f, PyObject *args)
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1053 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1054 long bytesrequested = -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1055 size_t bytesread, buffersize, chunksize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1056 PyObject *v;
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1057
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1058 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1059 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1060 if (!f->readable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1061 return err_mode("reading");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1062 /* refuse to mix with f.next() */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1063 if (f->f_buf != NULL &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1064 (f->f_bufend - f->f_bufptr) > 0 &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1065 f->f_buf[0] != '\0')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1066 return err_iterbuffered();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1067 if (!PyArg_ParseTuple(args, "|l:read", &bytesrequested))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1068 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1069 if (bytesrequested < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1070 buffersize = new_buffersize(f, (size_t)0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1071 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1072 buffersize = bytesrequested;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1073 if (buffersize > PY_SSIZE_T_MAX) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1074 PyErr_SetString(PyExc_OverflowError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1075 "requested number of bytes is more than a Python string can hold");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1076 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1077 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1078 v = PyString_FromStringAndSize((char *)NULL, buffersize);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1079 if (v == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1080 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1081 bytesread = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1082 for (;;) {
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1083 int interrupted;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1084 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1085 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1086 chunksize = Py_UniversalNewlineFread(BUF(v) + bytesread,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1087 buffersize - bytesread, f->f_fp, (PyObject *)f);
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1088 interrupted = ferror(f->f_fp) && errno == EINTR;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1089 FILE_END_ALLOW_THREADS(f)
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1090 if (interrupted) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1091 clearerr(f->f_fp);
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1092 if (PyErr_CheckSignals()) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1093 Py_DECREF(v);
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1094 return NULL;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1095 }
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1096 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1097 if (chunksize == 0) {
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1098 if (interrupted)
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1099 continue;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1100 if (!ferror(f->f_fp))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1101 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1102 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1103 /* When in non-blocking mode, data shouldn't
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1104 * be discarded if a blocking signal was
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1105 * received. That will also happen if
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1106 * chunksize != 0, but bytesread < buffersize. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1107 if (bytesread > 0 && BLOCKED_ERRNO(errno))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1108 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1109 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1110 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1111 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1112 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1113 bytesread += chunksize;
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1114 if (bytesread < buffersize && !interrupted) {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1115 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1116 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1117 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1118 if (bytesrequested < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1119 buffersize = new_buffersize(f, buffersize);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1120 if (_PyString_Resize(&v, buffersize) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1121 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1122 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1123 /* Got what was requested. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1124 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1125 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1126 }
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
1127 if (bytesread != buffersize && _PyString_Resize(&v, bytesread))
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
1128 return NULL;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1129 return v;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1130 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1131
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1132 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1133 file_readinto(PyFileObject *f, PyObject *args)
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1134 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1135 char *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1136 Py_ssize_t ntodo;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1137 Py_ssize_t ndone, nnow;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1138 Py_buffer pbuf;
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1139
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1140 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1141 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1142 if (!f->readable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1143 return err_mode("reading");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1144 /* refuse to mix with f.next() */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1145 if (f->f_buf != NULL &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1146 (f->f_bufend - f->f_bufptr) > 0 &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1147 f->f_buf[0] != '\0')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1148 return err_iterbuffered();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1149 if (!PyArg_ParseTuple(args, "w*", &pbuf))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1150 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1151 ptr = pbuf.buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1152 ntodo = pbuf.len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1153 ndone = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1154 while (ntodo > 0) {
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1155 int interrupted;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1156 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1157 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1158 nnow = Py_UniversalNewlineFread(ptr+ndone, ntodo, f->f_fp,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1159 (PyObject *)f);
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1160 interrupted = ferror(f->f_fp) && errno == EINTR;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1161 FILE_END_ALLOW_THREADS(f)
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1162 if (interrupted) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1163 clearerr(f->f_fp);
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1164 if (PyErr_CheckSignals()) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1165 PyBuffer_Release(&pbuf);
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1166 return NULL;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1167 }
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1168 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1169 if (nnow == 0) {
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1170 if (interrupted)
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1171 continue;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1172 if (!ferror(f->f_fp))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1173 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1174 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1175 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1176 PyBuffer_Release(&pbuf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1177 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1178 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1179 ndone += nnow;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1180 ntodo -= nnow;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1181 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1182 PyBuffer_Release(&pbuf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1183 return PyInt_FromSsize_t(ndone);
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1184 }
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1185
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1186 /**************************************************************************
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1187 Routine to get next line using platform fgets().
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1188
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1189 Under MSVC 6:
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1190
15758
a1d88ab023a0 A few reformats; no logic changes.
Tim Peters <tim.peters@gmail.com>
parents: 15757
diff changeset
1191 + MS threadsafe getc is very slow (multiple layers of function calls before+
a1d88ab023a0 A few reformats; no logic changes.
Tim Peters <tim.peters@gmail.com>
parents: 15757
diff changeset
1192 after each character, to lock+unlock the stream).
a1d88ab023a0 A few reformats; no logic changes.
Tim Peters <tim.peters@gmail.com>
parents: 15757
diff changeset
1193 + The stream-locking functions are MS-internal -- can't access them from user
a1d88ab023a0 A few reformats; no logic changes.
Tim Peters <tim.peters@gmail.com>
parents: 15757
diff changeset
1194 code.
a1d88ab023a0 A few reformats; no logic changes.
Tim Peters <tim.peters@gmail.com>
parents: 15757
diff changeset
1195 + There's nothing Tim could find in the MS C or platform SDK libraries that
a1d88ab023a0 A few reformats; no logic changes.
Tim Peters <tim.peters@gmail.com>
parents: 15757
diff changeset
1196 can worm around this.
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1197 + MS fgets locks/unlocks only once per line; it's the only hook we have.
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1198
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1199 So we use fgets for speed(!), despite that it's painful.
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1200
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1201 MS realloc is also slow.
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1202
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1203 Reports from other platforms on this method vs getc_unlocked (which MS doesn't
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1204 have):
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1205 Linux a wash
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1206 Solaris a wash
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1207 Tru64 Unix getline_via_fgets significantly faster
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1208
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1209 CAUTION: The C std isn't clear about this: in those cases where fgets
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1210 writes something into the buffer, can it write into any position beyond the
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1211 required trailing null byte? MSVC 6 fgets does not, and no platform is (yet)
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1212 known on which it does; and it would be a strange way to code fgets. Still,
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1213 getline_via_fgets may not work correctly if it does. The std test
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1214 test_bufio.py should fail if platform fgets() routinely writes beyond the
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1215 trailing null byte. #define DONT_USE_FGETS_IN_GETLINE to disable this code.
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1216 **************************************************************************/
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1217
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1218 /* Use this routine if told to, or by default on non-get_unlocked()
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1219 * platforms unless told not to. Yikes! Let's spell that out:
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1220 * On a platform with getc_unlocked():
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1221 * By default, use getc_unlocked().
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1222 * If you want to use fgets() instead, #define USE_FGETS_IN_GETLINE.
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1223 * On a platform without getc_unlocked():
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1224 * By default, use fgets().
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1225 * If you don't want to use fgets(), #define DONT_USE_FGETS_IN_GETLINE.
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1226 */
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1227 #if !defined(USE_FGETS_IN_GETLINE) && !defined(HAVE_GETC_UNLOCKED)
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1228 #define USE_FGETS_IN_GETLINE
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1229 #endif
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1230
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1231 #if defined(DONT_USE_FGETS_IN_GETLINE) && defined(USE_FGETS_IN_GETLINE)
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1232 #undef USE_FGETS_IN_GETLINE
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1233 #endif
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1234
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1235 #ifdef USE_FGETS_IN_GETLINE
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1236 static PyObject*
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
1237 getline_via_fgets(PyFileObject *f, FILE *fp)
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1238 {
15755
a43a8a1f46ee Fiddled ms_getline_hack after talking w/ Guido: made clearer that the
Tim Peters <tim.peters@gmail.com>
parents: 15754
diff changeset
1239 /* INITBUFSIZE is the maximum line length that lets us get away with the fast
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1240 * no-realloc, one-fgets()-call path. Boosting it isn't free, because we have
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1241 * to fill this much of the buffer with a known value in order to figure out
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1242 * how much of the buffer fgets() overwrites. So if INITBUFSIZE is larger
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1243 * than "most" lines, we waste time filling unused buffer slots. 100 is
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1244 * surely adequate for most peoples' email archives, chewing over source code,
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1245 * etc -- "regular old text files".
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1246 * MAXBUFSIZE is the maximum line length that lets us get away with the less
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1247 * fast (but still zippy) no-realloc, two-fgets()-call path. See above for
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1248 * cautions about boosting that. 300 was chosen because the worst real-life
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1249 * text-crunching job reported on Python-Dev was a mail-log crawler where over
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1250 * half the lines were 254 chars.
15755
a43a8a1f46ee Fiddled ms_getline_hack after talking w/ Guido: made clearer that the
Tim Peters <tim.peters@gmail.com>
parents: 15754
diff changeset
1251 */
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1252 #define INITBUFSIZE 100
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1253 #define MAXBUFSIZE 300
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1254 char* p; /* temp */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1255 char buf[MAXBUFSIZE];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1256 PyObject* v; /* the string object result */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1257 char* pvfree; /* address of next free slot */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1258 char* pvend; /* address one beyond last free slot */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1259 size_t nfree; /* # of free buffer slots; pvend-pvfree */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1260 size_t total_v_size; /* total # of slots in buffer */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1261 size_t increment; /* amount to increment the buffer */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1262 size_t prev_v_size;
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1263
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1264 /* Optimize for normal case: avoid _PyString_Resize if at all
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1265 * possible via first reading into stack buffer "buf".
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1266 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1267 total_v_size = INITBUFSIZE; /* start small and pray */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1268 pvfree = buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1269 for (;;) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1270 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1271 pvend = buf + total_v_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1272 nfree = pvend - pvfree;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1273 memset(pvfree, '\n', nfree);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1274 assert(nfree < INT_MAX); /* Should be atmost MAXBUFSIZE */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1275 p = fgets(pvfree, (int)nfree, fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1276 FILE_END_ALLOW_THREADS(f)
15755
a43a8a1f46ee Fiddled ms_getline_hack after talking w/ Guido: made clearer that the
Tim Peters <tim.peters@gmail.com>
parents: 15754
diff changeset
1277
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1278 if (p == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1279 clearerr(fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1280 if (PyErr_CheckSignals())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1281 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1282 v = PyString_FromStringAndSize(buf, pvfree - buf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1283 return v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1284 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1285 /* fgets read *something* */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1286 p = memchr(pvfree, '\n', nfree);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1287 if (p != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1288 /* Did the \n come from fgets or from us?
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1289 * Since fgets stops at the first \n, and then writes
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1290 * \0, if it's from fgets a \0 must be next. But if
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1291 * that's so, it could not have come from us, since
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1292 * the \n's we filled the buffer with have only more
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1293 * \n's to the right.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1294 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1295 if (p+1 < pvend && *(p+1) == '\0') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1296 /* It's from fgets: we win! In particular,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1297 * we haven't done any mallocs yet, and can
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1298 * build the final result on the first try.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1299 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1300 ++p; /* include \n from fgets */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1301 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1302 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1303 /* Must be from us: fgets didn't fill the
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1304 * buffer and didn't find a newline, so it
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1305 * must be the last and newline-free line of
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1306 * the file.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1307 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1308 assert(p > pvfree && *(p-1) == '\0');
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1309 --p; /* don't include \0 from fgets */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1310 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1311 v = PyString_FromStringAndSize(buf, p - buf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1312 return v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1313 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1314 /* yuck: fgets overwrote all the newlines, i.e. the entire
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1315 * buffer. So this line isn't over yet, or maybe it is but
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1316 * we're exactly at EOF. If we haven't already, try using the
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1317 * rest of the stack buffer.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1318 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1319 assert(*(pvend-1) == '\0');
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1320 if (pvfree == buf) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1321 pvfree = pvend - 1; /* overwrite trailing null */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1322 total_v_size = MAXBUFSIZE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1323 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1324 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1325 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1326 }
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1327
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1328 /* The stack buffer isn't big enough; malloc a string object and read
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1329 * into its buffer.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1330 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1331 total_v_size = MAXBUFSIZE << 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1332 v = PyString_FromStringAndSize((char*)NULL, (int)total_v_size);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1333 if (v == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1334 return v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1335 /* copy over everything except the last null byte */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1336 memcpy(BUF(v), buf, MAXBUFSIZE-1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1337 pvfree = BUF(v) + MAXBUFSIZE - 1;
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1338
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1339 /* Keep reading stuff into v; if it ever ends successfully, break
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1340 * after setting p one beyond the end of the line. The code here is
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1341 * very much like the code above, except reads into v's buffer; see
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1342 * the code above for detailed comments about the logic.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1343 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1344 for (;;) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1345 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1346 pvend = BUF(v) + total_v_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1347 nfree = pvend - pvfree;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1348 memset(pvfree, '\n', nfree);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1349 assert(nfree < INT_MAX);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1350 p = fgets(pvfree, (int)nfree, fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1351 FILE_END_ALLOW_THREADS(f)
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1352
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1353 if (p == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1354 clearerr(fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1355 if (PyErr_CheckSignals()) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1356 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1357 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1358 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1359 p = pvfree;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1360 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1361 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1362 p = memchr(pvfree, '\n', nfree);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1363 if (p != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1364 if (p+1 < pvend && *(p+1) == '\0') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1365 /* \n came from fgets */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1366 ++p;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1367 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1368 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1369 /* \n came from us; last line of file, no newline */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1370 assert(p > pvfree && *(p-1) == '\0');
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1371 --p;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1372 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1373 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1374 /* expand buffer and try again */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1375 assert(*(pvend-1) == '\0');
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1376 increment = total_v_size >> 2; /* mild exponential growth */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1377 prev_v_size = total_v_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1378 total_v_size += increment;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1379 /* check for overflow */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1380 if (total_v_size <= prev_v_size ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1381 total_v_size > PY_SSIZE_T_MAX) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1382 PyErr_SetString(PyExc_OverflowError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1383 "line is longer than a Python string can hold");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1384 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1385 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1386 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1387 if (_PyString_Resize(&v, (int)total_v_size) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1388 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1389 /* overwrite the trailing null byte */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1390 pvfree = BUF(v) + (prev_v_size - 1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1391 }
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
1392 if (BUF(v) + total_v_size != p && _PyString_Resize(&v, p - BUF(v)))
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
1393 return NULL;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1394 return v;
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1395 #undef INITBUFSIZE
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1396 #undef MAXBUFSIZE
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1397 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1398 #endif /* ifdef USE_FGETS_IN_GETLINE */
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1399
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1400 /* Internal routine to get a line.
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1401 Size argument interpretation:
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1402 > 0: max length;
15757
a9e15bcab32c Let's hope that three time's a charm...
Guido van Rossum <guido@python.org>
parents: 15755
diff changeset
1403 <= 0: read arbitrary line
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1404 */
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1405
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1406 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1407 get_line(PyFileObject *f, int n)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1408 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1409 FILE *fp = f->f_fp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1410 int c;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1411 char *buf, *end;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1412 size_t total_v_size; /* total # of slots in buffer */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1413 size_t used_v_size; /* # used slots in buffer */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1414 size_t increment; /* amount to increment the buffer */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1415 PyObject *v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1416 int newlinetypes = f->f_newlinetypes;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1417 int skipnextlf = f->f_skipnextlf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1418 int univ_newline = f->f_univ_newline;
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1419
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1420 #if defined(USE_FGETS_IN_GETLINE)
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1421 if (n <= 0 && !univ_newline )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1422 return getline_via_fgets(f, fp);
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1423 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1424 total_v_size = n > 0 ? n : 100;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1425 v = PyString_FromStringAndSize((char *)NULL, total_v_size);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1426 if (v == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1427 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1428 buf = BUF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1429 end = buf + total_v_size;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents: 916
diff changeset
1430
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1431 for (;;) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1432 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1433 FLOCKFILE(fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1434 if (univ_newline) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1435 c = 'x'; /* Shut up gcc warning */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1436 while ( buf != end && (c = GETC(fp)) != EOF ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1437 if (skipnextlf ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1438 skipnextlf = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1439 if (c == '\n') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1440 /* Seeing a \n here with
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1441 * skipnextlf true means we
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1442 * saw a \r before.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1443 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1444 newlinetypes |= NEWLINE_CRLF;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1445 c = GETC(fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1446 if (c == EOF) break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1447 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1448 newlinetypes |= NEWLINE_CR;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1449 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1450 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1451 if (c == '\r') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1452 skipnextlf = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1453 c = '\n';
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1454 } else if ( c == '\n')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1455 newlinetypes |= NEWLINE_LF;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1456 *buf++ = c;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1457 if (c == '\n') break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1458 }
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1459 if (c == EOF) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1460 if (ferror(fp) && errno == EINTR) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1461 FUNLOCKFILE(fp);
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1462 FILE_ABORT_ALLOW_THREADS(f)
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1463 f->f_newlinetypes = newlinetypes;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1464 f->f_skipnextlf = skipnextlf;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1465
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1466 if (PyErr_CheckSignals()) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1467 Py_DECREF(v);
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1468 return NULL;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1469 }
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1470 /* We executed Python signal handlers and got no exception.
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1471 * Now back to reading the line where we left off. */
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1472 clearerr(fp);
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1473 continue;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1474 }
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1475 if (skipnextlf)
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1476 newlinetypes |= NEWLINE_CR;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1477 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1478 } else /* If not universal newlines use the normal loop */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1479 while ((c = GETC(fp)) != EOF &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1480 (*buf++ = c) != '\n' &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1481 buf != end)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1482 ;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1483 FUNLOCKFILE(fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1484 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1485 f->f_newlinetypes = newlinetypes;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1486 f->f_skipnextlf = skipnextlf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1487 if (c == '\n')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1488 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1489 if (c == EOF) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1490 if (ferror(fp)) {
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1491 if (errno == EINTR) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1492 if (PyErr_CheckSignals()) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1493 Py_DECREF(v);
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1494 return NULL;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1495 }
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1496 /* We executed Python signal handlers and got no exception.
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1497 * Now back to reading the line where we left off. */
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1498 clearerr(fp);
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1499 continue;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1500 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1501 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1502 clearerr(fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1503 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1504 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1505 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1506 clearerr(fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1507 if (PyErr_CheckSignals()) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1508 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1509 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1510 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1511 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1512 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1513 /* Must be because buf == end */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1514 if (n > 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1515 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1516 used_v_size = total_v_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1517 increment = total_v_size >> 2; /* mild exponential growth */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1518 total_v_size += increment;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1519 if (total_v_size > PY_SSIZE_T_MAX) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1520 PyErr_SetString(PyExc_OverflowError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1521 "line is longer than a Python string can hold");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1522 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1523 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1524 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1525 if (_PyString_Resize(&v, total_v_size) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1526 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1527 buf = BUF(v) + used_v_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1528 end = BUF(v) + total_v_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1529 }
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents: 916
diff changeset
1530
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1531 used_v_size = buf - BUF(v);
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
1532 if (used_v_size != total_v_size && _PyString_Resize(&v, used_v_size))
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
1533 return NULL;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1534 return v;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1535 }
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1536
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1537 /* External C interface */
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1538
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1539 PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1540 PyFile_GetLine(PyObject *f, int n)
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1541 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1542 PyObject *result;
15753
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1543
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1544 if (f == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1545 PyErr_BadInternalCall();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1546 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1547 }
15753
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1548
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1549 if (PyFile_Check(f)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1550 PyFileObject *fo = (PyFileObject *)f;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1551 if (fo->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1552 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1553 if (!fo->readable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1554 return err_mode("reading");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1555 /* refuse to mix with f.next() */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1556 if (fo->f_buf != NULL &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1557 (fo->f_bufend - fo->f_bufptr) > 0 &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1558 fo->f_buf[0] != '\0')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1559 return err_iterbuffered();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1560 result = get_line(fo, n);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1561 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1562 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1563 PyObject *reader;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1564 PyObject *args;
15753
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1565
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1566 reader = PyObject_GetAttrString(f, "readline");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1567 if (reader == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1568 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1569 if (n <= 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1570 args = PyTuple_New(0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1571 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1572 args = Py_BuildValue("(i)", n);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1573 if (args == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1574 Py_DECREF(reader);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1575 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1576 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1577 result = PyEval_CallObject(reader, args);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1578 Py_DECREF(reader);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1579 Py_DECREF(args);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1580 if (result != NULL && !PyString_Check(result) &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1581 !PyUnicode_Check(result)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1582 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1583 result = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1584 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1585 "object.readline() returned non-string");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1586 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1587 }
15753
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1588
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1589 if (n < 0 && result != NULL && PyString_Check(result)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1590 char *s = PyString_AS_STRING(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1591 Py_ssize_t len = PyString_GET_SIZE(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1592 if (len == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1593 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1594 result = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1595 PyErr_SetString(PyExc_EOFError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1596 "EOF when reading a line");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1597 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1598 else if (s[len-1] == '\n') {
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
1599 if (result->ob_refcnt == 1) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
1600 if (_PyString_Resize(&result, len-1))
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
1601 return NULL;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
1602 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1603 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1604 PyObject *v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1605 v = PyString_FromStringAndSize(s, len-1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1606 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1607 result = v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1608 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1609 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1610 }
27060
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1611 #ifdef Py_USING_UNICODE
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1612 if (n < 0 && result != NULL && PyUnicode_Check(result)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1613 Py_UNICODE *s = PyUnicode_AS_UNICODE(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1614 Py_ssize_t len = PyUnicode_GET_SIZE(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1615 if (len == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1616 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1617 result = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1618 PyErr_SetString(PyExc_EOFError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1619 "EOF when reading a line");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1620 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1621 else if (s[len-1] == '\n') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1622 if (result->ob_refcnt == 1)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1623 PyUnicode_Resize(&result, len-1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1624 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1625 PyObject *v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1626 v = PyUnicode_FromUnicode(s, len-1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1627 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1628 result = v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1629 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1630 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1631 }
27060
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1632 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1633 return result;
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1634 }
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1635
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1636 /* Python method */
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1637
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1638 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1639 file_readline(PyFileObject *f, PyObject *args)
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1640 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1641 int n = -1;
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1642
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1643 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1644 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1645 if (!f->readable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1646 return err_mode("reading");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1647 /* refuse to mix with f.next() */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1648 if (f->f_buf != NULL &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1649 (f->f_bufend - f->f_bufptr) > 0 &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1650 f->f_buf[0] != '\0')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1651 return err_iterbuffered();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1652 if (!PyArg_ParseTuple(args, "|i:readline", &n))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1653 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1654 if (n == 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1655 return PyString_FromString("");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1656 if (n < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1657 n = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1658 return get_line(f, n);
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1659 }
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1660
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1661 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1662 file_readlines(PyFileObject *f, PyObject *args)
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1663 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1664 long sizehint = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1665 PyObject *list = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1666 PyObject *line;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1667 char small_buffer[SMALLCHUNK];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1668 char *buffer = small_buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1669 size_t buffersize = SMALLCHUNK;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1670 PyObject *big_buffer = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1671 size_t nfilled = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1672 size_t nread;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1673 size_t totalread = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1674 char *p, *q, *end;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1675 int err;
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1676 int shortread = 0; /* bool, did the previous read come up short? */
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1677
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1678 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1679 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1680 if (!f->readable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1681 return err_mode("reading");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1682 /* refuse to mix with f.next() */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1683 if (f->f_buf != NULL &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1684 (f->f_bufend - f->f_bufptr) > 0 &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1685 f->f_buf[0] != '\0')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1686 return err_iterbuffered();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1687 if (!PyArg_ParseTuple(args, "|l:readlines", &sizehint))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1688 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1689 if ((list = PyList_New(0)) == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1690 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1691 for (;;) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1692 if (shortread)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1693 nread = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1694 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1695 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1696 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1697 nread = Py_UniversalNewlineFread(buffer+nfilled,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1698 buffersize-nfilled, f->f_fp, (PyObject *)f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1699 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1700 shortread = (nread < buffersize-nfilled);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1701 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1702 if (nread == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1703 sizehint = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1704 if (!ferror(f->f_fp))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1705 break;
77787
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1706 if (errno == EINTR) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1707 if (PyErr_CheckSignals()) {
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1708 goto error;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1709 }
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1710 clearerr(f->f_fp);
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1711 shortread = 0;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1712 continue;
67dc99a989cd Fixes issue #12268 for file readline, readlines and read() and readinto methods.
Gregory P. Smith <greg@krypto.org>
parents: 76117
diff changeset
1713 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1714 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1715 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1716 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1717 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1718 totalread += nread;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1719 p = (char *)memchr(buffer+nfilled, '\n', nread);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1720 if (p == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1721 /* Need a larger buffer to fit this line */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1722 nfilled += nread;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1723 buffersize *= 2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1724 if (buffersize > PY_SSIZE_T_MAX) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1725 PyErr_SetString(PyExc_OverflowError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1726 "line is longer than a Python string can hold");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1727 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1728 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1729 if (big_buffer == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1730 /* Create the big buffer */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1731 big_buffer = PyString_FromStringAndSize(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1732 NULL, buffersize);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1733 if (big_buffer == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1734 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1735 buffer = PyString_AS_STRING(big_buffer);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1736 memcpy(buffer, small_buffer, nfilled);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1737 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1738 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1739 /* Grow the big buffer */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1740 if ( _PyString_Resize(&big_buffer, buffersize) < 0 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1741 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1742 buffer = PyString_AS_STRING(big_buffer);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1743 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1744 continue;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1745 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1746 end = buffer+nfilled+nread;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1747 q = buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1748 do {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1749 /* Process complete lines */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1750 p++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1751 line = PyString_FromStringAndSize(q, p-q);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1752 if (line == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1753 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1754 err = PyList_Append(list, line);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1755 Py_DECREF(line);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1756 if (err != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1757 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1758 q = p;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1759 p = (char *)memchr(q, '\n', end-q);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1760 } while (p != NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1761 /* Move the remaining incomplete line to the start */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1762 nfilled = end-q;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1763 memmove(buffer, q, nfilled);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1764 if (sizehint > 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1765 if (totalread >= (size_t)sizehint)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1766 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1767 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1768 if (nfilled != 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1769 /* Partial last line */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1770 line = PyString_FromStringAndSize(buffer, nfilled);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1771 if (line == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1772 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1773 if (sizehint > 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1774 /* Need to complete the last line */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1775 PyObject *rest = get_line(f, 0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1776 if (rest == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1777 Py_DECREF(line);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1778 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1779 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1780 PyString_Concat(&line, rest);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1781 Py_DECREF(rest);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1782 if (line == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1783 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1784 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1785 err = PyList_Append(list, line);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1786 Py_DECREF(line);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1787 if (err != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1788 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1789 }
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
1790
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
1791 cleanup:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1792 Py_XDECREF(big_buffer);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1793 return list;
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
1794
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
1795 error:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1796 Py_CLEAR(list);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1797 goto cleanup;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1798 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1799
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1800 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1801 file_write(PyFileObject *f, PyObject *args)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1802 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1803 Py_buffer pbuf;
64556
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1804 const char *s;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1805 Py_ssize_t n, n2;
64556
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1806 PyObject *encoded = NULL;
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1807
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1808 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1809 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1810 if (!f->writable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1811 return err_mode("writing");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1812 if (f->f_binary) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1813 if (!PyArg_ParseTuple(args, "s*", &pbuf))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1814 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1815 s = pbuf.buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1816 n = pbuf.len;
64556
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1817 }
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1818 else {
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1819 const char *encoding, *errors;
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1820 PyObject *text;
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1821 if (!PyArg_ParseTuple(args, "O", &text))
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1822 return NULL;
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1823
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1824 if (PyString_Check(text)) {
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1825 s = PyString_AS_STRING(text);
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1826 n = PyString_GET_SIZE(text);
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1827 } else if (PyUnicode_Check(text)) {
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1828 if (f->f_encoding != Py_None)
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1829 encoding = PyString_AS_STRING(f->f_encoding);
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1830 else
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1831 encoding = PyUnicode_GetDefaultEncoding();
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1832 if (f->f_errors != Py_None)
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1833 errors = PyString_AS_STRING(f->f_errors);
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1834 else
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1835 errors = "strict";
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1836 encoded = PyUnicode_AsEncodedString(text, encoding, errors);
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1837 if (encoded == NULL)
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1838 return NULL;
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1839 s = PyString_AS_STRING(encoded);
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1840 n = PyString_GET_SIZE(encoded);
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1841 } else {
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1842 if (PyObject_AsCharBuffer(text, &s, &n))
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1843 return NULL;
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1844 }
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1845 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1846 f->f_softspace = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1847 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1848 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1849 n2 = fwrite(s, 1, n, f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1850 FILE_END_ALLOW_THREADS(f)
64556
e60ef17561dc Issue #4947: The write() method of sys.stdout and sys.stderr uses their
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61677
diff changeset
1851 Py_XDECREF(encoded);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1852 if (f->f_binary)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1853 PyBuffer_Release(&pbuf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1854 if (n2 != n) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1855 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1856 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1857 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1858 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1859 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1860 return Py_None;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1861 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1862
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1863 static PyObject *
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1864 file_writelines(PyFileObject *f, PyObject *seq)
1362
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1865 {
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1866 #define CHUNKSIZE 1000
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1867 PyObject *list, *line;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1868 PyObject *it; /* iter(seq) */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1869 PyObject *result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1870 int index, islist;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1871 Py_ssize_t i, j, nwritten, len;
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1872
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1873 assert(seq != NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1874 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1875 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1876 if (!f->writable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1877 return err_mode("writing");
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1878
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1879 result = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1880 list = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1881 islist = PyList_Check(seq);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1882 if (islist)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1883 it = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1884 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1885 it = PyObject_GetIter(seq);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1886 if (it == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1887 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1888 "writelines() requires an iterable argument");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1889 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1890 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1891 /* From here on, fail by going to error, to reclaim "it". */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1892 list = PyList_New(CHUNKSIZE);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1893 if (list == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1894 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1895 }
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1896
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1897 /* Strategy: slurp CHUNKSIZE lines into a private list,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1898 checking that they are all strings, then write that list
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1899 without holding the interpreter lock, then come back for more. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1900 for (index = 0; ; index += CHUNKSIZE) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1901 if (islist) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1902 Py_XDECREF(list);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1903 list = PyList_GetSlice(seq, index, index+CHUNKSIZE);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1904 if (list == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1905 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1906 j = PyList_GET_SIZE(list);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1907 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1908 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1909 for (j = 0; j < CHUNKSIZE; j++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1910 line = PyIter_Next(it);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1911 if (line == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1912 if (PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1913 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1914 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1915 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1916 PyList_SetItem(list, j, line);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1917 }
65404
5181c3bf8970 iterators passed to writelines() can close their files; don't segfault #10125
Benjamin Peterson <benjamin@python.org>
parents: 64556
diff changeset
1918 /* The iterator might have closed the file on us. */
5181c3bf8970 iterators passed to writelines() can close their files; don't segfault #10125
Benjamin Peterson <benjamin@python.org>
parents: 64556
diff changeset
1919 if (f->f_fp == NULL) {
5181c3bf8970 iterators passed to writelines() can close their files; don't segfault #10125
Benjamin Peterson <benjamin@python.org>
parents: 64556
diff changeset
1920 err_closed();
5181c3bf8970 iterators passed to writelines() can close their files; don't segfault #10125
Benjamin Peterson <benjamin@python.org>
parents: 64556
diff changeset
1921 goto error;
5181c3bf8970 iterators passed to writelines() can close their files; don't segfault #10125
Benjamin Peterson <benjamin@python.org>
parents: 64556
diff changeset
1922 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1923 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1924 if (j == 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1925 break;
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1926
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1927 /* Check that all entries are indeed strings. If not,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1928 apply the same rules as for file.write() and
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1929 convert the results to strings. This is slow, but
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1930 seems to be the only way since all conversion APIs
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1931 could potentially execute Python code. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1932 for (i = 0; i < j; i++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1933 PyObject *v = PyList_GET_ITEM(list, i);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1934 if (!PyString_Check(v)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1935 const char *buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1936 if (((f->f_binary &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1937 PyObject_AsReadBuffer(v,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1938 (const void**)&buffer,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1939 &len)) ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1940 PyObject_AsCharBuffer(v,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1941 &buffer,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1942 &len))) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1943 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1944 "writelines() argument must be a sequence of strings");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1945 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1946 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1947 line = PyString_FromStringAndSize(buffer,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1948 len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1949 if (line == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1950 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1951 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1952 PyList_SET_ITEM(list, i, line);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1953 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1954 }
14213
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1955
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1956 /* Since we are releasing the global lock, the
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1957 following code may *not* execute Python code. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1958 f->f_softspace = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1959 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1960 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1961 for (i = 0; i < j; i++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1962 line = PyList_GET_ITEM(list, i);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1963 len = PyString_GET_SIZE(line);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1964 nwritten = fwrite(PyString_AS_STRING(line),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1965 1, len, f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1966 if (nwritten != len) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1967 FILE_ABORT_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1968 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1969 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1970 goto error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1971 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1972 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1973 FILE_END_ALLOW_THREADS(f)
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1974
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1975 if (j < CHUNKSIZE)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1976 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1977 }
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1978
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1979 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1980 result = Py_None;
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1981 error:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1982 Py_XDECREF(list);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1983 Py_XDECREF(it);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1984 return result;
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1985 #undef CHUNKSIZE
1362
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1986 }
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1987
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1988 static PyObject *
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36675
diff changeset
1989 file_self(PyFileObject *f)
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1990 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1991 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1992 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1993 Py_INCREF(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
1994 return (PyObject *)f;
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1995 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1996
38670
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1997 static PyObject *
47148
3d5cddc6e5e7 #2353: raise Py3k warning in file.xreadlines().
Georg Brandl <georg@python.org>
parents: 46578
diff changeset
1998 file_xreadlines(PyFileObject *f)
38670
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1999 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2000 if (PyErr_WarnPy3k("f.xreadlines() not supported in 3.x, "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2001 "try 'for line in f' instead", 1) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2002 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2003 return file_self(f);
47148
3d5cddc6e5e7 #2353: raise Py3k warning in file.xreadlines().
Georg Brandl <georg@python.org>
parents: 46578
diff changeset
2004 }
3d5cddc6e5e7 #2353: raise Py3k warning in file.xreadlines().
Georg Brandl <georg@python.org>
parents: 46578
diff changeset
2005
3d5cddc6e5e7 #2353: raise Py3k warning in file.xreadlines().
Georg Brandl <georg@python.org>
parents: 46578
diff changeset
2006 static PyObject *
45453
930b2802c037 #2067: file.__exit__() now calls subclasses' close() method.
Georg Brandl <georg@python.org>
parents: 45028
diff changeset
2007 file_exit(PyObject *f, PyObject *args)
38670
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
2008 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2009 PyObject *ret = PyObject_CallMethod(f, "close", NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2010 if (!ret)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2011 /* If error occurred, pass through */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2012 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2013 Py_DECREF(ret);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2014 /* We cannot return the result of close since a true
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2015 * value will be interpreted as "yes, swallow the
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2016 * exception if one was raised inside the with block". */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2017 Py_RETURN_NONE;
38670
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
2018 }
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
2019
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2020 PyDoc_STRVAR(readline_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2021 "readline([size]) -> next line from the file, as a string.\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2022 "\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2023 "Retain newline. A non-negative size argument limits the maximum\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2024 "number of bytes to return (an incomplete line may be returned then).\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2025 "Return an empty string at EOF.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2026
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2027 PyDoc_STRVAR(read_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2028 "read([size]) -> read at most size bytes, returned as a string.\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2029 "\n"
26672
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
2030 "If the size argument is negative or omitted, read until EOF is reached.\n"
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
2031 "Notice that when in non-blocking mode, less data than what was requested\n"
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
2032 "may be returned, even if no size parameter was given.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2033
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2034 PyDoc_STRVAR(write_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2035 "write(str) -> None. Write string str to file.\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2036 "\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2037 "Note that due to buffering, flush() or close() may be needed before\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2038 "the file on disk reflects the data written.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2039
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2040 PyDoc_STRVAR(fileno_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2041 "fileno() -> integer \"file descriptor\".\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2042 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2043 "This is needed for lower-level file interfaces, such os.read().");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2044
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2045 PyDoc_STRVAR(seek_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2046 "seek(offset[, whence]) -> None. Move to new file position.\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2047 "\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2048 "Argument offset is a byte count. Optional argument whence defaults to\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2049 "0 (offset from start of file, offset should be >= 0); other values are 1\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2050 "(move relative to current position, positive or negative), and 2 (move\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2051 "relative to end of file, usually negative, although many platforms allow\n"
30705
3ff03446f362 Patch #809535: Mention behaviour of seek on text files. Backported to 2.3.
Martin v. Löwis <martin@v.loewis.de>
parents: 30683
diff changeset
2052 "seeking beyond the end of a file). If the file is opened in text mode,\n"
3ff03446f362 Patch #809535: Mention behaviour of seek on text files. Backported to 2.3.
Martin v. Löwis <martin@v.loewis.de>
parents: 30683
diff changeset
2053 "only offsets returned by tell() are legal. Use of other offsets causes\n"
3ff03446f362 Patch #809535: Mention behaviour of seek on text files. Backported to 2.3.
Martin v. Löwis <martin@v.loewis.de>
parents: 30683
diff changeset
2054 "undefined behavior."
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2055 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2056 "Note that not all file objects are seekable.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2057
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
2058 #ifdef HAVE_FTRUNCATE
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2059 PyDoc_STRVAR(truncate_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2060 "truncate([size]) -> None. Truncate the file to at most size bytes.\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2061 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2062 "Size defaults to the current file position, as returned by tell().");
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
2063 #endif
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2064
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2065 PyDoc_STRVAR(tell_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2066 "tell() -> current file position, an integer (may be a long integer).");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2067
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2068 PyDoc_STRVAR(readinto_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2069 "readinto() -> Undocumented. Don't use this; it may go away.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2070
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2071 PyDoc_STRVAR(readlines_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2072 "readlines([size]) -> list of strings, each a line from the file.\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2073 "\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2074 "Call readline() repeatedly and return a list of the lines so read.\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2075 "The optional size argument, if given, is an approximate bound on the\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2076 "total number of bytes in the lines returned.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2077
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2078 PyDoc_STRVAR(xreadlines_doc,
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2079 "xreadlines() -> returns self.\n"
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2080 "\n"
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2081 "For backward compatibility. File objects now include the performance\n"
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2082 "optimizations previously implemented in the xreadlines module.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2083
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2084 PyDoc_STRVAR(writelines_doc,
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
2085 "writelines(sequence_of_strings) -> None. Write the strings to the file.\n"
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2086 "\n"
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
2087 "Note that newlines are not added. The sequence can be any iterable object\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2088 "producing strings. This is equivalent to calling write() for each string.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2089
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2090 PyDoc_STRVAR(flush_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2091 "flush() -> None. Flush the internal I/O buffer.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2092
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2093 PyDoc_STRVAR(close_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2094 "close() -> None or (perhaps) an integer. Close the file.\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2095 "\n"
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22718
diff changeset
2096 "Sets data attribute .closed to True. A closed file cannot be used for\n"
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2097 "further I/O operations. close() may be called more than once without\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2098 "error. Some kinds of file objects (for example, opened by popen())\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2099 "may return an exit status upon closing.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2100
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2101 PyDoc_STRVAR(isatty_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2102 "isatty() -> true or false. True if the file is connected to a tty device.");
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2103
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36675
diff changeset
2104 PyDoc_STRVAR(enter_doc,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2105 "__enter__() -> self.");
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36675
diff changeset
2106
38670
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
2107 PyDoc_STRVAR(exit_doc,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2108 "__exit__(*excinfo) -> None. Closes the file.");
38670
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
2109
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2110 static PyMethodDef file_methods[] = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2111 {"readline", (PyCFunction)file_readline, METH_VARARGS, readline_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2112 {"read", (PyCFunction)file_read, METH_VARARGS, read_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2113 {"write", (PyCFunction)file_write, METH_VARARGS, write_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2114 {"fileno", (PyCFunction)file_fileno, METH_NOARGS, fileno_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2115 {"seek", (PyCFunction)file_seek, METH_VARARGS, seek_doc},
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2116 #ifdef HAVE_FTRUNCATE
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2117 {"truncate", (PyCFunction)file_truncate, METH_VARARGS, truncate_doc},
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
2118 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2119 {"tell", (PyCFunction)file_tell, METH_NOARGS, tell_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2120 {"readinto", (PyCFunction)file_readinto, METH_VARARGS, readinto_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2121 {"readlines", (PyCFunction)file_readlines, METH_VARARGS, readlines_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2122 {"xreadlines",(PyCFunction)file_xreadlines, METH_NOARGS, xreadlines_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2123 {"writelines",(PyCFunction)file_writelines, METH_O, writelines_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2124 {"flush", (PyCFunction)file_flush, METH_NOARGS, flush_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2125 {"close", (PyCFunction)file_close, METH_NOARGS, close_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2126 {"isatty", (PyCFunction)file_isatty, METH_NOARGS, isatty_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2127 {"__enter__", (PyCFunction)file_self, METH_NOARGS, enter_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2128 {"__exit__", (PyCFunction)file_exit, METH_VARARGS, exit_doc},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2129 {NULL, NULL} /* sentinel */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2130 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2131
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2132 #define OFF(x) offsetof(PyFileObject, x)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
2133
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19996
diff changeset
2134 static PyMemberDef file_memberlist[] = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2135 {"mode", T_OBJECT, OFF(f_mode), RO,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2136 "file mode ('r', 'U', 'w', 'a', possibly with 'b' or '+' added)"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2137 {"name", T_OBJECT, OFF(f_name), RO,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2138 "file name"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2139 {"encoding", T_OBJECT, OFF(f_encoding), RO,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2140 "file encoding"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2141 {"errors", T_OBJECT, OFF(f_errors), RO,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2142 "Unicode error handler"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2143 /* getattr(f, "closed") is implemented without this table */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2144 {NULL} /* Sentinel */
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
2145 };
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
2146
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2147 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2148 get_closed(PyFileObject *f, void *closure)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2149 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2150 return PyBool_FromLong((long)(f->f_fp == 0));
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
2151 }
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2152 static PyObject *
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2153 get_newlines(PyFileObject *f, void *closure)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2154 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2155 switch (f->f_newlinetypes) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2156 case NEWLINE_UNKNOWN:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2157 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2158 return Py_None;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2159 case NEWLINE_CR:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2160 return PyString_FromString("\r");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2161 case NEWLINE_LF:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2162 return PyString_FromString("\n");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2163 case NEWLINE_CR|NEWLINE_LF:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2164 return Py_BuildValue("(ss)", "\r", "\n");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2165 case NEWLINE_CRLF:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2166 return PyString_FromString("\r\n");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2167 case NEWLINE_CR|NEWLINE_CRLF:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2168 return Py_BuildValue("(ss)", "\r", "\r\n");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2169 case NEWLINE_LF|NEWLINE_CRLF:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2170 return Py_BuildValue("(ss)", "\n", "\r\n");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2171 case NEWLINE_CR|NEWLINE_LF|NEWLINE_CRLF:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2172 return Py_BuildValue("(sss)", "\r", "\n", "\r\n");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2173 default:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2174 PyErr_Format(PyExc_SystemError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2175 "Unknown newlines value 0x%x\n",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2176 f->f_newlinetypes);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2177 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2178 }
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2179 }
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
2180
45985
bf07bad1d72f #2348: add py3k warning for file.softspace.
Georg Brandl <georg@python.org>
parents: 45854
diff changeset
2181 static PyObject *
bf07bad1d72f #2348: add py3k warning for file.softspace.
Georg Brandl <georg@python.org>
parents: 45854
diff changeset
2182 get_softspace(PyFileObject *f, void *closure)
bf07bad1d72f #2348: add py3k warning for file.softspace.
Georg Brandl <georg@python.org>
parents: 45854
diff changeset
2183 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2184 if (PyErr_WarnPy3k("file.softspace not supported in 3.x", 1) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2185 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2186 return PyInt_FromLong(f->f_softspace);
45985
bf07bad1d72f #2348: add py3k warning for file.softspace.
Georg Brandl <georg@python.org>
parents: 45854
diff changeset
2187 }
bf07bad1d72f #2348: add py3k warning for file.softspace.
Georg Brandl <georg@python.org>
parents: 45854
diff changeset
2188
bf07bad1d72f #2348: add py3k warning for file.softspace.
Georg Brandl <georg@python.org>
parents: 45854
diff changeset
2189 static int
bf07bad1d72f #2348: add py3k warning for file.softspace.
Georg Brandl <georg@python.org>
parents: 45854
diff changeset
2190 set_softspace(PyFileObject *f, PyObject *value)
bf07bad1d72f #2348: add py3k warning for file.softspace.
Georg Brandl <georg@python.org>
parents: 45854
diff changeset
2191 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2192 int new;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2193 if (PyErr_WarnPy3k("file.softspace not supported in 3.x", 1) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2194 return -1;
45985
bf07bad1d72f #2348: add py3k warning for file.softspace.
Georg Brandl <georg@python.org>
parents: 45854
diff changeset
2195
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2196 if (value == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2197 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2198 "can't delete softspace attribute");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2199 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2200 }
45985
bf07bad1d72f #2348: add py3k warning for file.softspace.
Georg Brandl <georg@python.org>
parents: 45854
diff changeset
2201
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2202 new = PyInt_AsLong(value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2203 if (new == -1 && PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2204 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2205 f->f_softspace = new;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2206 return 0;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2207 }
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
2208
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
2209 static PyGetSetDef file_getsetlist[] = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2210 {"closed", (getter)get_closed, NULL, "True if the file is closed"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2211 {"newlines", (getter)get_newlines, NULL,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2212 "end-of-line convention used in this file"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2213 {"softspace", (getter)get_softspace, (setter)set_softspace,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2214 "flag indicating that a space needs to be printed; used by print"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2215 {0},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2216 };
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2217
24615
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
2218 static void
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2219 drop_readahead(PyFileObject *f)
17609
79f0cd3a71a1 Oops, forgot to merge this from the iter-branch to the trunk.
Guido van Rossum <guido@python.org>
parents: 17518
diff changeset
2220 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2221 if (f->f_buf != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2222 PyMem_Free(f->f_buf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2223 f->f_buf = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2224 }
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2225 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2226
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
2227 /* Make sure that file has a readahead buffer with at least one byte
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
2228 (unless at EOF) and no more than bufsize. Returns negative value on
37354
016d3d23ff52 Bug #1177964: make file iterator raise MemoryError on too big files
Georg Brandl <georg@python.org>
parents: 37304
diff changeset
2229 error, will set MemoryError if bufsize bytes cannot be allocated. */
24615
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
2230 static int
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
2231 readahead(PyFileObject *f, int bufsize)
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
2232 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2233 Py_ssize_t chunksize;
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2234
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2235 if (f->f_buf != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2236 if( (f->f_bufend - f->f_bufptr) >= 1)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2237 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2238 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2239 drop_readahead(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2240 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2241 if ((f->f_buf = (char *)PyMem_Malloc(bufsize)) == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2242 PyErr_NoMemory();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2243 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2244 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2245 FILE_BEGIN_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2246 errno = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2247 chunksize = Py_UniversalNewlineFread(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2248 f->f_buf, bufsize, f->f_fp, (PyObject *)f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2249 FILE_END_ALLOW_THREADS(f)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2250 if (chunksize == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2251 if (ferror(f->f_fp)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2252 PyErr_SetFromErrno(PyExc_IOError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2253 clearerr(f->f_fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2254 drop_readahead(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2255 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2256 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2257 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2258 f->f_bufptr = f->f_buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2259 f->f_bufend = f->f_buf + chunksize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2260 return 0;
17609
79f0cd3a71a1 Oops, forgot to merge this from the iter-branch to the trunk.
Guido van Rossum <guido@python.org>
parents: 17518
diff changeset
2261 }
79f0cd3a71a1 Oops, forgot to merge this from the iter-branch to the trunk.
Guido van Rossum <guido@python.org>
parents: 17518
diff changeset
2262
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2263 /* Used by file_iternext. The returned string will start with 'skip'
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
2264 uninitialized bytes followed by the remainder of the line. Don't be
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
2265 horrified by the recursive call: maximum recursion depth is limited by
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2266 logarithmic buffer growth to about 50 even when reading a 1gb line. */
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2267
24615
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
2268 static PyStringObject *
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
2269 readahead_get_line_skip(PyFileObject *f, int skip, int bufsize)
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
2270 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2271 PyStringObject* s;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2272 char *bufptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2273 char *buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2274 Py_ssize_t len;
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2275
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2276 if (f->f_buf == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2277 if (readahead(f, bufsize) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2278 return NULL;
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2279
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2280 len = f->f_bufend - f->f_bufptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2281 if (len == 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2282 return (PyStringObject *)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2283 PyString_FromStringAndSize(NULL, skip);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2284 bufptr = (char *)memchr(f->f_bufptr, '\n', len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2285 if (bufptr != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2286 bufptr++; /* Count the '\n' */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2287 len = bufptr - f->f_bufptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2288 s = (PyStringObject *)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2289 PyString_FromStringAndSize(NULL, skip+len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2290 if (s == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2291 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2292 memcpy(PyString_AS_STRING(s)+skip, f->f_bufptr, len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2293 f->f_bufptr = bufptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2294 if (bufptr == f->f_bufend)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2295 drop_readahead(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2296 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2297 bufptr = f->f_bufptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2298 buf = f->f_buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2299 f->f_buf = NULL; /* Force new readahead buffer */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2300 assert(skip+len < INT_MAX);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2301 s = readahead_get_line_skip(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2302 f, (int)(skip+len), bufsize + (bufsize>>2) );
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2303 if (s == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2304 PyMem_Free(buf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2305 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2306 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2307 memcpy(PyString_AS_STRING(s)+skip, bufptr, len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2308 PyMem_Free(buf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2309 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2310 return s;
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2311 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2312
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2313 /* A larger buffer size may actually decrease performance. */
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2314 #define READAHEAD_BUFSIZE 8192
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2315
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2316 static PyObject *
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2317 file_iternext(PyFileObject *f)
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2318 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2319 PyStringObject* l;
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2320
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2321 if (f->f_fp == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2322 return err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2323 if (!f->readable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2324 return err_mode("reading");
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2325
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2326 l = readahead_get_line_skip(f, 0, READAHEAD_BUFSIZE);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2327 if (l == NULL || PyString_GET_SIZE(l) == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2328 Py_XDECREF(l);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2329 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2330 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2331 return (PyObject *)l;
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2332 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2333
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
2334
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2335 static PyObject *
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2336 file_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2337 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2338 PyObject *self;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2339 static PyObject *not_yet_string;
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2340
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2341 assert(type != NULL && type->tp_alloc != NULL);
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2342
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2343 if (not_yet_string == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2344 not_yet_string = PyString_InternFromString("<uninitialized file>");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2345 if (not_yet_string == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2346 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2347 }
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2348
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2349 self = type->tp_alloc(type, 0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2350 if (self != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2351 /* Always fill in the name and mode, so that nobody else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2352 needs to special-case NULLs there. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2353 Py_INCREF(not_yet_string);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2354 ((PyFileObject *)self)->f_name = not_yet_string;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2355 Py_INCREF(not_yet_string);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2356 ((PyFileObject *)self)->f_mode = not_yet_string;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2357 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2358 ((PyFileObject *)self)->f_encoding = Py_None;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2359 Py_INCREF(Py_None);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2360 ((PyFileObject *)self)->f_errors = Py_None;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2361 ((PyFileObject *)self)->weakreflist = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2362 ((PyFileObject *)self)->unlocked_count = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2363 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2364 return self;
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2365 }
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2366
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2367 static int
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2368 file_init(PyObject *self, PyObject *args, PyObject *kwds)
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2369 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2370 PyFileObject *foself = (PyFileObject *)self;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2371 int ret = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2372 static char *kwlist[] = {"name", "mode", "buffering", 0};
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2373 char *name = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2374 char *mode = "r";
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2375 int bufsize = -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2376 int wideargument = 0;
54975
70eda02c7a98 Issue #6368: Fixed unused variable warning on Unix.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54895
diff changeset
2377 #ifdef MS_WINDOWS
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2378 PyObject *po;
54975
70eda02c7a98 Issue #6368: Fixed unused variable warning on Unix.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54895
diff changeset
2379 #endif
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2380
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2381 assert(PyFile_Check(self));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2382 if (foself->f_fp != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2383 /* Have to close the existing file first. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2384 PyObject *closeresult = file_close(foself);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2385 if (closeresult == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2386 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2387 Py_DECREF(closeresult);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2388 }
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2389
54126
d64d47ee54a1 Issue #3527: Removed Py_WIN_WIDE_FILENAMES which is not used any more.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51311
diff changeset
2390 #ifdef MS_WINDOWS
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2391 if (PyArg_ParseTupleAndKeywords(args, kwds, "U|si:file",
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2392 kwlist, &po, &mode, &bufsize)) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2393 wideargument = 1;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2394 if (fill_file_fields(foself, NULL, po, mode,
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2395 fclose) == NULL)
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2396 goto Error;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2397 } else {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2398 /* Drop the argument parsing error as narrow
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2399 strings are also valid. */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 60203
diff changeset
2400 PyErr_Clear();
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2401 }
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2402 #endif
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2403
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2404 if (!wideargument) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2405 PyObject *o_name;
31753
2eb3175fc59b Changed file.name to be the object passed as the 'name' argument to file()
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31691
diff changeset
2406
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2407 if (!PyArg_ParseTupleAndKeywords(args, kwds, "et|si:file", kwlist,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2408 Py_FileSystemDefaultEncoding,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2409 &name,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2410 &mode, &bufsize))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2411 return -1;
31753
2eb3175fc59b Changed file.name to be the object passed as the 'name' argument to file()
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31691
diff changeset
2412
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2413 /* We parse again to get the name as a PyObject */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2414 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:file",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2415 kwlist, &o_name, &mode,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2416 &bufsize))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2417 goto Error;
31753
2eb3175fc59b Changed file.name to be the object passed as the 'name' argument to file()
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31691
diff changeset
2418
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2419 if (fill_file_fields(foself, NULL, o_name, mode,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2420 fclose) == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2421 goto Error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2422 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2423 if (open_the_file(foself, name, mode) == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2424 goto Error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2425 foself->f_setbuf = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2426 PyFile_SetBufSize(self, bufsize);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2427 goto Done;
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2428
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2429 Error:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2430 ret = -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2431 /* fall through */
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2432 Done:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2433 PyMem_Free(name); /* free the encoded string */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2434 return ret;
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2435 }
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2436
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2437 PyDoc_VAR(file_doc) =
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2438 PyDoc_STR(
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2439 "file(name[, mode[, buffering]]) -> file object\n"
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2440 "\n"
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2441 "Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n"
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2442 "writing or appending. The file will be created if it doesn't exist\n"
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2443 "when opened for writing or appending; it will be truncated when\n"
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2444 "opened for writing. Add a 'b' to the mode for binary files.\n"
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2445 "Add a '+' to the mode to allow simultaneous reading and writing.\n"
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2446 "If the buffering argument is given, 0 means unbuffered, 1 means line\n"
44222
9a976a6ee936 Note that open() is the preferred way to open files (issue 1510).
Skip Montanaro <skip@pobox.com>
parents: 43422
diff changeset
2447 "buffered, and larger numbers specify the buffer size. The preferred way\n"
9a976a6ee936 Note that open() is the preferred way to open files (issue 1510).
Skip Montanaro <skip@pobox.com>
parents: 43422
diff changeset
2448 "to open a file is with the builtin open() function.\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2449 )
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2450 PyDoc_STR(
23514
9eea5edd857f file_doc: Add some description of the U mode character, but only when
Barry Warsaw <barry@python.org>
parents: 23295
diff changeset
2451 "Add a 'U' to mode to open the file for input with universal newline\n"
9eea5edd857f file_doc: Add some description of the U mode character, but only when
Barry Warsaw <barry@python.org>
parents: 23295
diff changeset
2452 "support. Any line ending in the input file will be seen as a '\\n'\n"
9eea5edd857f file_doc: Add some description of the U mode character, but only when
Barry Warsaw <barry@python.org>
parents: 23295
diff changeset
2453 "in Python. Also, a file so opened gains the attribute 'newlines';\n"
9eea5edd857f file_doc: Add some description of the U mode character, but only when
Barry Warsaw <barry@python.org>
parents: 23295
diff changeset
2454 "the value for this attribute is one of None (no newline read yet),\n"
9eea5edd857f file_doc: Add some description of the U mode character, but only when
Barry Warsaw <barry@python.org>
parents: 23295
diff changeset
2455 "'\\r', '\\n', '\\r\\n' or a tuple containing all the newline types seen.\n"
9eea5edd857f file_doc: Add some description of the U mode character, but only when
Barry Warsaw <barry@python.org>
parents: 23295
diff changeset
2456 "\n"
9eea5edd857f file_doc: Add some description of the U mode character, but only when
Barry Warsaw <barry@python.org>
parents: 23295
diff changeset
2457 "'U' cannot be combined with 'w' or '+' mode.\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2458 );
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2459
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2460 PyTypeObject PyFile_Type = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2461 PyVarObject_HEAD_INIT(&PyType_Type, 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2462 "file",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2463 sizeof(PyFileObject),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2464 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2465 (destructor)file_dealloc, /* tp_dealloc */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2466 0, /* tp_print */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2467 0, /* tp_getattr */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2468 0, /* tp_setattr */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2469 0, /* tp_compare */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2470 (reprfunc)file_repr, /* tp_repr */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2471 0, /* tp_as_number */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2472 0, /* tp_as_sequence */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2473 0, /* tp_as_mapping */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2474 0, /* tp_hash */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2475 0, /* tp_call */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2476 0, /* tp_str */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2477 PyObject_GenericGetAttr, /* tp_getattro */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2478 /* softspace is writable: we must supply tp_setattro */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2479 PyObject_GenericSetAttr, /* tp_setattro */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2480 0, /* tp_as_buffer */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2481 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2482 file_doc, /* tp_doc */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2483 0, /* tp_traverse */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2484 0, /* tp_clear */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2485 0, /* tp_richcompare */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2486 offsetof(PyFileObject, weakreflist), /* tp_weaklistoffset */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2487 (getiterfunc)file_self, /* tp_iter */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2488 (iternextfunc)file_iternext, /* tp_iternext */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2489 file_methods, /* tp_methods */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2490 file_memberlist, /* tp_members */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2491 file_getsetlist, /* tp_getset */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2492 0, /* tp_base */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2493 0, /* tp_dict */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2494 0, /* tp_descr_get */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2495 0, /* tp_descr_set */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2496 0, /* tp_dictoffset */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2497 file_init, /* tp_init */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2498 PyType_GenericAlloc, /* tp_alloc */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2499 file_new, /* tp_new */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2500 PyObject_Del, /* tp_free */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2501 };
177
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
2502
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
2503 /* Interface for the 'soft space' between print items. */
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
2504
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
2505 int
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2506 PyFile_SoftSpace(PyObject *f, int newflag)
177
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
2507 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2508 long oldflag = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2509 if (f == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2510 /* Do nothing */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2511 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2512 else if (PyFile_Check(f)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2513 oldflag = ((PyFileObject *)f)->f_softspace;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2514 ((PyFileObject *)f)->f_softspace = newflag;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2515 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2516 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2517 PyObject *v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2518 v = PyObject_GetAttrString(f, "softspace");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2519 if (v == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2520 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2521 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2522 if (PyInt_Check(v))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2523 oldflag = PyInt_AsLong(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2524 assert(oldflag < INT_MAX);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2525 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2526 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2527 v = PyInt_FromLong((long)newflag);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2528 if (v == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2529 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2530 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2531 if (PyObject_SetAttrString(f, "softspace", v) != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2532 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2533 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2534 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2535 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2536 return (int)oldflag;
177
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
2537 }
1073
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
2538
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
2539 /* Interfaces to write objects/strings to file-like objects */
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
2540
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
2541 int
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2542 PyFile_WriteObject(PyObject *v, PyObject *f, int flags)
1073
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
2543 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2544 PyObject *writer, *value, *args, *result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2545 if (f == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2546 PyErr_SetString(PyExc_TypeError, "writeobject with NULL file");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2547 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2548 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2549 else if (PyFile_Check(f)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2550 PyFileObject *fobj = (PyFileObject *) f;
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2551 #ifdef Py_USING_UNICODE
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2552 PyObject *enc = fobj->f_encoding;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2553 int result;
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2554 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2555 if (fobj->f_fp == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2556 err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2557 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2558 }
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2559 #ifdef Py_USING_UNICODE
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2560 if ((flags & Py_PRINT_RAW) &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2561 PyUnicode_Check(v) && enc != Py_None) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2562 char *cenc = PyString_AS_STRING(enc);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2563 char *errors = fobj->f_errors == Py_None ?
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2564 "strict" : PyString_AS_STRING(fobj->f_errors);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2565 value = PyUnicode_AsEncodedString(v, cenc, errors);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2566 if (value == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2567 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2568 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2569 value = v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2570 Py_INCREF(value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2571 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2572 result = file_PyObject_Print(value, fobj, flags);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2573 Py_DECREF(value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2574 return result;
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2575 #else
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2576 return file_PyObject_Print(v, fobj, flags);
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2577 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2578 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2579 writer = PyObject_GetAttrString(f, "write");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2580 if (writer == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2581 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2582 if (flags & Py_PRINT_RAW) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2583 if (PyUnicode_Check(v)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2584 value = v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2585 Py_INCREF(value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2586 } else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2587 value = PyObject_Str(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2588 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2589 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2590 value = PyObject_Repr(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2591 if (value == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2592 Py_DECREF(writer);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2593 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2594 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2595 args = PyTuple_Pack(1, value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2596 if (args == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2597 Py_DECREF(value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2598 Py_DECREF(writer);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2599 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2600 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2601 result = PyEval_CallObject(writer, args);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2602 Py_DECREF(args);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2603 Py_DECREF(value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2604 Py_DECREF(writer);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2605 if (result == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2606 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2607 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2608 return 0;
1073
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
2609 }
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
2610
5605
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2611 int
21095
b1280cba79b5 PyFile_WriteString(): change prototype so that the string arg is
Tim Peters <tim.peters@gmail.com>
parents: 20942
diff changeset
2612 PyFile_WriteString(const char *s, PyObject *f)
1073
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
2613 {
46329
86da9298b908 Make file objects as thread safe as the underlying libc FILE* implementation.
Gregory P. Smith <greg@mad-scientist.com>
parents: 45985
diff changeset
2614
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2615 if (f == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2616 /* Should be caused by a pre-existing error */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2617 if (!PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2618 PyErr_SetString(PyExc_SystemError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2619 "null file for PyFile_WriteString");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2620 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2621 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2622 else if (PyFile_Check(f)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2623 PyFileObject *fobj = (PyFileObject *) f;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2624 FILE *fp = PyFile_AsFile(f);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2625 if (fp == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2626 err_closed();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2627 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2628 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2629 FILE_BEGIN_ALLOW_THREADS(fobj)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2630 fputs(s, fp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2631 FILE_END_ALLOW_THREADS(fobj)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2632 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2633 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2634 else if (!PyErr_Occurred()) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2635 PyObject *v = PyString_FromString(s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2636 int err;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2637 if (v == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2638 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2639 err = PyFile_WriteObject(v, f, Py_PRINT_RAW);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2640 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2641 return err;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2642 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2643 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2644 return -1;
1073
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
2645 }
13591
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2646
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2647 /* Try to get a file-descriptor from a Python object. If the object
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2648 is an integer or long integer, its value is returned. If not, the
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2649 object's fileno() method is called if it exists; the method must return
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2650 an integer or long integer, which is returned as the file descriptor value.
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2651 -1 is returned on failure.
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2652 */
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2653
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2654 int PyObject_AsFileDescriptor(PyObject *o)
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2655 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2656 int fd;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2657 PyObject *meth;
13591
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2658
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2659 if (PyInt_Check(o)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2660 fd = PyInt_AsLong(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2661 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2662 else if (PyLong_Check(o)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2663 fd = PyLong_AsLong(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2664 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2665 else if ((meth = PyObject_GetAttrString(o, "fileno")) != NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2666 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2667 PyObject *fno = PyEval_CallObject(meth, NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2668 Py_DECREF(meth);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2669 if (fno == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2670 return -1;
15754
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
2671
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2672 if (PyInt_Check(fno)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2673 fd = PyInt_AsLong(fno);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2674 Py_DECREF(fno);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2675 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2676 else if (PyLong_Check(fno)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2677 fd = PyLong_AsLong(fno);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2678 Py_DECREF(fno);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2679 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2680 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2681 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2682 "fileno() returned a non-integer");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2683 Py_DECREF(fno);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2684 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2685 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2686 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2687 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2688 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2689 "argument must be an int, or have a fileno() method.");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2690 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2691 }
13591
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2692
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2693 if (fd < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2694 PyErr_Format(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2695 "file descriptor cannot be a negative integer (%i)",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2696 fd);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2697 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2698 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2699 return fd;
13591
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2700 }
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2701
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2702 /* From here on we need access to the real fgets and fread */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2703 #undef fgets
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2704 #undef fread
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2705
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2706 /*
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2707 ** Py_UniversalNewlineFgets is an fgets variation that understands
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2708 ** all of \r, \n and \r\n conventions.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2709 ** The stream should be opened in binary mode.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2710 ** If fobj is NULL the routine always does newline conversion, and
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2711 ** it may peek one char ahead to gobble the second char in \r\n.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2712 ** If fobj is non-NULL it must be a PyFileObject. In this case there
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2713 ** is no readahead but in stead a flag is used to skip a following
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2714 ** \n on the next read. Also, if the file is open in binary mode
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2715 ** the whole conversion is skipped. Finally, the routine keeps track of
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2716 ** the different types of newlines seen.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2717 ** Note that we need no error handling: fgets() treats error and eof
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2718 ** identically.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2719 */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2720 char *
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2721 Py_UniversalNewlineFgets(char *buf, int n, FILE *stream, PyObject *fobj)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2722 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2723 char *p = buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2724 int c;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2725 int newlinetypes = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2726 int skipnextlf = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2727 int univ_newline = 1;
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2728
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2729 if (fobj) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2730 if (!PyFile_Check(fobj)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2731 errno = ENXIO; /* What can you do... */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2732 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2733 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2734 univ_newline = ((PyFileObject *)fobj)->f_univ_newline;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2735 if ( !univ_newline )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2736 return fgets(buf, n, stream);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2737 newlinetypes = ((PyFileObject *)fobj)->f_newlinetypes;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2738 skipnextlf = ((PyFileObject *)fobj)->f_skipnextlf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2739 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2740 FLOCKFILE(stream);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2741 c = 'x'; /* Shut up gcc warning */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2742 while (--n > 0 && (c = GETC(stream)) != EOF ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2743 if (skipnextlf ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2744 skipnextlf = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2745 if (c == '\n') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2746 /* Seeing a \n here with skipnextlf true
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2747 ** means we saw a \r before.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2748 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2749 newlinetypes |= NEWLINE_CRLF;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2750 c = GETC(stream);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2751 if (c == EOF) break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2752 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2753 /*
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2754 ** Note that c == EOF also brings us here,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2755 ** so we're okay if the last char in the file
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2756 ** is a CR.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2757 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2758 newlinetypes |= NEWLINE_CR;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2759 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2760 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2761 if (c == '\r') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2762 /* A \r is translated into a \n, and we skip
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2763 ** an adjacent \n, if any. We don't set the
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2764 ** newlinetypes flag until we've seen the next char.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2765 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2766 skipnextlf = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2767 c = '\n';
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2768 } else if ( c == '\n') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2769 newlinetypes |= NEWLINE_LF;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2770 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2771 *p++ = c;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2772 if (c == '\n') break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2773 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2774 if ( c == EOF && skipnextlf )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2775 newlinetypes |= NEWLINE_CR;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2776 FUNLOCKFILE(stream);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2777 *p = '\0';
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2778 if (fobj) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2779 ((PyFileObject *)fobj)->f_newlinetypes = newlinetypes;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2780 ((PyFileObject *)fobj)->f_skipnextlf = skipnextlf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2781 } else if ( skipnextlf ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2782 /* If we have no file object we cannot save the
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2783 ** skipnextlf flag. We have to readahead, which
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2784 ** will cause a pause if we're reading from an
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2785 ** interactive stream, but that is very unlikely
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2786 ** unless we're doing something silly like
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2787 ** execfile("/dev/tty").
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2788 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2789 c = GETC(stream);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2790 if ( c != '\n' )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2791 ungetc(c, stream);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2792 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2793 if (p == buf)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2794 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2795 return buf;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2796 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2797
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2798 /*
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2799 ** Py_UniversalNewlineFread is an fread variation that understands
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2800 ** all of \r, \n and \r\n conventions.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2801 ** The stream should be opened in binary mode.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2802 ** fobj must be a PyFileObject. In this case there
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2803 ** is no readahead but in stead a flag is used to skip a following
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2804 ** \n on the next read. Also, if the file is open in binary mode
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2805 ** the whole conversion is skipped. Finally, the routine keeps track of
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2806 ** the different types of newlines seen.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2807 */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2808 size_t
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2809 Py_UniversalNewlineFread(char *buf, size_t n,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2810 FILE *stream, PyObject *fobj)
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2811 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2812 char *dst = buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2813 PyFileObject *f = (PyFileObject *)fobj;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2814 int newlinetypes, skipnextlf;
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2815
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2816 assert(buf != NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2817 assert(stream != NULL);
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2818
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2819 if (!fobj || !PyFile_Check(fobj)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2820 errno = ENXIO; /* What can you do... */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2821 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2822 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2823 if (!f->f_univ_newline)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2824 return fread(buf, 1, n, stream);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2825 newlinetypes = f->f_newlinetypes;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2826 skipnextlf = f->f_skipnextlf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2827 /* Invariant: n is the number of bytes remaining to be filled
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2828 * in the buffer.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2829 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2830 while (n) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2831 size_t nread;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2832 int shortread;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2833 char *src = dst;
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2834
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2835 nread = fread(dst, 1, n, stream);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2836 assert(nread <= n);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2837 if (nread == 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2838 break;
27768
2d55be3a8ec3 SF patch #683187, fix universal newline problems on error
Neal Norwitz <nnorwitz@gmail.com>
parents: 27060
diff changeset
2839
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2840 n -= nread; /* assuming 1 byte out for each in; will adjust */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2841 shortread = n != 0; /* true iff EOF or error */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2842 while (nread--) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2843 char c = *src++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2844 if (c == '\r') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2845 /* Save as LF and set flag to skip next LF. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2846 *dst++ = '\n';
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2847 skipnextlf = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2848 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2849 else if (skipnextlf && c == '\n') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2850 /* Skip LF, and remember we saw CR LF. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2851 skipnextlf = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2852 newlinetypes |= NEWLINE_CRLF;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2853 ++n;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2854 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2855 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2856 /* Normal char to be stored in buffer. Also
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2857 * update the newlinetypes flag if either this
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2858 * is an LF or the previous char was a CR.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2859 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2860 if (c == '\n')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2861 newlinetypes |= NEWLINE_LF;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2862 else if (skipnextlf)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2863 newlinetypes |= NEWLINE_CR;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2864 *dst++ = c;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2865 skipnextlf = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2866 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2867 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2868 if (shortread) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2869 /* If this is EOF, update type flags. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2870 if (skipnextlf && feof(stream))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2871 newlinetypes |= NEWLINE_CR;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2872 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2873 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2874 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2875 f->f_newlinetypes = newlinetypes;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2876 f->f_skipnextlf = skipnextlf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58714
diff changeset
2877 return dst - buf;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2878 }
37655
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
2879
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
2880 #ifdef __cplusplus
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
2881 }
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
2882 #endif