annotate Objects/fileobject.c @ 37850:ebe59cd18273

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