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