Mercurial > cpython-lru_cache-weakref
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 |
| rev | line source |
|---|---|
| 6 | 1 /* File object implementation */ |
| 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 | 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 | 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 | 73 FILE * |
|
13454
fcc75a3748f5
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
74 PyFile_AsFile(PyObject *f) |
| 6 | 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 | 80 } |
| 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 | 91 } |
| 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 | 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 | 183 } |
| 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 | 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 | 507 } |
| 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 | 611 /* Methods */ |
| 612 | |
| 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 | 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 | 634 } |
| 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 | 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 | 666 } |
| 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 | 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 | 677 } |
| 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 | 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 | 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 | 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 | 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 | 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 | 1037 #if defined(EWOULDBLOCK) && defined(EAGAIN) && EWOULDBLOCK != EAGAIN |
| 1038 #define BLOCKED_ERRNO(x) ((x) == EWOULDBLOCK || (x) == EAGAIN) | |
| 1039 #else | |
| 1040 #ifdef EWOULDBLOCK | |
| 1041 #define BLOCKED_ERRNO(x) ((x) == EWOULDBLOCK) | |
| 1042 #else | |
| 1043 #ifdef EAGAIN | |
| 1044 #define BLOCKED_ERRNO(x) ((x) == EAGAIN) | |
| 1045 #else | |
| 1046 #define BLOCKED_ERRNO(x) 0 | |
| 1047 #endif | |
| 1048 #endif | |
| 1049 #endif | |
| 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 | 1130 } |
| 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 | 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 | 1798 } |
| 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 | 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 | 1861 } |
| 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 | 2030 "If the size argument is negative or omitted, read until EOF is reached.\n" |
| 2031 "Notice that when in non-blocking mode, less data than what was requested\n" | |
| 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 | 2130 }; |
| 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 | 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 | 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 | 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 |
