annotate Objects/fileobject.c @ 39042:c02fa187e0f4 legacy-trunk

Part of SF patch #1484695. This removes dead code. The chksum was already verified in .frombuf() on the lines above. If there was a problem an exception is raised, so there was no way this condition could have been true.
author Neal Norwitz <nnorwitz@gmail.com>
date Mon, 10 Jul 2006 00:23:17 +0000
parents 75bdb1eb0766
children 35d50fbe0b88
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* File object implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
3 #define PY_SSIZE_T_CLEAN
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
4 #include "Python.h"
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
5 #include "structmember.h"
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
38716
42808526511c Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 38670
diff changeset
7 #ifdef HAVE_SYS_TYPES_H
9809
93d70308be17 Need to include <sys/types.h> for off_t.
Guido van Rossum <guido@python.org>
parents: 9789
diff changeset
8 #include <sys/types.h>
38716
42808526511c Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 38670
diff changeset
9 #endif /* HAVE_SYS_TYPES_H */
9809
93d70308be17 Need to include <sys/types.h> for off_t.
Guido van Rossum <guido@python.org>
parents: 9789
diff changeset
10
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23832
diff changeset
11 #ifdef MS_WINDOWS
5414
013ff6951909 Fix by Mark Hammond to enable truncate() on Windows.
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
12 #define fileno _fileno
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
13 /* can simulate truncate with Win32 API functions; see file_truncate */
5414
013ff6951909 Fix by Mark Hammond to enable truncate() on Windows.
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
14 #define HAVE_FTRUNCATE
24233
11c4253698dc WINDOWS_LEAN_AND_MEAN: There is no such symbol, although a very few
Tim Peters <tim.peters@gmail.com>
parents: 24071
diff changeset
15 #define WIN32_LEAN_AND_MEAN
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
16 #include <windows.h>
5414
013ff6951909 Fix by Mark Hammond to enable truncate() on Windows.
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
17 #endif
013ff6951909 Fix by Mark Hammond to enable truncate() on Windows.
Guido van Rossum <guido@python.org>
parents: 5410
diff changeset
18
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
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
37655
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
51 #ifdef __cplusplus
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
52 extern "C" {
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
53 #endif
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
54
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 FILE *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
56 PyFile_AsFile(PyObject *f)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
58 if (f == NULL || !PyFile_Check(f))
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 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
60 else
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
61 return ((PyFileObject *)f)->f_fp;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
64 PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
65 PyFile_Name(PyObject *f)
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
66 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
67 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
68 return NULL;
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
69 else
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
70 return ((PyFileObject *)f)->f_name;
1354
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
71 }
fccd415e2eb8 * bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
72
22471
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
73 /* 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
74 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
75 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
76
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
77 static PyFileObject*
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
78 dircheck(PyFileObject* f)
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
79 {
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
80 #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
81 struct stat buf;
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
82 if (f->f_fp == NULL)
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
83 return f;
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
84 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
85 S_ISDIR(buf.st_mode)) {
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
86 #ifdef HAVE_STRERROR
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
87 char *msg = strerror(EISDIR);
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
88 #else
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
89 char *msg = "Is a directory";
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
90 #endif
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
91 PyObject *exc = PyObject_CallFunction(PyExc_IOError, "(is)",
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
92 EISDIR, msg);
22471
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
93 PyErr_SetObject(PyExc_IOError, exc);
30169
2d274da09274 Fix SF #789402, Memory leak on open()
Neal Norwitz <nnorwitz@gmail.com>
parents: 29165
diff changeset
94 Py_XDECREF(exc);
22471
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
95 return NULL;
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
96 }
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
97 #endif
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
98 return f;
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
99 }
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
100
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
101
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
102 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
103 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
104 int (*close)(FILE *))
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 {
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
106 assert(f != NULL);
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
107 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
108 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
109
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
110 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
111 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
112 Py_DECREF(f->f_encoding);
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
113
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
114 Py_INCREF (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
115 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
116
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
117 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
118
261
f4a944e9835f In support of popen(), file objects are now parametrized with a close
Guido van Rossum <guido@python.org>
parents: 251
diff changeset
119 f->f_close = close;
177
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
120 f->f_softspace = 0;
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
121 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
122 f->f_buf = NULL;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
123 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
124 f->f_newlinetypes = NEWLINE_UNKNOWN;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
125 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
126 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
127 f->f_encoding = Py_None;
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
128
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
129 if (f->f_name == NULL || f->f_mode == NULL)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 f->f_fp = fp;
22471
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
132 f = dircheck(f);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
133 return (PyObject *) f;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
136 /* 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
137 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
138 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
139 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
140 Additionally, remove the 'U' from the mode string as platforms
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
141 won't know what it is. */
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
142 /* zero return is kewl - one is un-kewl */
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
143 static int
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
144 sanitize_the_mode(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
145 {
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
146 char *upos;
36243
0968f062f350 strlen() returns a size_t, get rid of 64-bit warning
Neal Norwitz <nnorwitz@gmail.com>
parents: 36033
diff changeset
147 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
148
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
149 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
150 PyErr_SetString(PyExc_ValueError, "empty mode string");
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
151 return 1;
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
152 }
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
153
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
154 upos = strchr(mode, 'U');
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
155 if (upos) {
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
156 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
157
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
158 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
159 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
160 "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
161 "starting with 'r'");
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
162 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
163 }
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
164
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
165 if (mode[0] != 'r') {
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
166 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
167 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
168 }
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
169
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
170 if (!strchr(mode, 'b')) {
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
171 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
172 mode[1] = 'b';
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
173 }
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
174 } 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
175 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
176 "one of 'r', 'w', 'a' or 'U', not '%.200s'", mode);
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
177 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
178 }
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
179
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
180 return 0;
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
181 }
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
182
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
183 static PyObject *
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
184 open_the_file(PyFileObject *f, char *name, char *mode)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 {
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
186 char *newmode;
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
187 assert(f != NULL);
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
188 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
189 #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
190 /* 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
191 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
192 #else
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
193 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
194 #endif
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
195 assert(mode != NULL);
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
196 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
197
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
198 /* 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
199 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
200 if (!newmode) {
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
201 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
202 return NULL;
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
203 }
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
204 strcpy(newmode, mode);
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
205
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
206 if (sanitize_the_mode(newmode)) {
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
207 f = NULL;
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
208 goto cleanup;
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
209 }
34962
047434acb5a9 Disallow opening files with modes 'aU' or 'wU' as specified by PEP
Skip Montanaro <skip@pobox.com>
parents: 33927
diff changeset
210
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
211 /* 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
212 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
213 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
214 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
215 PyErr_SetString(PyExc_IOError,
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
216 "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
217 f = NULL;
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
218 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
219 }
20942
d3dd0c2a1771 open_the_file(): Explicitly set errno to 0 before calling fopen().
Tim Peters <tim.peters@gmail.com>
parents: 20935
diff changeset
220 errno = 0;
32322
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
221
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
222 #ifdef MS_WINDOWS
32322
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
223 if (PyUnicode_Check(f->f_name)) {
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
224 PyObject *wmode;
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
225 wmode = PyUnicode_DecodeASCII(newmode, strlen(newmode), NULL);
32322
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
226 if (f->f_name && wmode) {
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
227 Py_BEGIN_ALLOW_THREADS
32322
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
228 /* PyUnicode_AS_UNICODE OK without thread
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
229 lock as it is a simple dereference. */
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
230 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
231 PyUnicode_AS_UNICODE(wmode));
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
232 Py_END_ALLOW_THREADS
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
233 }
32322
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
234 Py_XDECREF(wmode);
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
235 }
32322
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
236 #endif
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
237 if (NULL == f->f_fp && NULL != name) {
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
238 Py_BEGIN_ALLOW_THREADS
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
239 f->f_fp = fopen(name, newmode);
32322
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
240 Py_END_ALLOW_THREADS
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
241 }
50f3a550b4fe dump HAVE_FOPENRF stuff - obsolete
Skip Montanaro <skip@pobox.com>
parents: 32159
diff changeset
242
138
bb24948957e3 Hack to open resource fork on the Mac: open(filename, '*rb').
Guido van Rossum <guido@python.org>
parents: 109
diff changeset
243 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
244 #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
245 /* 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
246 * 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
247 * 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
248 * 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
249 * 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
250 * 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
251 * 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
252 * 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
253 */
8d337b3b655a SF bug 538827: Python open w/ MSVC6: bad error msgs.
Tim Peters <tim.peters@gmail.com>
parents: 22864
diff changeset
254 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
255 errno = EINVAL;
8d337b3b655a SF bug 538827: Python open w/ MSVC6: bad error msgs.
Tim Peters <tim.peters@gmail.com>
parents: 22864
diff changeset
256 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
257 errno = ENOENT;
8d337b3b655a SF bug 538827: Python open w/ MSVC6: bad error msgs.
Tim Peters <tim.peters@gmail.com>
parents: 22864
diff changeset
258 #endif
20924
21fa75790822 Fix SF buf #476953: Bad more for opening file gives bad msg.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20793
diff changeset
259 if (errno == EINVAL)
22873
8d337b3b655a SF bug 538827: Python open w/ MSVC6: bad error msgs.
Tim Peters <tim.peters@gmail.com>
parents: 22864
diff changeset
260 PyErr_Format(PyExc_IOError, "invalid mode: %s",
20924
21fa75790822 Fix SF buf #476953: Bad more for opening file gives bad msg.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20793
diff changeset
261 mode);
21fa75790822 Fix SF buf #476953: Bad more for opening file gives bad msg.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20793
diff changeset
262 else
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
263 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
264 f = NULL;
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
265 }
22873
8d337b3b655a SF bug 538827: Python open w/ MSVC6: bad error msgs.
Tim Peters <tim.peters@gmail.com>
parents: 22864
diff changeset
266 if (f != NULL)
22471
acf5ecd806af Check in (hopefully) corrected version of last change.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22467
diff changeset
267 f = dircheck(f);
38212
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
268
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
269 cleanup:
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
270 PyMem_FREE(newmode);
42d6bab88079 Bug #1462152: file() now checks more thoroughly for invalid mode
Georg Brandl <georg@python.org>
parents: 38084
diff changeset
271
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
272 return (PyObject *)f;
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
273 }
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
274
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
275 PyObject *
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
276 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
277 {
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
278 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
279 NULL, NULL);
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
280 if (f != 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
281 PyObject *o_name = PyString_FromString(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
282 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
283 Py_DECREF(f);
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
284 f = NULL;
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
285 }
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
286 Py_DECREF(o_name);
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
287 }
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
288 return (PyObject *) f;
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
289 }
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
290
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
291 PyObject *
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
292 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
293 {
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
294 extern int fclose(FILE *);
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
295 PyFileObject *f;
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
296
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
297 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
298 if (f != NULL) {
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
299 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
300 Py_DECREF(f);
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
301 f = NULL;
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
302 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
304 return (PyObject *)f;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
306
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
307 void
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
308 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
309 {
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
310 PyFileObject *file = (PyFileObject *)f;
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
311 if (bufsize >= 0) {
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
312 int type;
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
313 switch (bufsize) {
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
314 case 0:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
315 type = _IONBF;
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
316 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
317 #ifdef HAVE_SETVBUF
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
318 case 1:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
319 type = _IOLBF;
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
320 bufsize = BUFSIZ;
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
321 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
322 #endif
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
323 default:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
324 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
325 #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
326 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
327 #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
328 break;
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
329 }
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
330 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
331 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
332 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
333 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
334 } 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
335 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
336 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
337 }
521d026a8048 Patch #788249: Pass an explicit buffer to setvbuf in PyFile_SetBufSize().
Martin v. Löwis <martin@v.loewis.de>
parents: 30169
diff changeset
338 #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
339 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
340 #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
341 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
342 #endif /* !HAVE_SETVBUF */
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
343 }
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
344 }
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
345
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
346 /* Set the encoding used to output Unicode strings.
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
347 Returh 1 on success, 0 on failure. */
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
348
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
349 int
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
350 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
351 {
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
352 PyFileObject *file = (PyFileObject*)f;
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
353 PyObject *str = PyString_FromString(enc);
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
354 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
355 return 0;
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
356 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
357 file->f_encoding = str;
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
358 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
359 }
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
360
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
361 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
362 err_closed(void)
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
363 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
364 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
365 return NULL;
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
366 }
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
367
36485
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
368 /* 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
369 * 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
370 * 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
371 static PyObject *
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
372 err_iterbuffered(void)
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
373 {
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
374 PyErr_SetString(PyExc_ValueError,
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
375 "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
376 return NULL;
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
377 }
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
378
24615
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
379 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
380
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 /* Methods */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
382
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 static void
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
384 file_dealloc(PyFileObject *f)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 {
33927
829ee325a18e If close() fails in file_dealloc, then print an error message to
Peter Astrand <astrand@lysator.liu.se>
parents: 32322
diff changeset
386 int sts = 0;
32159
2c169ca5fa69 Add weakref support to array.array and file objects.
Raymond Hettinger <python@rcn.com>
parents: 31864
diff changeset
387 if (f->weakreflist != NULL)
2c169ca5fa69 Add weakref support to array.array and file objects.
Raymond Hettinger <python@rcn.com>
parents: 31864
diff changeset
388 PyObject_ClearWeakRefs((PyObject *) f);
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
389 if (f->f_fp != NULL && f->f_close != NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
390 Py_BEGIN_ALLOW_THREADS
33927
829ee325a18e If close() fails in file_dealloc, then print an error message to
Peter Astrand <astrand@lysator.liu.se>
parents: 32322
diff changeset
391 sts = (*f->f_close)(f->f_fp);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
392 Py_END_ALLOW_THREADS
33927
829ee325a18e If close() fails in file_dealloc, then print an error message to
Peter Astrand <astrand@lysator.liu.se>
parents: 32322
diff changeset
393 if (sts == EOF)
829ee325a18e If close() fails in file_dealloc, then print an error message to
Peter Astrand <astrand@lysator.liu.se>
parents: 32322
diff changeset
394 #ifdef HAVE_STRERROR
829ee325a18e If close() fails in file_dealloc, then print an error message to
Peter Astrand <astrand@lysator.liu.se>
parents: 32322
diff changeset
395 PySys_WriteStderr("close failed: [Errno %d] %s\n", errno, strerror(errno));
829ee325a18e If close() fails in file_dealloc, then print an error message to
Peter Astrand <astrand@lysator.liu.se>
parents: 32322
diff changeset
396 #else
829ee325a18e If close() fails in file_dealloc, then print an error message to
Peter Astrand <astrand@lysator.liu.se>
parents: 32322
diff changeset
397 PySys_WriteStderr("close failed: [Errno %d]\n", errno);
829ee325a18e If close() fails in file_dealloc, then print an error message to
Peter Astrand <astrand@lysator.liu.se>
parents: 32322
diff changeset
398 #endif
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
399 }
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
400 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
401 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
402 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
403 Py_XDECREF(f->f_encoding);
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
404 drop_readahead(f);
20277
2983b54256c7 Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents: 20045
diff changeset
405 f->ob_type->tp_free((PyObject *)f);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
406 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
407
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
408 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
409 file_repr(PyFileObject *f)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 {
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
411 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
412 #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
413 PyObject *ret = NULL;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
414 PyObject *name;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
415 name = PyUnicode_AsUnicodeEscapeString(f->f_name);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
416 ret = PyString_FromFormat("<%s file u'%s', mode '%s' at %p>",
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
417 f->f_fp == NULL ? "closed" : "open",
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
418 PyString_AsString(name),
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
419 PyString_AsString(f->f_mode),
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
420 f);
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
421 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
422 return ret;
26330
3086e111783a Fix --disable-unicode compilation problems.
Martin v. Löwis <martin@v.loewis.de>
parents: 25535
diff changeset
423 #endif
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
424 } else {
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
425 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
426 f->f_fp == NULL ? "closed" : "open",
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
427 PyString_AsString(f->f_name),
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
428 PyString_AsString(f->f_mode),
0e70df98424e repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents: 19301
diff changeset
429 f);
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
430 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
432
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
433 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
434 file_close(PyFileObject *f)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 {
261
f4a944e9835f In support of popen(), file objects are now parametrized with a close
Guido van Rossum <guido@python.org>
parents: 251
diff changeset
436 int sts = 0;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 if (f->f_fp != NULL) {
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
438 if (f->f_close != NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
439 Py_BEGIN_ALLOW_THREADS
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
440 errno = 0;
261
f4a944e9835f In support of popen(), file objects are now parametrized with a close
Guido van Rossum <guido@python.org>
parents: 251
diff changeset
441 sts = (*f->f_close)(f->f_fp);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
442 Py_END_ALLOW_THREADS
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
443 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 f->f_fp = NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
445 }
30366
05e8b503cd41 Only release buffer after file has been closed. Fixes #800824.
Martin v. Löwis <martin@v.loewis.de>
parents: 30364
diff changeset
446 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
447 f->f_setbuf = NULL;
689
90ea50786095 Change error handling. Call clearerr() more often.
Guido van Rossum <guido@python.org>
parents: 645
diff changeset
448 if (sts == EOF)
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
449 return PyErr_SetFromErrno(PyExc_IOError);
261
f4a944e9835f In support of popen(), file objects are now parametrized with a close
Guido van Rossum <guido@python.org>
parents: 251
diff changeset
450 if (sts != 0)
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
451 return PyInt_FromLong((long)sts);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
452 Py_INCREF(Py_None);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
453 return Py_None;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
454 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
455
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
456
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
457 /* 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
458 #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
459 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
460 #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
461 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
462 #elif SIZEOF_FPOS_T >= 8
16903
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
463 typedef fpos_t Py_off_t;
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
464 #else
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
465 #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
466 #endif
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
467
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
468
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
469 /* 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
470 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
471 static int
16903
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
472 _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
473 {
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
474 #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
475 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
476 #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
477 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
478 #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
479 return fseek64(fp, offset, whence);
15068
a53f16b20f1d Donn Cave <donn@oz.net>:
Fred Drake <fdrake@acm.org>
parents: 14869
diff changeset
480 #elif defined(__BEOS__)
a53f16b20f1d Donn Cave <donn@oz.net>:
Fred Drake <fdrake@acm.org>
parents: 14869
diff changeset
481 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
482 #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
483 /* 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
484 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
485 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
486 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
487 case SEEK_END:
19836
5420e7d348a4 _portable_fseek():
Guido van Rossum <guido@python.org>
parents: 19754
diff changeset
488 #ifdef MS_WINDOWS
5420e7d348a4 _portable_fseek():
Guido van Rossum <guido@python.org>
parents: 19754
diff changeset
489 fflush(fp);
5420e7d348a4 _portable_fseek():
Guido van Rossum <guido@python.org>
parents: 19754
diff changeset
490 if (_lseeki64(fileno(fp), 0, 2) == -1)
5420e7d348a4 _portable_fseek():
Guido van Rossum <guido@python.org>
parents: 19754
diff changeset
491 return -1;
5420e7d348a4 _portable_fseek():
Guido van Rossum <guido@python.org>
parents: 19754
diff changeset
492 #else
15925
9d5beed0b93f Rationalizing the fallback code for portable fseek -- this is all much
Guido van Rossum <guido@python.org>
parents: 15876
diff changeset
493 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
494 return -1;
19836
5420e7d348a4 _portable_fseek():
Guido van Rossum <guido@python.org>
parents: 19754
diff changeset
495 #endif
15925
9d5beed0b93f Rationalizing the fallback code for portable fseek -- this is all much
Guido van Rossum <guido@python.org>
parents: 15876
diff changeset
496 /* fall through */
9d5beed0b93f Rationalizing the fallback code for portable fseek -- this is all much
Guido van Rossum <guido@python.org>
parents: 15876
diff changeset
497 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
498 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
499 return -1;
9d5beed0b93f Rationalizing the fallback code for portable fseek -- this is all much
Guido van Rossum <guido@python.org>
parents: 15876
diff changeset
500 offset += pos;
9d5beed0b93f Rationalizing the fallback code for portable fseek -- this is all much
Guido van Rossum <guido@python.org>
parents: 15876
diff changeset
501 break;
9d5beed0b93f Rationalizing the fallback code for portable fseek -- this is all much
Guido van Rossum <guido@python.org>
parents: 15876
diff changeset
502 /* 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
503 }
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
504 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
505 #else
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
506 #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
507 #endif
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
508 }
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
509
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
510
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
511 /* 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
512 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
513 position on success */
17518
f939ce52a734 Make some private symbols static.
Guido van Rossum <guido@python.org>
parents: 16903
diff changeset
514 static Py_off_t
14277
984abd20eec2 Peter Schneider-Kamp <nowonder@nowonder.de>:
Fred Drake <fdrake@acm.org>
parents: 14215
diff changeset
515 _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
516 {
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
517 #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
518 return ftell(fp);
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
519 #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
520 return ftello(fp);
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
521 #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
522 return ftell64(fp);
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
523 #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
524 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
525 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
526 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
527 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
528 #else
19732
b7dc5159448f Changes to automatically enable large file support on some systems.
Guido van Rossum <guido@python.org>
parents: 19476
diff changeset
529 #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
530 #endif
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
531 }
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
532
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
533
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
534 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
535 file_seek(PyFileObject *f, PyObject *args)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
536 {
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
537 int whence;
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
538 int ret;
16903
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
539 Py_off_t offset;
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
540 PyObject *offobj;
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
541
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
542 if (f->f_fp == NULL)
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
543 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
544 drop_readahead(f);
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
545 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
546 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
547 return NULL;
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
548 #if !defined(HAVE_LARGEFILE_SUPPORT)
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
549 offset = PyInt_AsLong(offobj);
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
550 #else
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
551 offset = PyLong_Check(offobj) ?
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
552 PyLong_AsLongLong(offobj) : PyInt_AsLong(offobj);
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
553 #endif
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
554 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
555 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
556
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
557 Py_BEGIN_ALLOW_THREADS
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
558 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
559 ret = _portable_fseek(f->f_fp, offset, whence);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
560 Py_END_ALLOW_THREADS
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
561
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
562 if (ret != 0) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
563 PyErr_SetFromErrno(PyExc_IOError);
689
90ea50786095 Change error handling. Call clearerr() more often.
Guido van Rossum <guido@python.org>
parents: 645
diff changeset
564 clearerr(f->f_fp);
90ea50786095 Change error handling. Call clearerr() more often.
Guido van Rossum <guido@python.org>
parents: 645
diff changeset
565 return NULL;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
566 }
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
567 f->f_skipnextlf = 0;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
568 Py_INCREF(Py_None);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
569 return Py_None;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
570 }
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
571
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
572
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
573 #ifdef HAVE_FTRUNCATE
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
574 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
575 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
576 {
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
577 Py_off_t newsize;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
578 PyObject *newsizeobj = NULL;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
579 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
580 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
581
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
582 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
583 return err_closed();
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26688
diff changeset
584 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
585 return NULL;
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
586
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
587 /* 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
588 * 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
589 * 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
590 * 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
591 * 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
592 * 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
593 */
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
594 Py_BEGIN_ALLOW_THREADS
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
595 errno = 0;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
596 initialpos = _portable_ftell(f->f_fp);
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
597 Py_END_ALLOW_THREADS
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
598 if (initialpos == -1)
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
599 goto onioerror;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
600
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
601 /* 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
602 * specified value.
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
603 */
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
604 if (newsizeobj != NULL) {
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
605 #if !defined(HAVE_LARGEFILE_SUPPORT)
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
606 newsize = PyInt_AsLong(newsizeobj);
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
607 #else
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
608 newsize = PyLong_Check(newsizeobj) ?
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
609 PyLong_AsLongLong(newsizeobj) :
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
610 PyInt_AsLong(newsizeobj);
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
611 #endif
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
612 if (PyErr_Occurred())
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
613 return NULL;
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
614 }
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
615 else /* default to current position */
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
616 newsize = initialpos;
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
617
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
618 /* 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
619 * 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
620 * of the current file state.
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
621 */
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
622 Py_BEGIN_ALLOW_THREADS
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
623 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
624 ret = fflush(f->f_fp);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
625 Py_END_ALLOW_THREADS
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
626 if (ret != 0)
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
627 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
628
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23832
diff changeset
629 #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
630 /* 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
631 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
632 {
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
633 HANDLE hFile;
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
634
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
635 /* Have to move current pos to desired endpoint on Windows. */
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
636 Py_BEGIN_ALLOW_THREADS
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
637 errno = 0;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
638 ret = _portable_fseek(f->f_fp, newsize, SEEK_SET) != 0;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
639 Py_END_ALLOW_THREADS
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
640 if (ret)
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
641 goto onioerror;
22214
e24ba04d01b0 file_truncate(): provide full "large file" support on Windows, by
Tim Peters <tim.peters@gmail.com>
parents: 22053
diff changeset
642
22241
7584b6f1afde Change Windows file.truncate() to (a) restore the original file position,
Tim Peters <tim.peters@gmail.com>
parents: 22214
diff changeset
643 /* Truncate. Note that this may grow the file! */
7584b6f1afde Change Windows file.truncate() to (a) restore the original file position,
Tim Peters <tim.peters@gmail.com>
parents: 22214
diff changeset
644 Py_BEGIN_ALLOW_THREADS
7584b6f1afde Change Windows file.truncate() to (a) restore the original file position,
Tim Peters <tim.peters@gmail.com>
parents: 22214
diff changeset
645 errno = 0;
7584b6f1afde Change Windows file.truncate() to (a) restore the original file position,
Tim Peters <tim.peters@gmail.com>
parents: 22214
diff changeset
646 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
647 ret = hFile == (HANDLE)-1;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
648 if (ret == 0) {
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
649 ret = SetEndOfFile(hFile) == 0;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
650 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
651 errno = EACCES;
7584b6f1afde Change Windows file.truncate() to (a) restore the original file position,
Tim Peters <tim.peters@gmail.com>
parents: 22214
diff changeset
652 }
7584b6f1afde Change Windows file.truncate() to (a) restore the original file position,
Tim Peters <tim.peters@gmail.com>
parents: 22214
diff changeset
653 Py_END_ALLOW_THREADS
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
654 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
655 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
656 }
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
657 #else
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
658 Py_BEGIN_ALLOW_THREADS
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
659 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
660 ret = ftruncate(fileno(f->f_fp), newsize);
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
661 Py_END_ALLOW_THREADS
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
662 if (ret != 0)
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
663 goto onioerror;
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23832
diff changeset
664 #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
665
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
666 /* Restore original file position. */
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
667 Py_BEGIN_ALLOW_THREADS
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
668 errno = 0;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
669 ret = _portable_fseek(f->f_fp, initialpos, SEEK_SET) != 0;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
670 Py_END_ALLOW_THREADS
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
671 if (ret)
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
672 goto onioerror;
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
673
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
674 Py_INCREF(Py_None);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
675 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
676
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
677 onioerror:
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
678 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
679 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
680 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
681 }
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
682 #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
683
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
684 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
685 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
686 {
16903
e86875f069b1 Two improvements to large file support:
Guido van Rossum <guido@python.org>
parents: 15978
diff changeset
687 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
688
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
689 if (f->f_fp == NULL)
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
690 return err_closed();
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
691 Py_BEGIN_ALLOW_THREADS
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
692 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
693 pos = _portable_ftell(f->f_fp);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
694 Py_END_ALLOW_THREADS
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
695 if (pos == -1) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
696 PyErr_SetFromErrno(PyExc_IOError);
689
90ea50786095 Change error handling. Call clearerr() more often.
Guido van Rossum <guido@python.org>
parents: 645
diff changeset
697 clearerr(f->f_fp);
90ea50786095 Change error handling. Call clearerr() more often.
Guido van Rossum <guido@python.org>
parents: 645
diff changeset
698 return NULL;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
699 }
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
700 if (f->f_skipnextlf) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
701 int c;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
702 c = GETC(f->f_fp);
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
703 if (c == '\n') {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
704 pos++;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
705 f->f_skipnextlf = 0;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
706 } 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
707 }
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
708 #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
709 return PyInt_FromLong(pos);
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
710 #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
711 return PyLong_FromLongLong(pos);
9789
08dfbee0a32a Changes for long file support by Steve Clift.
Guido van Rossum <guido@python.org>
parents: 9762
diff changeset
712 #endif
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
713 }
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
714
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
715 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
716 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
717 {
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
718 if (f->f_fp == NULL)
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
719 return err_closed();
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
720 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
721 }
a4793ae26682 Changes for new UNIX-specific built-in module 'select' and new header for
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
722
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
723 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
724 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
725 {
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
726 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
727
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
728 if (f->f_fp == NULL)
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
729 return err_closed();
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
730 Py_BEGIN_ALLOW_THREADS
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
731 errno = 0;
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
732 res = fflush(f->f_fp);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
733 Py_END_ALLOW_THREADS
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
734 if (res != 0) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
735 PyErr_SetFromErrno(PyExc_IOError);
689
90ea50786095 Change error handling. Call clearerr() more often.
Guido van Rossum <guido@python.org>
parents: 645
diff changeset
736 clearerr(f->f_fp);
90ea50786095 Change error handling. Call clearerr() more often.
Guido van Rossum <guido@python.org>
parents: 645
diff changeset
737 return NULL;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
738 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
739 Py_INCREF(Py_None);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
740 return Py_None;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
741 }
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
742
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
743 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
744 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
745 {
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
746 long res;
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
747 if (f->f_fp == NULL)
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
748 return err_closed();
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
749 Py_BEGIN_ALLOW_THREADS
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 923
diff changeset
750 res = isatty((int)fileno(f->f_fp));
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
751 Py_END_ALLOW_THREADS
22864
6804e48a0033 isatty() should return a bool.
Guido van Rossum <guido@python.org>
parents: 22785
diff changeset
752 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
753 }
f4a944e9835f In support of popen(), file objects are now parametrized with a close
Guido van Rossum <guido@python.org>
parents: 251
diff changeset
754
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
755
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
756 #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
757 #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
758 #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
759 #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
760 #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
761
9883
7195ec296b3d Jim Ahlstrom patch: BIGCHUNK is too large for 16-bit int.
Guido van Rossum <guido@python.org>
parents: 9809
diff changeset
762 #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
763 #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
764 #else
7195ec296b3d Jim Ahlstrom patch: BIGCHUNK is too large for 16-bit int.
Guido van Rossum <guido@python.org>
parents: 9809
diff changeset
765 #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
766 #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
767
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
768 static size_t
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
769 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
770 {
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
771 #ifdef HAVE_FSTAT
18755
f8bd14aef4d6 Kill more warnings from the SGI compiler.
Fred Drake <fdrake@acm.org>
parents: 17911
diff changeset
772 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
773 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
774 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
775 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
776 /* 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
777 *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
778 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
779 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
780 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
781 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
782 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
783 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
784 (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
785 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
786 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
787 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
788 }
8160
ce9fc64528a7 Clear the error condition set by ftell().
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
789 if (pos < 0)
ce9fc64528a7 Clear the error condition set by ftell().
Guido van Rossum <guido@python.org>
parents: 7981
diff changeset
790 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
791 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
792 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
793 /* 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
794 }
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
795 #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
796 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
797 /* 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
798 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
799 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
800 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
801 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
802 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
803 }
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
804 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
805 }
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
806
26672
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
807 #if defined(EWOULDBLOCK) && defined(EAGAIN) && EWOULDBLOCK != EAGAIN
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
808 #define BLOCKED_ERRNO(x) ((x) == EWOULDBLOCK || (x) == EAGAIN)
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
809 #else
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
810 #ifdef EWOULDBLOCK
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
811 #define BLOCKED_ERRNO(x) ((x) == EWOULDBLOCK)
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
812 #else
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
813 #ifdef EAGAIN
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
814 #define BLOCKED_ERRNO(x) ((x) == EAGAIN)
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
815 #else
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
816 #define BLOCKED_ERRNO(x) 0
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
817 #endif
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
818 #endif
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
819 #endif
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
820
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
821 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
822 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
823 {
5479
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
824 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
825 size_t bytesread, buffersize, chunksize;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
826 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
827
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
828 if (f->f_fp == NULL)
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
829 return err_closed();
36485
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
830 /* refuse to mix with f.next() */
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
831 if (f->f_buf != NULL &&
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
832 (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
833 f->f_buf[0] != '\0')
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
834 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
835 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
836 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
837 if (bytesrequested < 0)
10562
a42824cf0b18 casts for picky compilers.
Guido van Rossum <guido@python.org>
parents: 9883
diff changeset
838 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
839 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
840 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
841 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
842 PyErr_SetString(PyExc_OverflowError,
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
843 "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
844 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
845 }
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
846 v = PyString_FromStringAndSize((char *)NULL, buffersize);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 38
diff changeset
847 if (v == NULL)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
848 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
849 bytesread = 0;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
850 for (;;) {
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
851 Py_BEGIN_ALLOW_THREADS
266c9aa8c127 Rewrite readlines() to speed it up -- about a factor of 2 on my
Guido van Rossum <guido@python.org>
parents: 5477
diff changeset
852 errno = 0;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
853 chunksize = Py_UniversalNewlineFread(BUF(v) + bytesread,
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
854 buffersize - bytesread, f->f_fp, (PyObject *)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
855 Py_END_ALLOW_THREADS
266c9aa8c127 Rewrite readlines() to speed it up -- about a factor of 2 on my
Guido van Rossum <guido@python.org>
parents: 5477
diff changeset
856 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
857 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
858 break;
26672
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
859 clearerr(f->f_fp);
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
860 /* When in non-blocking mode, data shouldn't
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
861 * be discarded if a blocking signal was
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
862 * received. That will also happen if
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
863 * chunksize != 0, but bytesread < buffersize. */
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
864 if (bytesread > 0 && BLOCKED_ERRNO(errno))
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
865 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
866 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
867 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
868 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
869 }
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
870 bytesread += chunksize;
26672
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
871 if (bytesread < buffersize) {
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
872 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
873 break;
26672
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
874 }
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
875 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
876 buffersize = new_buffersize(f, buffersize);
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
877 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
878 return NULL;
26672
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
879 } else {
26688
c74b69ab4742 * Objects/fileobject.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26672
diff changeset
880 /* Got what was requested. */
26672
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
881 break;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
882 }
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
883 }
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
884 if (bytesread != buffersize)
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
885 _PyString_Resize(&v, bytesread);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
886 return v;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
887 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
888
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
889 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
890 file_readinto(PyFileObject *f, PyObject *args)
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
891 {
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
892 char *ptr;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
893 Py_ssize_t ntodo;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
894 Py_ssize_t ndone, nnow;
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
895
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
896 if (f->f_fp == NULL)
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
897 return err_closed();
36485
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
898 /* refuse to mix with f.next() */
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
899 if (f->f_buf != NULL &&
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
900 (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
901 f->f_buf[0] != '\0')
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
902 return err_iterbuffered();
22718
c3d637308954 Convert file.readinto() to stop using METH_OLDARGS & PyArg_Parse.
Neal Norwitz <nnorwitz@gmail.com>
parents: 22480
diff changeset
903 if (!PyArg_ParseTuple(args, "w#", &ptr, &ntodo))
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
904 return NULL;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
905 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
906 while (ntodo > 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
907 Py_BEGIN_ALLOW_THREADS
266c9aa8c127 Rewrite readlines() to speed it up -- about a factor of 2 on my
Guido van Rossum <guido@python.org>
parents: 5477
diff changeset
908 errno = 0;
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
909 nnow = Py_UniversalNewlineFread(ptr+ndone, ntodo, f->f_fp,
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
910 (PyObject *)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
911 Py_END_ALLOW_THREADS
266c9aa8c127 Rewrite readlines() to speed it up -- about a factor of 2 on my
Guido van Rossum <guido@python.org>
parents: 5477
diff changeset
912 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
913 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
914 break;
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
915 PyErr_SetFromErrno(PyExc_IOError);
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
916 clearerr(f->f_fp);
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
917 return NULL;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
918 }
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
919 ndone += nnow;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
920 ntodo -= nnow;
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
921 }
13924
ddf302d69211 Add largefile support for Linux64 and WIn64. Add test_largefile and some minor
Trent Mick <trentm@activestate.com>
parents: 13591
diff changeset
922 return PyInt_FromLong((long)ndone);
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
923 }
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
924
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
925 /**************************************************************************
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
926 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
927
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
928 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
929
15758
a1d88ab023a0 A few reformats; no logic changes.
Tim Peters <tim.peters@gmail.com>
parents: 15757
diff changeset
930 + 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
931 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
932 + 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
933 code.
a1d88ab023a0 A few reformats; no logic changes.
Tim Peters <tim.peters@gmail.com>
parents: 15757
diff changeset
934 + 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
935 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
936 + 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
937
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
938 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
939
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
940 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
941
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
942 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
943 have):
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
944 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
945 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
946 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
947
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
948 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
949 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
950 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
951 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
952 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
953 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
954 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
955 **************************************************************************/
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
956
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
957 /* 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
958 * 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
959 * 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
960 * 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
961 * 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
962 * 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
963 * 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
964 * 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
965 */
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
966 #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
967 #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
968 #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
969
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
970 #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
971 #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
972 #endif
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
973
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
974 #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
975 static PyObject*
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
976 getline_via_fgets(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
977 {
15755
a43a8a1f46ee Fiddled ms_getline_hack after talking w/ Guido: made clearer that the
Tim Peters <tim.peters@gmail.com>
parents: 15754
diff changeset
978 /* 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
979 * 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
980 * 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
981 * 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
982 * 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
983 * 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
984 * 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
985 * 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
986 * 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
987 * 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
988 * 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
989 * 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
990 */
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
991 #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
992 #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
993 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
994 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
995 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
996 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
997 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
998 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
999 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
1000 size_t increment; /* amount to increment the 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
1001
15755
a43a8a1f46ee Fiddled ms_getline_hack after talking w/ Guido: made clearer that the
Tim Peters <tim.peters@gmail.com>
parents: 15754
diff changeset
1002 /* 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
1003 * 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
1004 */
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1005 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
1006 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
1007 for (;;) {
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1008 Py_BEGIN_ALLOW_THREADS
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1009 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
1010 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
1011 memset(pvfree, '\n', nfree);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
1012 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
1013 p = fgets(pvfree, (int)nfree, fp);
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1014 Py_END_ALLOW_THREADS
15755
a43a8a1f46ee Fiddled ms_getline_hack after talking w/ Guido: made clearer that the
Tim Peters <tim.peters@gmail.com>
parents: 15754
diff changeset
1015
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1016 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
1017 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
1018 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
1019 return NULL;
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1020 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
1021 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
1022 }
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1023 /* 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
1024 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
1025 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
1026 /* 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
1027 * 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
1028 * \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
1029 * 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
1030 * 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
1031 * \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
1032 */
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1033 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
1034 /* 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
1035 * 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
1036 * 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
1037 */
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1038 ++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
1039 }
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1040 else {
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1041 /* 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
1042 * 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
1043 * 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
1044 * 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
1045 */
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1046 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
1047 --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
1048 }
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1049 v = PyString_FromStringAndSize(buf, p - buf);
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1050 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
1051 }
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1052 /* 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
1053 * 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
1054 * 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
1055 * 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
1056 */
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1057 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
1058 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
1059 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
1060 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
1061 }
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1062 else
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1063 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
1064 }
15876
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1065
a33de23b3066 Speed getline_via_fgets(), by supplying two "fast paths", although one is
Tim Peters <tim.peters@gmail.com>
parents: 15875
diff changeset
1066 /* 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
1067 * 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
1068 */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22471
diff changeset
1069 total_v_size = MAXBUFSIZE << 1;
15758
a1d88ab023a0 A few reformats; no logic changes.
Tim Peters <tim.peters@gmail.com>
parents: 15757
diff changeset
1070 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
1071 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
1072 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
1073 /* 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
1074 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
1075 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
1076
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1077 /* 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
1078 * 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
1079 * 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
1080 * 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
1081 */
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1082 for (;;) {
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1083 Py_BEGIN_ALLOW_THREADS
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1084 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
1085 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
1086 memset(pvfree, '\n', nfree);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
1087 assert(nfree < INT_MAX);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
1088 p = fgets(pvfree, (int)nfree, 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
1089 Py_END_ALLOW_THREADS
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1090
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1091 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
1092 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
1093 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
1094 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
1095 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
1096 }
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1097 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
1098 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
1099 }
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1100 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
1101 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
1102 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
1103 /* \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
1104 ++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
1105 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
1106 }
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1107 /* \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
1108 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
1109 --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
1110 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
1111 }
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1112 /* 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
1113 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
1114 increment = total_v_size >> 2; /* mild exponential growth */
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22471
diff changeset
1115 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
1116 if (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
1117 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
1118 "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
1119 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
1120 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
1121 }
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1122 if (_PyString_Resize(&v, (int)total_v_size) < 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
1123 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
1124 /* overwrite the trailing null byte */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22471
diff changeset
1125 pvfree = BUF(v) + (total_v_size - increment - 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
1126 }
7c8fac4ac31a MS Win32 .readline() speedup, as discussed on Python-Dev. This is a tricky
Tim Peters <tim.peters@gmail.com>
parents: 15753
diff changeset
1127 if (BUF(v) + total_v_size != 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
1128 _PyString_Resize(&v, p - BUF(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
1129 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
1130 #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
1131 #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
1132 }
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1133 #endif /* ifdef USE_FGETS_IN_GETLINE */
5410
3b2fda31bf1b Checkin of Jack's buffer mods.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1134
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1135 /* 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
1136 Size argument interpretation:
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1137 > 0: max length;
15757
a9e15bcab32c Let's hope that three time's a charm...
Guido van Rossum <guido@python.org>
parents: 15755
diff changeset
1138 <= 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
1139 */
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1140
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1141 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1142 get_line(PyFileObject *f, int n)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1143 {
15745
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1144 FILE *fp = f->f_fp;
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1145 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
1146 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
1147 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
1148 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
1149 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
1150 PyObject *v;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1151 int newlinetypes = f->f_newlinetypes;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1152 int skipnextlf = f->f_skipnextlf;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1153 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
1154
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1155 #if defined(USE_FGETS_IN_GETLINE)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1156 if (n <= 0 && !univ_newline )
15875
195557a0f050 Use the "MS" getline hack (fgets()) by default on non-get_unlocked
Tim Peters <tim.peters@gmail.com>
parents: 15780
diff changeset
1157 return getline_via_fgets(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
1158 #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
1159 total_v_size = n > 0 ? n : 100;
15702e1b961e Grow the string buffer at a mildly exponential rate for the getc version
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22479
diff changeset
1160 v = PyString_FromStringAndSize((char *)NULL, total_v_size);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 38
diff changeset
1161 if (v == NULL)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1162 return NULL;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1163 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
1164 end = buf + total_v_size;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents: 916
diff changeset
1165
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1166 for (;;) {
15745
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1167 Py_BEGIN_ALLOW_THREADS
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1168 FLOCKFILE(fp);
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1169 if (univ_newline) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1170 c = 'x'; /* Shut up gcc warning */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1171 while ( buf != end && (c = GETC(fp)) != EOF ) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1172 if (skipnextlf ) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1173 skipnextlf = 0;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1174 if (c == '\n') {
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
1175 /* Seeing a \n here with
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
1176 * skipnextlf true means we
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1177 * saw a \r before.
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1178 */
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1179 newlinetypes |= NEWLINE_CRLF;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1180 c = GETC(fp);
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1181 if (c == EOF) break;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1182 } else {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1183 newlinetypes |= NEWLINE_CR;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1184 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1185 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1186 if (c == '\r') {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1187 skipnextlf = 1;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1188 c = '\n';
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1189 } else if ( c == '\n')
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1190 newlinetypes |= NEWLINE_LF;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1191 *buf++ = c;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1192 if (c == '\n') break;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1193 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1194 if ( c == EOF && skipnextlf )
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1195 newlinetypes |= NEWLINE_CR;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1196 } 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
1197 while ((c = GETC(fp)) != EOF &&
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1198 (*buf++ = c) != '\n' &&
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1199 buf != end)
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1200 ;
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1201 FUNLOCKFILE(fp);
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1202 Py_END_ALLOW_THREADS
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1203 f->f_newlinetypes = newlinetypes;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1204 f->f_skipnextlf = skipnextlf;
15745
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1205 if (c == '\n')
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1206 break;
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1207 if (c == EOF) {
19105
eea8dfbbee86 Apply anonymous SF patch #441229.
Guido van Rossum <guido@python.org>
parents: 19015
diff changeset
1208 if (ferror(fp)) {
eea8dfbbee86 Apply anonymous SF patch #441229.
Guido van Rossum <guido@python.org>
parents: 19015
diff changeset
1209 PyErr_SetFromErrno(PyExc_IOError);
eea8dfbbee86 Apply anonymous SF patch #441229.
Guido van Rossum <guido@python.org>
parents: 19015
diff changeset
1210 clearerr(fp);
eea8dfbbee86 Apply anonymous SF patch #441229.
Guido van Rossum <guido@python.org>
parents: 19015
diff changeset
1211 Py_DECREF(v);
eea8dfbbee86 Apply anonymous SF patch #441229.
Guido van Rossum <guido@python.org>
parents: 19015
diff changeset
1212 return NULL;
eea8dfbbee86 Apply anonymous SF patch #441229.
Guido van Rossum <guido@python.org>
parents: 19015
diff changeset
1213 }
251
48d58b74a3a4 Call clearerr() after EOF seen.
Guido van Rossum <guido@python.org>
parents: 183
diff changeset
1214 clearerr(fp);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1215 if (PyErr_CheckSignals()) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1216 Py_DECREF(v);
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1217 return NULL;
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1218 }
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1219 break;
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1220 }
15745
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1221 /* Must be because buf == end */
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1222 if (n > 0)
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1223 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
1224 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
1225 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
1226 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
1227 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
1228 PyErr_SetString(PyExc_OverflowError,
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1229 "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
1230 Py_DECREF(v);
15745
f5c04134f4e2 Restructured get_line() for clarity and speed.
Guido van Rossum <guido@python.org>
parents: 15633
diff changeset
1231 return NULL;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1232 }
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
1233 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
1234 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
1235 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
1236 end = BUF(v) + total_v_size;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1237 }
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents: 916
diff changeset
1238
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
1239 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
1240 if (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
1241 _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
1242 return v;
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1243 }
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1244
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1245 /* External C interface */
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1246
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1247 PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1248 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
1249 {
15753
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1250 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
1251
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
1252 if (f == NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1253 PyErr_BadInternalCall();
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1254 return NULL;
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1255 }
15753
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1256
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1257 if (PyFile_Check(f)) {
36485
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1258 PyFileObject *fo = (PyFileObject *)f;
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1259 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
1260 return err_closed();
36485
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1261 /* refuse to mix with f.next() */
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1262 if (fo->f_buf != NULL &&
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1263 (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
1264 fo->f_buf[0] != '\0')
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1265 return err_iterbuffered();
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1266 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
1267 }
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1268 else {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1269 PyObject *reader;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1270 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
1271
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1272 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
1273 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
1274 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
1275 if (n <= 0)
30683
3b59fa5d25b1 Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents: 30366
diff changeset
1276 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
1277 else
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1278 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
1279 if (args == NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1280 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
1281 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
1282 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1283 result = PyEval_CallObject(reader, args);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1284 Py_DECREF(reader);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1285 Py_DECREF(args);
27060
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1286 if (result != NULL && !PyString_Check(result) &&
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1287 !PyUnicode_Check(result)) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1288 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
1289 result = NULL;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1290 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
1291 "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
1292 }
15753
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1293 }
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1294
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1295 if (n < 0 && result != NULL && PyString_Check(result)) {
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1296 char *s = PyString_AS_STRING(result);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
1297 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
1298 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
1299 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
1300 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
1301 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
1302 "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
1303 }
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1304 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
1305 if (result->ob_refcnt == 1)
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1306 _PyString_Resize(&result, len-1);
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1307 else {
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1308 PyObject *v;
8d00f7555eec Tim noticed that I had botched get_line_raw(). Looking again, I
Guido van Rossum <guido@python.org>
parents: 15745
diff changeset
1309 v = PyString_FromStringAndSize(s, len-1);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1310 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
1311 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
1312 }
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
1313 }
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
1314 }
27060
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1315 #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
1316 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
1317 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
1318 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
1319 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
1320 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
1321 result = NULL;
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1322 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
1323 "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
1324 }
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1325 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
1326 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
1327 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
1328 else {
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1329 PyObject *v;
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1330 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
1331 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
1332 result = v;
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1333 }
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1334 }
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1335 }
cf90309efeee Allow PyFile_GetLine() to return Unicode objects. Fixes #660165.
Martin v. Löwis <martin@v.loewis.de>
parents: 26818
diff changeset
1336 #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
1337 return result;
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1338 }
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1339
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1340 /* Python method */
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1341
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1342 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1343 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
1344 {
5479
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1345 int n = -1;
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1346
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
1347 if (f->f_fp == NULL)
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
1348 return err_closed();
36485
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1349 /* refuse to mix with f.next() */
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1350 if (f->f_buf != NULL &&
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1351 (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
1352 f->f_buf[0] != '\0')
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1353 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
1354 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
1355 return NULL;
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1356 if (n == 0)
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1357 return PyString_FromString("");
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1358 if (n < 0)
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1359 n = 0;
13360
484bfde70dcc Fix to bug #389:
Marc-André Lemburg <mal@egenix.com>
parents: 13256
diff changeset
1360 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
1361 }
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1362
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1363 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1364 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
1365 {
5479
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1366 long sizehint = 0;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1367 PyObject *list;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1368 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
1369 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
1370 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
1371 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
1372 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
1373 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
1374 size_t nread;
5479
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1375 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
1376 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
1377 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
1378 int shortread = 0;
183
c9168afe23dd Added external interface to readline, for raw_input().
Guido van Rossum <guido@python.org>
parents: 177
diff changeset
1379
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
1380 if (f->f_fp == NULL)
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
1381 return err_closed();
36485
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1382 /* refuse to mix with f.next() */
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1383 if (f->f_buf != NULL &&
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1384 (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
1385 f->f_buf[0] != '\0')
99dfdcc6d613 SF patch #1397960: When mixing file-iteration and
Thomas Wouters <thomas@python.org>
parents: 36243
diff changeset
1386 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
1387 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
1388 return NULL;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1389 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
1390 return NULL;
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1391 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
1392 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
1393 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
1394 else {
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
1395 Py_BEGIN_ALLOW_THREADS
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
1396 errno = 0;
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
1397 nread = Py_UniversalNewlineFread(buffer+nfilled,
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1398 buffersize-nfilled, f->f_fp, (PyObject *)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
1399 Py_END_ALLOW_THREADS
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
1400 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
1401 }
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
1402 if (nread == 0) {
5479
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1403 sizehint = 0;
7398
7afc15f08d82 Check ferror(), not errno, for fread() error.
Guido van Rossum <guido@python.org>
parents: 6568
diff changeset
1404 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
1405 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
1406 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
1407 clearerr(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
1408 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
1409 Py_DECREF(list);
266c9aa8c127 Rewrite readlines() to speed it up -- about a factor of 2 on my
Guido van Rossum <guido@python.org>
parents: 5477
diff changeset
1410 list = 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
1411 goto cleanup;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1412 }
5479
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1413 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
1414 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
1415 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
1416 /* 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
1417 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
1418 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
1419 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
1420 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
1421 "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
1422 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
1423 }
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
1424 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
1425 /* Create the big 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
1426 big_buffer = PyString_FromStringAndSize(
266c9aa8c127 Rewrite readlines() to speed it up -- about a factor of 2 on my
Guido van Rossum <guido@python.org>
parents: 5477
diff changeset
1427 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
1428 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
1429 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
1430 buffer = PyString_AS_STRING(big_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
1431 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
1432 }
266c9aa8c127 Rewrite readlines() to speed it up -- about a factor of 2 on my
Guido van Rossum <guido@python.org>
parents: 5477
diff changeset
1433 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
1434 /* Grow the big buffer */
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1435 if ( _PyString_Resize(&big_buffer, buffersize) < 0 )
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1436 goto error;
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
1437 buffer = PyString_AS_STRING(big_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
1438 }
266c9aa8c127 Rewrite readlines() to speed it up -- about a factor of 2 on my
Guido van Rossum <guido@python.org>
parents: 5477
diff changeset
1439 continue;
154
f2efceaf73cc Fixed read() and readline() to do arbitrarily long reads.
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
1440 }
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
1441 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
1442 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
1443 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
1444 /* 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
1445 p++;
266c9aa8c127 Rewrite readlines() to speed it up -- about a factor of 2 on my
Guido van Rossum <guido@python.org>
parents: 5477
diff changeset
1446 line = PyString_FromStringAndSize(q, p-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
1447 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
1448 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
1449 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
1450 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
1451 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
1452 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
1453 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
1454 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
1455 } 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
1456 /* 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
1457 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
1458 memmove(buffer, q, nfilled);
5479
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1459 if (sizehint > 0)
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1460 if (totalread >= (size_t)sizehint)
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1461 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
1462 }
266c9aa8c127 Rewrite readlines() to speed it up -- about a factor of 2 on my
Guido van Rossum <guido@python.org>
parents: 5477
diff changeset
1463 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
1464 /* Partial last 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
1465 line = PyString_FromStringAndSize(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
1466 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
1467 goto error;
5479
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1468 if (sizehint > 0) {
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1469 /* Need to complete the last line */
13360
484bfde70dcc Fix to bug #389:
Marc-André Lemburg <mal@egenix.com>
parents: 13256
diff changeset
1470 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
1471 if (rest == NULL) {
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1472 Py_DECREF(line);
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1473 goto error;
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1474 }
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1475 PyString_Concat(&line, rest);
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1476 Py_DECREF(rest);
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1477 if (line == NULL)
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1478 goto error;
6d53ebaec021 Add optional 'sizehint' argument to readlines(). After approximately
Guido van Rossum <guido@python.org>
parents: 5478
diff changeset
1479 }
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
1480 err = PyList_Append(list, line);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1481 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
1482 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
1483 goto error;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1484 }
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
1485 cleanup:
23295
6fa76b4e59fe Repair widespread misuse of _PyString_Resize. Since it's clear people
Tim Peters <tim.peters@gmail.com>
parents: 23206
diff changeset
1486 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
1487 return list;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1488 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1489
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1490 static PyObject *
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1491 file_write(PyFileObject *f, PyObject *args)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1492 {
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
1493 char *s;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
1494 Py_ssize_t n, n2;
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
1495 if (f->f_fp == NULL)
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
1496 return err_closed();
20793
79fcbc31a03e fix for
Michael W. Hudson <mwh@python.net>
parents: 20635
diff changeset
1497 if (!PyArg_ParseTuple(args, f->f_binary ? "s#" : "t#", &s, &n))
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1498 return NULL;
177
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
1499 f->f_softspace = 0;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1500 Py_BEGIN_ALLOW_THREADS
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1501 errno = 0;
908
424f55e67d5d Makefile: added instann rules and $(*DEST*) defines.
Guido van Rossum <guido@python.org>
parents: 902
diff changeset
1502 n2 = fwrite(s, 1, n, f->f_fp);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1503 Py_END_ALLOW_THREADS
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1504 if (n2 != n) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1505 PyErr_SetFromErrno(PyExc_IOError);
689
90ea50786095 Change error handling. Call clearerr() more often.
Guido van Rossum <guido@python.org>
parents: 645
diff changeset
1506 clearerr(f->f_fp);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1507 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1508 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1509 Py_INCREF(Py_None);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1510 return Py_None;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1511 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1512
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1513 static PyObject *
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1514 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
1515 {
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1516 #define CHUNKSIZE 1000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1517 PyObject *list, *line;
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1518 PyObject *it; /* iter(seq) */
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1519 PyObject *result;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
1520 int index, islist;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
1521 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
1522
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1523 assert(seq != NULL);
1362
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1524 if (f->f_fp == NULL)
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1525 return err_closed();
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1526
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1527 result = NULL;
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1528 list = NULL;
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1529 islist = PyList_Check(seq);
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1530 if (islist)
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1531 it = NULL;
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1532 else {
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1533 it = PyObject_GetIter(seq);
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1534 if (it == NULL) {
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1535 PyErr_SetString(PyExc_TypeError,
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1536 "writelines() requires an iterable argument");
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1537 return NULL;
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1538 }
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1539 /* 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
1540 list = PyList_New(CHUNKSIZE);
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1541 if (list == NULL)
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1542 goto error;
1362
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1543 }
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1544
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1545 /* 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
1546 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
1547 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
1548 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
1549 if (islist) {
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1550 Py_XDECREF(list);
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1551 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
1552 if (list == NULL)
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1553 goto error;
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1554 j = PyList_GET_SIZE(list);
1362
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1555 }
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1556 else {
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1557 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
1558 line = PyIter_Next(it);
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1559 if (line == NULL) {
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1560 if (PyErr_Occurred())
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1561 goto error;
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1562 break;
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1563 }
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1564 PyList_SetItem(list, j, line);
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1565 }
1362
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1566 }
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1567 if (j == 0)
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1568 break;
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1569
14213
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1570 /* 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
1571 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
1572 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
1573 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
1574 could potentially execute Python code. */
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1575 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
1576 PyObject *v = PyList_GET_ITEM(list, i);
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1577 if (!PyString_Check(v)) {
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1578 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
1579 if (((f->f_binary &&
14213
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1580 PyObject_AsReadBuffer(v,
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1581 (const void**)&buffer,
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1582 &len)) ||
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1583 PyObject_AsCharBuffer(v,
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1584 &buffer,
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1585 &len))) {
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1586 PyErr_SetString(PyExc_TypeError,
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1587 "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
1588 goto error;
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1589 }
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1590 line = PyString_FromStringAndSize(buffer,
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1591 len);
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1592 if (line == NULL)
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1593 goto error;
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1594 Py_DECREF(v);
14215
0797fdb25a77 Fixed a serious typo.
Marc-André Lemburg <mal@egenix.com>
parents: 14213
diff changeset
1595 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
1596 }
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1597 }
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1598
63ea2a2df06f Fix to bug [ Bug #111860 ] file.writelines() crashes.
Marc-André Lemburg <mal@egenix.com>
parents: 14125
diff changeset
1599 /* 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
1600 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
1601 Py_BEGIN_ALLOW_THREADS
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1602 f->f_softspace = 0;
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1603 errno = 0;
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1604 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
1605 line = PyList_GET_ITEM(list, i);
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1606 len = PyString_GET_SIZE(line);
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1607 nwritten = fwrite(PyString_AS_STRING(line),
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1608 1, len, f->f_fp);
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1609 if (nwritten != len) {
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1610 Py_BLOCK_THREADS
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1611 PyErr_SetFromErrno(PyExc_IOError);
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1612 clearerr(f->f_fp);
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1613 goto error;
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1614 }
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1615 }
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1616 Py_END_ALLOW_THREADS
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1617
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1618 if (j < CHUNKSIZE)
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1619 break;
1362
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1620 }
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1621
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1622 Py_INCREF(Py_None);
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1623 result = Py_None;
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1624 error:
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1625 Py_XDECREF(list);
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1626 Py_XDECREF(it);
12000
8651f2da7c4c Checking in the new, improve file.writelines() code.
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1627 return result;
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1628 #undef CHUNKSIZE
1362
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1629 }
560407ec632b * filemodule.c: added writelines() -- analogous to readlines()
Guido van Rossum <guido@python.org>
parents: 1354
diff changeset
1630
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1631 static PyObject *
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36675
diff changeset
1632 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
1633 {
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1634 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
1635 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
1636 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
1637 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
1638 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1639
38670
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1640 static PyObject *
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1641 file_exit(PyFileObject *f, PyObject *args)
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1642 {
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1643 PyObject *ret = file_close(f);
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1644 if (!ret)
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1645 /* 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
1646 return NULL;
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1647 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
1648 /* 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
1649 * 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
1650 * 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
1651 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
1652 }
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1653
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1654 PyDoc_STRVAR(readline_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1655 "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
1656 "\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1657 "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
1658 "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
1659 "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
1660
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1661 PyDoc_STRVAR(read_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1662 "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
1663 "\n"
26672
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1664 "If the size argument is negative or omitted, read until EOF is reached.\n"
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1665 "Notice that when in non-blocking mode, less data than what was requested\n"
8dd25a6f5913 Fixed bug
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26596
diff changeset
1666 "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
1667
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1668 PyDoc_STRVAR(write_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1669 "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
1670 "\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1671 "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
1672 "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
1673
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1674 PyDoc_STRVAR(fileno_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1675 "fileno() -> integer \"file descriptor\".\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1676 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1677 "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
1678
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1679 PyDoc_STRVAR(seek_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1680 "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
1681 "\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1682 "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
1683 "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
1684 "(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
1685 "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
1686 "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
1687 "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
1688 "undefined behavior."
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1689 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1690 "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
1691
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
1692 #ifdef HAVE_FTRUNCATE
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1693 PyDoc_STRVAR(truncate_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1694 "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
1695 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1696 "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
1697 #endif
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1698
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1699 PyDoc_STRVAR(tell_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1700 "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
1701
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1702 PyDoc_STRVAR(readinto_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1703 "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
1704
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1705 PyDoc_STRVAR(readlines_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1706 "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
1707 "\n"
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1708 "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
1709 "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
1710 "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
1711
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1712 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
1713 "xreadlines() -> returns self.\n"
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1714 "\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
1715 "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
1716 "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
1717
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1718 PyDoc_STRVAR(writelines_doc,
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1719 "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
1720 "\n"
20045
7b8c11739714 Generalize file.writelines() to allow iterable objects.
Tim Peters <tim.peters@gmail.com>
parents: 20015
diff changeset
1721 "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
1722 "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
1723
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1724 PyDoc_STRVAR(flush_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1725 "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
1726
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1727 PyDoc_STRVAR(close_doc,
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1728 "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
1729 "\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
1730 "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
1731 "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
1732 "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
1733 "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
1734
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1735 PyDoc_STRVAR(isatty_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
1736 "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
1737
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36675
diff changeset
1738 PyDoc_STRVAR(enter_doc,
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36675
diff changeset
1739 "__enter__() -> self.");
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36675
diff changeset
1740
38670
24930e3b6061 Bug #1502805: don't alias file.__exit__ to file.close since the
Georg Brandl <georg@python.org>
parents: 38212
diff changeset
1741 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
1742 "__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
1743
19996
646e24728852 SF bug [#463093] File methods need doc strings.
Tim Peters <tim.peters@gmail.com>
parents: 19985
diff changeset
1744 static PyMethodDef file_methods[] = {
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1745 {"readline", (PyCFunction)file_readline, METH_VARARGS, readline_doc},
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1746 {"read", (PyCFunction)file_read, METH_VARARGS, read_doc},
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1747 {"write", (PyCFunction)file_write, METH_VARARGS, write_doc},
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1748 {"fileno", (PyCFunction)file_fileno, METH_NOARGS, fileno_doc},
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1749 {"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
1750 #ifdef HAVE_FTRUNCATE
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1751 {"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
1752 #endif
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1753 {"tell", (PyCFunction)file_tell, METH_NOARGS, tell_doc},
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1754 {"readinto", (PyCFunction)file_readinto, METH_VARARGS, readinto_doc},
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1755 {"readlines", (PyCFunction)file_readlines,METH_VARARGS, readlines_doc},
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36675
diff changeset
1756 {"xreadlines",(PyCFunction)file_self, METH_NOARGS, xreadlines_doc},
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1757 {"writelines",(PyCFunction)file_writelines, METH_O, writelines_doc},
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1758 {"flush", (PyCFunction)file_flush, METH_NOARGS, flush_doc},
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1759 {"close", (PyCFunction)file_close, METH_NOARGS, close_doc},
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1760 {"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
1761 {"__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
1762 {"__exit__", (PyCFunction)file_exit, METH_VARARGS, exit_doc},
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1763 {NULL, NULL} /* sentinel */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1764 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1765
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1766 #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
1767
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19996
diff changeset
1768 static PyMemberDef file_memberlist[] = {
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19996
diff changeset
1769 {"softspace", T_INT, OFF(f_softspace), 0,
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19996
diff changeset
1770 "flag indicating that a space needs to be printed; used by print"},
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19996
diff changeset
1771 {"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
1772 "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
1773 {"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
1774 "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
1775 {"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
1776 "file encoding"},
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
1777 /* 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
1778 {NULL} /* Sentinel */
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
1779 };
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
1780
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
1781 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1782 get_closed(PyFileObject *f, void *closure)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1783 {
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
1784 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
1785 }
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1786 static PyObject *
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1787 get_newlines(PyFileObject *f, void *closure)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1788 {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1789 switch (f->f_newlinetypes) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1790 case NEWLINE_UNKNOWN:
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1791 Py_INCREF(Py_None);
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1792 return Py_None;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1793 case NEWLINE_CR:
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1794 return PyString_FromString("\r");
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1795 case NEWLINE_LF:
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1796 return PyString_FromString("\n");
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1797 case NEWLINE_CR|NEWLINE_LF:
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1798 return Py_BuildValue("(ss)", "\r", "\n");
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1799 case NEWLINE_CRLF:
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1800 return PyString_FromString("\r\n");
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1801 case NEWLINE_CR|NEWLINE_CRLF:
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1802 return Py_BuildValue("(ss)", "\r", "\r\n");
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1803 case NEWLINE_LF|NEWLINE_CRLF:
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1804 return Py_BuildValue("(ss)", "\n", "\r\n");
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1805 case NEWLINE_CR|NEWLINE_LF|NEWLINE_CRLF:
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1806 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
1807 default:
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
1808 PyErr_Format(PyExc_SystemError,
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
1809 "Unknown newlines value 0x%x\n",
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1810 f->f_newlinetypes);
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1811 return NULL;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1812 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
1813 }
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1400
diff changeset
1814
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
1815 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
1816 {"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
1817 {"newlines", (getter)get_newlines, NULL,
24836
c004b2bcd542 Reflow long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24615
diff changeset
1818 "end-of-line convention used in this file"},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1819 {0},
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1820 };
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1821
24615
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
1822 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
1823 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
1824 {
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1825 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
1826 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
1827 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
1828 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1829 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1830
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
1831 /* 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
1832 (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
1833 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
1834 static int
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
1835 readahead(PyFileObject *f, int bufsize)
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
1836 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
1837 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
1838
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1839 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
1840 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
1841 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
1842 else
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1843 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
1844 }
37589
aeee85b6a5dd More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37354
diff changeset
1845 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
1846 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
1847 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
1848 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1849 Py_BEGIN_ALLOW_THREADS
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1850 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
1851 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
1852 f->f_buf, bufsize, f->f_fp, (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
1853 Py_END_ALLOW_THREADS
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1854 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
1855 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
1856 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
1857 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
1858 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
1859 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
1860 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1861 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1862 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
1863 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
1864 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
1865 }
79f0cd3a71a1 Oops, forgot to merge this from the iter-branch to the trunk.
Guido van Rossum <guido@python.org>
parents: 17518
diff changeset
1866
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1867 /* 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
1868 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
1869 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
1870 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
1871
24615
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
1872 static PyStringObject *
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
1873 readahead_get_line_skip(PyFileObject *f, int skip, int bufsize)
8a1c086ad213 Make readahead functions static
Neal Norwitz <nnorwitz@gmail.com>
parents: 24594
diff changeset
1874 {
24594
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1875 PyStringObject* s;
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1876 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
1877 char *buf;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
1878 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
1879
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1880 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
1881 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
1882 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
1883
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1884 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
1885 if (len == 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
1886 return (PyStringObject *)
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1887 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
1888 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
1889 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
1890 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
1891 len = 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
1892 s = (PyStringObject *)
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1893 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
1894 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
1895 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
1896 memcpy(PyString_AS_STRING(s)+skip, f->f_bufptr, len);
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1897 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
1898 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
1899 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
1900 } else {
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1901 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
1902 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
1903 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
1904 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
1905 s = readahead_get_line_skip(
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
1906 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
1907 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
1908 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
1909 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
1910 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1911 memcpy(PyString_AS_STRING(s)+skip, bufptr, len);
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1912 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
1913 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1914 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
1915 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1916
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1917 /* 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
1918 #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
1919
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1920 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
1921 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
1922 {
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1923 PyStringObject* l;
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1924
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1925 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
1926 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
1927
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1928 l = readahead_get_line_skip(f, 0, READAHEAD_BUFSIZE);
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1929 if (l == NULL || PyString_GET_SIZE(l) == 0) {
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1930 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
1931 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
1932 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1933 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
1934 }
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1935
f928f7eea2d6 SF patch 580331 by Oren Tirosh: make file objects their own iterator.
Guido van Rossum <guido@python.org>
parents: 24233
diff changeset
1936
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
1937 static PyObject *
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
1938 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
1939 {
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1940 PyObject *self;
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1941 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
1942
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1943 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
1944
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1945 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
1946 not_yet_string = PyString_FromString("<uninitialized file>");
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1947 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
1948 return NULL;
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1949 }
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1950
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1951 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
1952 if (self != NULL) {
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1953 /* 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
1954 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
1955 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
1956 ((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
1957 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
1958 ((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
1959 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
1960 ((PyFileObject *)self)->f_encoding = Py_None;
32159
2c169ca5fa69 Add weakref support to array.array and file objects.
Raymond Hettinger <python@rcn.com>
parents: 31864
diff changeset
1961 ((PyFileObject *)self)->weakreflist = NULL;
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1962 }
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1963 return self;
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1964 }
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1965
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1966 static int
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1967 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
1968 {
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1969 PyFileObject *foself = (PyFileObject *)self;
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1970 int ret = 0;
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
1971 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
1972 char *name = NULL;
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
1973 char *mode = "r";
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
1974 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
1975 int wideargument = 0;
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1976
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1977 assert(PyFile_Check(self));
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1978 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
1979 /* 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
1980 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
1981 if (closeresult == NULL)
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1982 return -1;
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1983 Py_DECREF(closeresult);
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
1984 }
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
1985
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
1986 #ifdef Py_WIN_WIDE_FILENAMES
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
1987 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
1988 PyObject *po;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
1989 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
1990 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
1991 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
1992 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
1993 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
1994 goto Error;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
1995 } else {
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
1996 /* 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
1997 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
1998 PyErr_Clear();
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
1999 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2000 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2001 #endif
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2002
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2003 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
2004 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
2005
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2006 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
2007 Py_FileSystemDefaultEncoding,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2008 &name,
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2009 &mode, &bufsize))
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2010 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
2011
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
2012 /* 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
2013 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
2014 kwlist, &o_name, &mode,
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34962
diff changeset
2015 &bufsize))
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
2016 return -1;
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
2017
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
2018 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
2019 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
2020 goto Error;
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24836
diff changeset
2021 }
19905
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2022 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
2023 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
2024 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
2025 PyFile_SetBufSize(self, bufsize);
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2026 goto Done;
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2027
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2028 Error:
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2029 ret = -1;
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2030 /* fall through */
a7ba00e3b0de The end of [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19903
diff changeset
2031 Done:
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2032 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
2033 return ret;
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2034 }
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2035
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2036 PyDoc_VAR(file_doc) =
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2037 PyDoc_STR(
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2038 "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
2039 "\n"
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2040 "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
2041 "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
2042 "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
2043 "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
2044 "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
2045 "If the buffering argument is given, 0 means unbuffered, 1 means line\n"
19903
c082971823ce Get rid of builtin_open() entirely (the C code and docstring, not the
Tim Peters <tim.peters@gmail.com>
parents: 19901
diff changeset
2046 "buffered, and larger numbers specify the buffer size.\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2047 )
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23514
diff changeset
2048 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
2049 "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
2050 "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
2051 "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
2052 "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
2053 "'\\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
2054 "\n"
9eea5edd857f file_doc: Add some description of the U mode character, but only when
Barry Warsaw <barry@python.org>
parents: 23295
diff changeset
2055 "'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
2056 );
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2057
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2058 PyTypeObject PyFile_Type = {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2059 PyObject_HEAD_INIT(&PyType_Type)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2060 0,
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2061 "file",
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2062 sizeof(PyFileObject),
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2063 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
2064 (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
2065 0, /* tp_print */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2066 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2067 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
2068 0, /* tp_compare */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2069 (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
2070 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
2071 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
2072 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
2073 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
2074 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
2075 0, /* tp_str */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2076 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
2077 /* 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
2078 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
2079 0, /* tp_as_buffer */
32159
2c169ca5fa69 Add weakref support to array.array and file objects.
Raymond Hettinger <python@rcn.com>
parents: 31864
diff changeset
2080 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
2081 file_doc, /* tp_doc */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2082 0, /* tp_traverse */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2083 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
2084 0, /* tp_richcompare */
32159
2c169ca5fa69 Add weakref support to array.array and file objects.
Raymond Hettinger <python@rcn.com>
parents: 31864
diff changeset
2085 offsetof(PyFileObject, weakreflist), /* tp_weaklistoffset */
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 36675
diff changeset
2086 (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
2087 (iternextfunc)file_iternext, /* tp_iternext */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2088 file_methods, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2089 file_memberlist, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2090 file_getsetlist, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2091 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
2092 0, /* tp_dict */
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2093 0, /* tp_descr_get */
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2094 0, /* tp_descr_set */
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2095 0, /* tp_dictoffset */
37304
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36926
diff changeset
2096 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
2097 PyType_GenericAlloc, /* tp_alloc */
19894
51cc82605d32 SF bug [#460467] file objects should be subclassable.
Tim Peters <tim.peters@gmail.com>
parents: 19836
diff changeset
2098 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
2099 PyObject_Del, /* tp_free */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2100 };
177
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
2101
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
2102 /* 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
2103
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
2104 int
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2105 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
2106 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
2107 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
2108 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
2109 /* 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
2110 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2111 else if (PyFile_Check(f)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2112 oldflag = ((PyFileObject *)f)->f_softspace;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2113 ((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
2114 }
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
2115 else {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2116 PyObject *v;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2117 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
2118 if (v == NULL)
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2119 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
2120 else {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2121 if (PyInt_Check(v))
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2122 oldflag = PyInt_AsLong(v);
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
2123 assert(oldflag < INT_MAX);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2124 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
2125 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2126 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
2127 if (v == NULL)
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2128 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
2129 else {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2130 if (PyObject_SetAttrString(f, "softspace", v) != 0)
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2131 PyErr_Clear();
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2132 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
2133 }
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
2134 }
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36485
diff changeset
2135 return (int)oldflag;
177
bd49ca6c4add Added 'softspace' interface to replace 'needspace' printing hack.
Guido van Rossum <guido@python.org>
parents: 154
diff changeset
2136 }
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
2137
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
2138 /* 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
2139
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
2140 int
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2141 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
2142 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2143 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
2144 if (f == NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2145 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
2146 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
2147 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2148 else if (PyFile_Check(f)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2149 FILE *fp = PyFile_AsFile(f);
31691
5e8c6f38e15b PyFile_WriteObject(): some of the local variables are only used when
Fred Drake <fdrake@acm.org>
parents: 31471
diff changeset
2150 #ifdef Py_USING_UNICODE
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2151 PyObject *enc = ((PyFileObject*)f)->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
2152 int result;
31691
5e8c6f38e15b PyFile_WriteObject(): some of the local variables are only used when
Fred Drake <fdrake@acm.org>
parents: 31471
diff changeset
2153 #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
2154 if (fp == 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
2155 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
2156 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
2157 }
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2158 #ifdef Py_USING_UNICODE
30364
80a4b8f6ae0e SF bug 801631: file.truncate fault on windows.
Tim Peters <tim.peters@gmail.com>
parents: 30320
diff changeset
2159 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
2160 PyUnicode_Check(v) && enc != Py_None) {
29065
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2161 char *cenc = PyString_AS_STRING(enc);
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2162 value = PyUnicode_AsEncodedString(v, cenc, "strict");
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2163 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
2164 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
2165 } else {
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2166 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
2167 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
2168 }
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2169 result = PyObject_Print(value, fp, flags);
bf1634b023d5 Patch #612627: Add encoding attribute to file objects, and determine
Martin v. Löwis <martin@v.loewis.de>
parents: 28967
diff changeset
2170 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
2171 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
2172 #else
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2173 return PyObject_Print(v, fp, 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
2174 #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
2175 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2176 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
2177 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
2178 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
2179 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
2180 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
2181 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
2182 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
2183 } else
712afdae1123 Patch #462849: Pass Unicode objects to file's .write method.
Martin v. Löwis <martin@v.loewis.de>
parents: 19905
diff changeset
2184 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
2185 }
712afdae1123 Patch #462849: Pass Unicode objects to file's .write method.
Martin v. Löwis <martin@v.loewis.de>
parents: 19905
diff changeset
2186 else
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2187 value = PyObject_Repr(v);
1400
aac8231a715c * mpzmodule.c: removed redundant mpz_print function.
Guido van Rossum <guido@python.org>
parents: 1389
diff changeset
2188 if (value == NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2189 Py_DECREF(writer);
1400
aac8231a715c * mpzmodule.c: removed redundant mpz_print function.
Guido van Rossum <guido@python.org>
parents: 1389
diff changeset
2190 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
2191 }
30683
3b59fa5d25b1 Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents: 30366
diff changeset
2192 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
2193 if (args == NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2194 Py_DECREF(value);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2195 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
2196 return -1;
bebb0ea7de20 fix read(0), readline(0); make tuple for call_object args
Guido van Rossum <guido@python.org>
parents: 2667
diff changeset
2197 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2198 result = PyEval_CallObject(writer, args);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2199 Py_DECREF(args);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2200 Py_DECREF(value);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2201 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
2202 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
2203 return -1;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2204 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
2205 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
2206 }
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
2207
5605
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2208 int
21095
b1280cba79b5 PyFile_WriteString(): change prototype so that the string arg is
Tim Peters <tim.peters@gmail.com>
parents: 20942
diff changeset
2209 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
2210 {
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
2211 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
2212 /* Should be caused by a pre-existing error */
13454
fcc75a3748f5 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2213 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
2214 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
2215 "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
2216 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
2217 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2218 else if (PyFile_Check(f)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2219 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
2220 if (fp == NULL) {
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2221 err_closed();
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2222 return -1;
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2223 }
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2224 fputs(s, fp);
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2225 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
2226 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2227 else if (!PyErr_Occurred()) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4585
diff changeset
2228 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
2229 int err;
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2230 if (v == NULL)
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2231 return -1;
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2232 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
2233 Py_DECREF(v);
89af5bf8f873 PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents: 5582
diff changeset
2234 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
2235 }
5783
9cfbc9bb6423 Reordered list of methods to hopefully put the most frequently used
Guido van Rossum <guido@python.org>
parents: 5605
diff changeset
2236 else
9cfbc9bb6423 Reordered list of methods to hopefully put the most frequently used
Guido van Rossum <guido@python.org>
parents: 5605
diff changeset
2237 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
2238 }
13591
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2239
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2240 /* 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
2241 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
2242 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
2243 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
2244 -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
2245 */
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2246
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2247 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
2248 {
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2249 int fd;
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2250 PyObject *meth;
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2251
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2252 if (PyInt_Check(o)) {
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2253 fd = PyInt_AsLong(o);
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2254 }
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2255 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
2256 fd = PyLong_AsLong(o);
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2257 }
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2258 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
2259 {
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2260 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
2261 Py_DECREF(meth);
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2262 if (fno == NULL)
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2263 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
2264
13591
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2265 if (PyInt_Check(fno)) {
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2266 fd = PyInt_AsLong(fno);
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2267 Py_DECREF(fno);
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2268 }
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2269 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
2270 fd = PyLong_AsLong(fno);
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2271 Py_DECREF(fno);
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2272 }
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2273 else {
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2274 PyErr_SetString(PyExc_TypeError,
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2275 "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
2276 Py_DECREF(fno);
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2277 return -1;
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2278 }
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2279 }
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2280 else {
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2281 PyErr_SetString(PyExc_TypeError,
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2282 "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
2283 return -1;
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2284 }
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2285
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2286 if (fd < 0) {
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2287 PyErr_Format(PyExc_ValueError,
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2288 "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
2289 fd);
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2290 return -1;
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2291 }
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2292 return fd;
2077bf141b37 Added PyObject_AsFileDescriptor, which checks for integer, long integer,
Andrew M. Kuchling <amk@amk.ca>
parents: 13454
diff changeset
2293 }
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2294
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2295 /* 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
2296 #undef fgets
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2297 #undef fread
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2298
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2299 /*
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2300 ** 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
2301 ** 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
2302 ** 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
2303 ** 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
2304 ** 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
2305 ** 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
2306 ** 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
2307 ** \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
2308 ** 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
2309 ** the different types of newlines seen.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2310 ** 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
2311 ** identically.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2312 */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2313 char *
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2314 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
2315 {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2316 char *p = buf;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2317 int c;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2318 int newlinetypes = 0;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2319 int skipnextlf = 0;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2320 int univ_newline = 1;
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2321
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2322 if (fobj) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2323 if (!PyFile_Check(fobj)) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2324 errno = ENXIO; /* What can you do... */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2325 return NULL;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2326 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2327 univ_newline = ((PyFileObject *)fobj)->f_univ_newline;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2328 if ( !univ_newline )
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2329 return fgets(buf, n, stream);
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2330 newlinetypes = ((PyFileObject *)fobj)->f_newlinetypes;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2331 skipnextlf = ((PyFileObject *)fobj)->f_skipnextlf;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2332 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2333 FLOCKFILE(stream);
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2334 c = 'x'; /* Shut up gcc warning */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2335 while (--n > 0 && (c = GETC(stream)) != EOF ) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2336 if (skipnextlf ) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2337 skipnextlf = 0;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2338 if (c == '\n') {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2339 /* Seeing a \n here with skipnextlf true
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2340 ** means we saw a \r before.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2341 */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2342 newlinetypes |= NEWLINE_CRLF;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2343 c = GETC(stream);
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2344 if (c == EOF) break;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2345 } else {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2346 /*
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2347 ** 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
2348 ** 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
2349 ** is a CR.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2350 */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2351 newlinetypes |= NEWLINE_CR;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2352 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2353 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2354 if (c == '\r') {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2355 /* 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
2356 ** 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
2357 ** 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
2358 */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2359 skipnextlf = 1;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2360 c = '\n';
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2361 } else if ( c == '\n') {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2362 newlinetypes |= NEWLINE_LF;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2363 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2364 *p++ = c;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2365 if (c == '\n') break;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2366 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2367 if ( c == EOF && skipnextlf )
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2368 newlinetypes |= NEWLINE_CR;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2369 FUNLOCKFILE(stream);
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2370 *p = '\0';
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2371 if (fobj) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2372 ((PyFileObject *)fobj)->f_newlinetypes = newlinetypes;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2373 ((PyFileObject *)fobj)->f_skipnextlf = skipnextlf;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2374 } else if ( skipnextlf ) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2375 /* 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
2376 ** skipnextlf flag. We have to readahead, which
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2377 ** 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
2378 ** interactive stream, but that is very unlikely
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2379 ** unless we're doing something silly like
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2380 ** execfile("/dev/tty").
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2381 */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2382 c = GETC(stream);
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2383 if ( c != '\n' )
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2384 ungetc(c, stream);
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2385 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2386 if (p == buf)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2387 return NULL;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2388 return buf;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2389 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2390
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2391 /*
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2392 ** 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
2393 ** 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
2394 ** 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
2395 ** 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
2396 ** 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
2397 ** \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
2398 ** 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
2399 ** the different types of newlines seen.
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2400 */
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2401 size_t
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2402 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
2403 FILE *stream, PyObject *fobj)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2404 {
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2405 char *dst = buf;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2406 PyFileObject *f = (PyFileObject *)fobj;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2407 int newlinetypes, skipnextlf;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2408
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2409 assert(buf != NULL);
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2410 assert(stream != NULL);
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2411
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2412 if (!fobj || !PyFile_Check(fobj)) {
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2413 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
2414 return 0;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2415 }
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2416 if (!f->f_univ_newline)
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2417 return fread(buf, 1, n, stream);
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2418 newlinetypes = f->f_newlinetypes;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2419 skipnextlf = f->f_skipnextlf;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2420 /* 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
2421 * in the buffer.
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2422 */
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2423 while (n) {
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2424 size_t nread;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2425 int shortread;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2426 char *src = dst;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2427
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2428 nread = fread(dst, 1, n, stream);
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2429 assert(nread <= n);
27768
2d55be3a8ec3 SF patch #683187, fix universal newline problems on error
Neal Norwitz <nnorwitz@gmail.com>
parents: 27060
diff changeset
2430 if (nread == 0)
2d55be3a8ec3 SF patch #683187, fix universal newline problems on error
Neal Norwitz <nnorwitz@gmail.com>
parents: 27060
diff changeset
2431 break;
2d55be3a8ec3 SF patch #683187, fix universal newline problems on error
Neal Norwitz <nnorwitz@gmail.com>
parents: 27060
diff changeset
2432
23206
fd609d2c1669 Py_UniversalNewlineFread(): small speed boost on non-Windows boxes.
Tim Peters <tim.peters@gmail.com>
parents: 23201
diff changeset
2433 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
2434 shortread = n != 0; /* true iff EOF or error */
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2435 while (nread--) {
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2436 char c = *src++;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2437 if (c == '\r') {
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2438 /* 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
2439 *dst++ = '\n';
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2440 skipnextlf = 1;
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2441 }
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2442 else if (skipnextlf && c == '\n') {
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2443 /* 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
2444 skipnextlf = 0;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2445 newlinetypes |= NEWLINE_CRLF;
23206
fd609d2c1669 Py_UniversalNewlineFread(): small speed boost on non-Windows boxes.
Tim Peters <tim.peters@gmail.com>
parents: 23201
diff changeset
2446 ++n;
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2447 }
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2448 else {
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2449 /* Normal char to be stored in buffer. Also
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2450 * update the newlinetypes flag if either this
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2451 * 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
2452 */
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2453 if (c == '\n')
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2454 newlinetypes |= NEWLINE_LF;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2455 else if (skipnextlf)
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2456 newlinetypes |= NEWLINE_CR;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2457 *dst++ = c;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2458 skipnextlf = 0;
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2459 }
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2460 }
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2461 if (shortread) {
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2462 /* If this is EOF, update type flags. */
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2463 if (skipnextlf && feof(stream))
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2464 newlinetypes |= NEWLINE_CR;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2465 break;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2466 }
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2467 }
23201
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2468 f->f_newlinetypes = newlinetypes;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2469 f->f_skipnextlf = skipnextlf;
c408e8b2675a Py_UniversalNewlineFread(): Many changes.
Tim Peters <tim.peters@gmail.com>
parents: 23029
diff changeset
2470 return dst - buf;
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22974
diff changeset
2471 }
37655
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
2472
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
2473 #ifdef __cplusplus
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
2474 }
2f3f2e32dfd9 spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37589
diff changeset
2475 #endif