annotate Modules/bz2module.c @ 54294:dba767bc3155 legacy-trunk

remove mention of old ctypes version
author Benjamin Peterson <benjamin@python.org>
date Sat, 23 May 2009 20:59:09 +0000
parents 5d5d9074f4ca
children 3a992292ccd8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1 /*
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
3 python-bz2 - python bz2 library interface
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
4
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
5 Copyright (c) 2002 Gustavo Niemeyer <niemeyer@conectiva.com>
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
6 Copyright (c) 2002 Python Software Foundation; All Rights Reserved
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
7
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
8 */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
9
26365
d1d8959b138a Include Python.h first.
Martin v. Löwis <martin@v.loewis.de>
parents: 26123
diff changeset
10 #include "Python.h"
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
11 #include <stdio.h>
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
12 #include <bzlib.h>
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
13 #include "structmember.h"
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
14
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
15 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
16 #include "pythread.h"
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
17 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
18
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
19 static char __author__[] =
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
20 "The bz2 python module was written by:\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
21 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
22 Gustavo Niemeyer <niemeyer@conectiva.com>\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
23 ";
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
24
35374
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
25 /* Our very own off_t-like type, 64-bit if possible */
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
26 /* copied from Objects/fileobject.c */
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
27 #if !defined(HAVE_LARGEFILE_SUPPORT)
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
28 typedef off_t Py_off_t;
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
29 #elif SIZEOF_OFF_T >= 8
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
30 typedef off_t Py_off_t;
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
31 #elif SIZEOF_FPOS_T >= 8
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
32 typedef fpos_t Py_off_t;
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
33 #else
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
34 #error "Large file support, but neither off_t nor fpos_t is large enough."
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
35 #endif
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
36
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
37 #define BUF(v) PyString_AS_STRING((PyStringObject *)v)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
38
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
39 #define MODE_CLOSED 0
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
40 #define MODE_READ 1
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
41 #define MODE_READ_EOF 2
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
42 #define MODE_WRITE 3
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
43
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43379
diff changeset
44 #define BZ2FileObject_Check(v) (Py_TYPE(v) == &BZ2File_Type)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
45
28861
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
46
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
47 #ifdef BZ_CONFIG_ERROR
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
48
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
49 #if SIZEOF_LONG >= 8
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
50 #define BZS_TOTAL_OUT(bzs) \
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
51 (((long)bzs->total_out_hi32 << 32) + bzs->total_out_lo32)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
52 #elif SIZEOF_LONG_LONG >= 8
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
53 #define BZS_TOTAL_OUT(bzs) \
28437
871da703e4c0 Rename LONG_LONG to PY_LONG_LONG. Fixes #710285.
Martin v. Löwis <martin@v.loewis.de>
parents: 27819
diff changeset
54 (((PY_LONG_LONG)bzs->total_out_hi32 << 32) + bzs->total_out_lo32)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
55 #else
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
56 #define BZS_TOTAL_OUT(bzs) \
36315
2ae416aacb88 SF Bug #1407069, Remove extra semi-colon if there is no long long
Neal Norwitz <nnorwitz@gmail.com>
parents: 35999
diff changeset
57 bzs->total_out_lo32
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
58 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
59
28861
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
60 #else /* ! BZ_CONFIG_ERROR */
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
61
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
62 #define BZ2_bzRead bzRead
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
63 #define BZ2_bzReadOpen bzReadOpen
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
64 #define BZ2_bzReadClose bzReadClose
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
65 #define BZ2_bzWrite bzWrite
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
66 #define BZ2_bzWriteOpen bzWriteOpen
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
67 #define BZ2_bzWriteClose bzWriteClose
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
68 #define BZ2_bzCompress bzCompress
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
69 #define BZ2_bzCompressInit bzCompressInit
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
70 #define BZ2_bzCompressEnd bzCompressEnd
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
71 #define BZ2_bzDecompress bzDecompress
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
72 #define BZ2_bzDecompressInit bzDecompressInit
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
73 #define BZ2_bzDecompressEnd bzDecompressEnd
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
74
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
75 #define BZS_TOTAL_OUT(bzs) bzs->total_out
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
76
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
77 #endif /* ! BZ_CONFIG_ERROR */
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
78
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
79
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
80 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
81 #define ACQUIRE_LOCK(obj) PyThread_acquire_lock(obj->lock, 1)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
82 #define RELEASE_LOCK(obj) PyThread_release_lock(obj->lock)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
83 #else
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
84 #define ACQUIRE_LOCK(obj)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
85 #define RELEASE_LOCK(obj)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
86 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
87
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
88 /* Bits in f_newlinetypes */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
89 #define NEWLINE_UNKNOWN 0 /* No newline seen, yet */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
90 #define NEWLINE_CR 1 /* \r newline seen */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
91 #define NEWLINE_LF 2 /* \n newline seen */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
92 #define NEWLINE_CRLF 4 /* \r\n newline seen */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
93
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
94 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
95 /* Structure definitions. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
96
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
97 typedef struct {
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
98 PyObject_HEAD
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
99 PyObject *file;
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
100
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
101 char* f_buf; /* Allocated readahead buffer */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
102 char* f_bufend; /* Points after last occupied position */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
103 char* f_bufptr; /* Current buffer position */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
104
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
105 int f_softspace; /* Flag used by 'print' command */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
106
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
107 int f_univ_newline; /* Handle any newline convention */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
108 int f_newlinetypes; /* Types of newlines seen */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
109 int f_skipnextlf; /* Skip next \n */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
110
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
111 BZFILE *fp;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
112 int mode;
35516
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
113 Py_off_t pos;
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
114 Py_off_t size;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
115 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
116 PyThread_type_lock lock;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
117 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
118 } BZ2FileObject;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
119
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
120 typedef struct {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
121 PyObject_HEAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
122 bz_stream bzs;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
123 int running;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
124 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
125 PyThread_type_lock lock;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
126 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
127 } BZ2CompObject;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
128
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
129 typedef struct {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
130 PyObject_HEAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
131 bz_stream bzs;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
132 int running;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
133 PyObject *unused_data;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
134 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
135 PyThread_type_lock lock;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
136 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
137 } BZ2DecompObject;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
138
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
139 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
140 /* Utility functions. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
141
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
142 static int
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
143 Util_CatchBZ2Error(int bzerror)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
144 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
145 int ret = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
146 switch(bzerror) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
147 case BZ_OK:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
148 case BZ_STREAM_END:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
149 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
150
28861
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
151 #ifdef BZ_CONFIG_ERROR
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
152 case BZ_CONFIG_ERROR:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
153 PyErr_SetString(PyExc_SystemError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
154 "the bz2 library was not compiled "
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
155 "correctly");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
156 ret = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
157 break;
28861
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
158 #endif
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
159
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
160 case BZ_PARAM_ERROR:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
161 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
162 "the bz2 library has received wrong "
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
163 "parameters");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
164 ret = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
165 break;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
166
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
167 case BZ_MEM_ERROR:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
168 PyErr_NoMemory();
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
169 ret = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
170 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
171
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
172 case BZ_DATA_ERROR:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
173 case BZ_DATA_ERROR_MAGIC:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
174 PyErr_SetString(PyExc_IOError, "invalid data stream");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
175 ret = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
176 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
177
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
178 case BZ_IO_ERROR:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
179 PyErr_SetString(PyExc_IOError, "unknown IO error");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
180 ret = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
181 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
182
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
183 case BZ_UNEXPECTED_EOF:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
184 PyErr_SetString(PyExc_EOFError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
185 "compressed file ended before the "
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
186 "logical end-of-stream was detected");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
187 ret = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
188 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
189
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
190 case BZ_SEQUENCE_ERROR:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
191 PyErr_SetString(PyExc_RuntimeError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
192 "wrong sequence of bz2 library "
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
193 "commands used");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
194 ret = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
195 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
196 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
197 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
198 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
199
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
200 #if BUFSIZ < 8192
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
201 #define SMALLCHUNK 8192
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
202 #else
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
203 #define SMALLCHUNK BUFSIZ
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
204 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
205
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
206 #if SIZEOF_INT < 4
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
207 #define BIGCHUNK (512 * 32)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
208 #else
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
209 #define BIGCHUNK (512 * 1024)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
210 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
211
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
212 /* This is a hacked version of Python's fileobject.c:new_buffersize(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
213 static size_t
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
214 Util_NewBufferSize(size_t currentsize)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
215 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
216 if (currentsize > SMALLCHUNK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
217 /* Keep doubling until we reach BIGCHUNK;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
218 then keep adding BIGCHUNK. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
219 if (currentsize <= BIGCHUNK)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
220 return currentsize + currentsize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
221 else
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
222 return currentsize + BIGCHUNK;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
223 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
224 return currentsize + SMALLCHUNK;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
225 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
226
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
227 /* This is a hacked version of Python's fileobject.c:get_line(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
228 static PyObject *
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
229 Util_GetLine(BZ2FileObject *f, int n)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
230 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
231 char c;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
232 char *buf, *end;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
233 size_t total_v_size; /* total # of slots in buffer */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
234 size_t used_v_size; /* # used slots in buffer */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
235 size_t increment; /* amount to increment the buffer */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
236 PyObject *v;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
237 int bzerror;
43379
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
238 int bytes_read;
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
239 int newlinetypes = f->f_newlinetypes;
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
240 int skipnextlf = f->f_skipnextlf;
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
241 int univ_newline = f->f_univ_newline;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
242
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
243 total_v_size = n > 0 ? n : 100;
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
244 v = PyString_FromStringAndSize((char *)NULL, total_v_size);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
245 if (v == NULL)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
246 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
247
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
248 buf = BUF(v);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
249 end = buf + total_v_size;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
250
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
251 for (;;) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
252 Py_BEGIN_ALLOW_THREADS
43379
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
253 while (buf != end) {
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
254 bytes_read = BZ2_bzRead(&bzerror, f->fp, &c, 1);
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
255 f->pos++;
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
256 if (bytes_read == 0) break;
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
257 if (univ_newline) {
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
258 if (skipnextlf) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
259 skipnextlf = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
260 if (c == '\n') {
43379
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
261 /* Seeing a \n here with skipnextlf true means we
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
262 * saw a \r before.
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
263 */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
264 newlinetypes |= NEWLINE_CRLF;
43379
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
265 if (bzerror != BZ_OK) break;
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
266 bytes_read = BZ2_bzRead(&bzerror, f->fp, &c, 1);
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
267 f->pos++;
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
268 if (bytes_read == 0) break;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
269 } else {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
270 newlinetypes |= NEWLINE_CR;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
271 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
272 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
273 if (c == '\r') {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
274 skipnextlf = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
275 c = '\n';
43379
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
276 } else if (c == '\n')
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
277 newlinetypes |= NEWLINE_LF;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
278 }
43379
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
279 *buf++ = c;
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
280 if (bzerror != BZ_OK || c == '\n') break;
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
281 }
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
282 if (univ_newline && bzerror == BZ_STREAM_END && skipnextlf)
ae982293c1ae issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Sean Reifscheider <jafo@tummy.com>
parents: 42333
diff changeset
283 newlinetypes |= NEWLINE_CR;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
284 Py_END_ALLOW_THREADS
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
285 f->f_newlinetypes = newlinetypes;
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
286 f->f_skipnextlf = skipnextlf;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
287 if (bzerror == BZ_STREAM_END) {
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
288 f->size = f->pos;
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
289 f->mode = MODE_READ_EOF;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
290 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
291 } else if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
292 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
293 Py_DECREF(v);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
294 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
295 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
296 if (c == '\n')
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
297 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
298 /* Must be because buf == end */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
299 if (n > 0)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
300 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
301 used_v_size = total_v_size;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
302 increment = total_v_size >> 2; /* mild exponential growth */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
303 total_v_size += increment;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
304 if (total_v_size > INT_MAX) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
305 PyErr_SetString(PyExc_OverflowError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
306 "line is longer than a Python string can hold");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
307 Py_DECREF(v);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
308 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
309 }
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
310 if (_PyString_Resize(&v, total_v_size) < 0)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
311 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
312 buf = BUF(v) + used_v_size;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
313 end = BUF(v) + total_v_size;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
314 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
315
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
316 used_v_size = buf - BUF(v);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
317 if (used_v_size != total_v_size)
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
318 _PyString_Resize(&v, used_v_size);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
319 return v;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
320 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
321
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
322 /* This is a hacked version of Python's
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
323 * fileobject.c:Py_UniversalNewlineFread(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
324 size_t
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
325 Util_UnivNewlineRead(int *bzerror, BZFILE *stream,
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
326 char* buf, size_t n, BZ2FileObject *f)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
327 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
328 char *dst = buf;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
329 int newlinetypes, skipnextlf;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
330
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
331 assert(buf != NULL);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
332 assert(stream != NULL);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
333
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
334 if (!f->f_univ_newline)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
335 return BZ2_bzRead(bzerror, stream, buf, n);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
336
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
337 newlinetypes = f->f_newlinetypes;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
338 skipnextlf = f->f_skipnextlf;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
339
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
340 /* Invariant: n is the number of bytes remaining to be filled
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
341 * in the buffer.
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
342 */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
343 while (n) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
344 size_t nread;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
345 int shortread;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
346 char *src = dst;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
347
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
348 nread = BZ2_bzRead(bzerror, stream, dst, n);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
349 assert(nread <= n);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
350 n -= nread; /* assuming 1 byte out for each in; will adjust */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
351 shortread = n != 0; /* true iff EOF or error */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
352 while (nread--) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
353 char c = *src++;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
354 if (c == '\r') {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
355 /* Save as LF and set flag to skip next LF. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
356 *dst++ = '\n';
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
357 skipnextlf = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
358 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
359 else if (skipnextlf && c == '\n') {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
360 /* Skip LF, and remember we saw CR LF. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
361 skipnextlf = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
362 newlinetypes |= NEWLINE_CRLF;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
363 ++n;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
364 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
365 else {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
366 /* Normal char to be stored in buffer. Also
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
367 * update the newlinetypes flag if either this
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
368 * is an LF or the previous char was a CR.
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
369 */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
370 if (c == '\n')
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
371 newlinetypes |= NEWLINE_LF;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
372 else if (skipnextlf)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
373 newlinetypes |= NEWLINE_CR;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
374 *dst++ = c;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
375 skipnextlf = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
376 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
377 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
378 if (shortread) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
379 /* If this is EOF, update type flags. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
380 if (skipnextlf && *bzerror == BZ_STREAM_END)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
381 newlinetypes |= NEWLINE_CR;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
382 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
383 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
384 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
385 f->f_newlinetypes = newlinetypes;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
386 f->f_skipnextlf = skipnextlf;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
387 return dst - buf;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
388 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
389
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
390 /* This is a hacked version of Python's fileobject.c:drop_readahead(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
391 static void
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
392 Util_DropReadAhead(BZ2FileObject *f)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
393 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
394 if (f->f_buf != NULL) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
395 PyMem_Free(f->f_buf);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
396 f->f_buf = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
397 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
398 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
399
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
400 /* This is a hacked version of Python's fileobject.c:readahead(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
401 static int
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
402 Util_ReadAhead(BZ2FileObject *f, int bufsize)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
403 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
404 int chunksize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
405 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
406
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
407 if (f->f_buf != NULL) {
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
408 if((f->f_bufend - f->f_bufptr) >= 1)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
409 return 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
410 else
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
411 Util_DropReadAhead(f);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
412 }
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
413 if (f->mode == MODE_READ_EOF) {
35374
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
414 f->f_bufptr = f->f_buf;
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
415 f->f_bufend = f->f_buf;
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
416 return 0;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
417 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
418 if ((f->f_buf = PyMem_Malloc(bufsize)) == NULL) {
48201
d615aa9fdf36 #3205: bz2 iterator fails silently on MemoryError
Antoine Pitrou <solipsis@pitrou.net>
parents: 47906
diff changeset
419 PyErr_NoMemory();
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
420 return -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
421 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
422 Py_BEGIN_ALLOW_THREADS
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
423 chunksize = Util_UnivNewlineRead(&bzerror, f->fp, f->f_buf,
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
424 bufsize, f);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
425 Py_END_ALLOW_THREADS
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
426 f->pos += chunksize;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
427 if (bzerror == BZ_STREAM_END) {
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
428 f->size = f->pos;
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
429 f->mode = MODE_READ_EOF;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
430 } else if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
431 Util_CatchBZ2Error(bzerror);
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
432 Util_DropReadAhead(f);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
433 return -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
434 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
435 f->f_bufptr = f->f_buf;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
436 f->f_bufend = f->f_buf + chunksize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
437 return 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
438 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
439
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
440 /* This is a hacked version of Python's
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
441 * fileobject.c:readahead_get_line_skip(). */
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
442 static PyStringObject *
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
443 Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
444 {
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
445 PyStringObject* s;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
446 char *bufptr;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
447 char *buf;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
448 int len;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
449
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
450 if (f->f_buf == NULL)
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
451 if (Util_ReadAhead(f, bufsize) < 0)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
452 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
453
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
454 len = f->f_bufend - f->f_bufptr;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
455 if (len == 0)
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
456 return (PyStringObject *)
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
457 PyString_FromStringAndSize(NULL, skip);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
458 bufptr = memchr(f->f_bufptr, '\n', len);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
459 if (bufptr != NULL) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
460 bufptr++; /* Count the '\n' */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
461 len = bufptr - f->f_bufptr;
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
462 s = (PyStringObject *)
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
463 PyString_FromStringAndSize(NULL, skip+len);
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
464 if (s == NULL)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
465 return NULL;
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
466 memcpy(PyString_AS_STRING(s)+skip, f->f_bufptr, len);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
467 f->f_bufptr = bufptr;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
468 if (bufptr == f->f_bufend)
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
469 Util_DropReadAhead(f);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
470 } else {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
471 bufptr = f->f_bufptr;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
472 buf = f->f_buf;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
473 f->f_buf = NULL; /* Force new readahead buffer */
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
474 s = Util_ReadAheadGetLineSkip(f, skip+len,
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
475 bufsize + (bufsize>>2));
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
476 if (s == NULL) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
477 PyMem_Free(buf);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
478 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
479 }
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
480 memcpy(PyString_AS_STRING(s)+skip, bufptr, len);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
481 PyMem_Free(buf);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
482 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
483 return s;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
484 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
485
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
486 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
487 /* Methods of BZ2File. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
488
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
489 PyDoc_STRVAR(BZ2File_read__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
490 "read([size]) -> string\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
491 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
492 Read at most size uncompressed bytes, returned as a string. If the size\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
493 argument is negative or omitted, read until EOF is reached.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
494 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
495
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
496 /* This is a hacked version of Python's fileobject.c:file_read(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
497 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
498 BZ2File_read(BZ2FileObject *self, PyObject *args)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
499 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
500 long bytesrequested = -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
501 size_t bytesread, buffersize, chunksize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
502 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
503 PyObject *ret = NULL;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
504
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
505 if (!PyArg_ParseTuple(args, "|l:read", &bytesrequested))
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
506 return NULL;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
507
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
508 ACQUIRE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
509 switch (self->mode) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
510 case MODE_READ:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
511 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
512 case MODE_READ_EOF:
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
513 ret = PyString_FromString("");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
514 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
515 case MODE_CLOSED:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
516 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
517 "I/O operation on closed file");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
518 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
519 default:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
520 PyErr_SetString(PyExc_IOError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
521 "file is not ready for reading");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
522 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
523 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
524
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
525 if (bytesrequested < 0)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
526 buffersize = Util_NewBufferSize((size_t)0);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
527 else
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
528 buffersize = bytesrequested;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
529 if (buffersize > INT_MAX) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
530 PyErr_SetString(PyExc_OverflowError,
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
531 "requested number of bytes is "
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
532 "more than a Python string can hold");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
533 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
534 }
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
535 ret = PyString_FromStringAndSize((char *)NULL, buffersize);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
536 if (ret == NULL)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
537 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
538 bytesread = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
539
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
540 for (;;) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
541 Py_BEGIN_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
542 chunksize = Util_UnivNewlineRead(&bzerror, self->fp,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
543 BUF(ret)+bytesread,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
544 buffersize-bytesread,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
545 self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
546 self->pos += chunksize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
547 Py_END_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
548 bytesread += chunksize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
549 if (bzerror == BZ_STREAM_END) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
550 self->size = self->pos;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
551 self->mode = MODE_READ_EOF;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
552 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
553 } else if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
554 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
555 Py_DECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
556 ret = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
557 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
558 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
559 if (bytesrequested < 0) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
560 buffersize = Util_NewBufferSize(buffersize);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
561 if (_PyString_Resize(&ret, buffersize) < 0)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
562 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
563 } else {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
564 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
565 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
566 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
567 if (bytesread != buffersize)
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
568 _PyString_Resize(&ret, bytesread);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
569
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
570 cleanup:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
571 RELEASE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
572 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
573 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
574
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
575 PyDoc_STRVAR(BZ2File_readline__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
576 "readline([size]) -> string\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
577 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
578 Return the next line from the file, as a string, retaining newline.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
579 A non-negative size argument will limit the maximum number of bytes to\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
580 return (an incomplete line may be returned then). Return an empty\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
581 string at EOF.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
582 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
583
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
584 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
585 BZ2File_readline(BZ2FileObject *self, PyObject *args)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
586 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
587 PyObject *ret = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
588 int sizehint = -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
589
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
590 if (!PyArg_ParseTuple(args, "|i:readline", &sizehint))
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
591 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
592
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
593 ACQUIRE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
594 switch (self->mode) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
595 case MODE_READ:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
596 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
597 case MODE_READ_EOF:
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
598 ret = PyString_FromString("");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
599 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
600 case MODE_CLOSED:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
601 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
602 "I/O operation on closed file");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
603 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
604 default:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
605 PyErr_SetString(PyExc_IOError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
606 "file is not ready for reading");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
607 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
608 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
609
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
610 if (sizehint == 0)
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
611 ret = PyString_FromString("");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
612 else
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
613 ret = Util_GetLine(self, (sizehint < 0) ? 0 : sizehint);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
614
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
615 cleanup:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
616 RELEASE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
617 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
618 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
619
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
620 PyDoc_STRVAR(BZ2File_readlines__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
621 "readlines([size]) -> list\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
622 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
623 Call readline() repeatedly and return a list of lines read.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
624 The optional size argument, if given, is an approximate bound on the\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
625 total number of bytes in the lines returned.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
626 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
627
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
628 /* This is a hacked version of Python's fileobject.c:file_readlines(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
629 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
630 BZ2File_readlines(BZ2FileObject *self, PyObject *args)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
631 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
632 long sizehint = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
633 PyObject *list = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
634 PyObject *line;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
635 char small_buffer[SMALLCHUNK];
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
636 char *buffer = small_buffer;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
637 size_t buffersize = SMALLCHUNK;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
638 PyObject *big_buffer = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
639 size_t nfilled = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
640 size_t nread;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
641 size_t totalread = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
642 char *p, *q, *end;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
643 int err;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
644 int shortread = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
645 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
646
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
647 if (!PyArg_ParseTuple(args, "|l:readlines", &sizehint))
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
648 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
649
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
650 ACQUIRE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
651 switch (self->mode) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
652 case MODE_READ:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
653 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
654 case MODE_READ_EOF:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
655 list = PyList_New(0);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
656 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
657 case MODE_CLOSED:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
658 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
659 "I/O operation on closed file");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
660 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
661 default:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
662 PyErr_SetString(PyExc_IOError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
663 "file is not ready for reading");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
664 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
665 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
666
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
667 if ((list = PyList_New(0)) == NULL)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
668 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
669
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
670 for (;;) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
671 Py_BEGIN_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
672 nread = Util_UnivNewlineRead(&bzerror, self->fp,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
673 buffer+nfilled,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
674 buffersize-nfilled, self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
675 self->pos += nread;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
676 Py_END_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
677 if (bzerror == BZ_STREAM_END) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
678 self->size = self->pos;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
679 self->mode = MODE_READ_EOF;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
680 if (nread == 0) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
681 sizehint = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
682 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
683 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
684 shortread = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
685 } else if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
686 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
687 error:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
688 Py_DECREF(list);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
689 list = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
690 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
691 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
692 totalread += nread;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
693 p = memchr(buffer+nfilled, '\n', nread);
35374
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
694 if (!shortread && p == NULL) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
695 /* Need a larger buffer to fit this line */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
696 nfilled += nread;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
697 buffersize *= 2;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
698 if (buffersize > INT_MAX) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
699 PyErr_SetString(PyExc_OverflowError,
35374
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
700 "line is longer than a Python string can hold");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
701 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
702 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
703 if (big_buffer == NULL) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
704 /* Create the big buffer */
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
705 big_buffer = PyString_FromStringAndSize(
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
706 NULL, buffersize);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
707 if (big_buffer == NULL)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
708 goto error;
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
709 buffer = PyString_AS_STRING(big_buffer);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
710 memcpy(buffer, small_buffer, nfilled);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
711 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
712 else {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
713 /* Grow the big buffer */
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
714 _PyString_Resize(&big_buffer, buffersize);
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
715 buffer = PyString_AS_STRING(big_buffer);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
716 }
35374
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
717 continue;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
718 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
719 end = buffer+nfilled+nread;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
720 q = buffer;
35374
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
721 while (p != NULL) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
722 /* Process complete lines */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
723 p++;
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
724 line = PyString_FromStringAndSize(q, p-q);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
725 if (line == NULL)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
726 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
727 err = PyList_Append(list, line);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
728 Py_DECREF(line);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
729 if (err != 0)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
730 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
731 q = p;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
732 p = memchr(q, '\n', end-q);
35374
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
733 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
734 /* Move the remaining incomplete line to the start */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
735 nfilled = end-q;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
736 memmove(buffer, q, nfilled);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
737 if (sizehint > 0)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
738 if (totalread >= (size_t)sizehint)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
739 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
740 if (shortread) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
741 sizehint = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
742 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
743 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
744 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
745 if (nfilled != 0) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
746 /* Partial last line */
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
747 line = PyString_FromStringAndSize(buffer, nfilled);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
748 if (line == NULL)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
749 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
750 if (sizehint > 0) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
751 /* Need to complete the last line */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
752 PyObject *rest = Util_GetLine(self, 0);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
753 if (rest == NULL) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
754 Py_DECREF(line);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
755 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
756 }
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
757 PyString_Concat(&line, rest);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
758 Py_DECREF(rest);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
759 if (line == NULL)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
760 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
761 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
762 err = PyList_Append(list, line);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
763 Py_DECREF(line);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
764 if (err != 0)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
765 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
766 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
767
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
768 cleanup:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
769 RELEASE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
770 if (big_buffer) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
771 Py_DECREF(big_buffer);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
772 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
773 return list;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
774 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
775
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
776 PyDoc_STRVAR(BZ2File_xreadlines__doc__,
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
777 "xreadlines() -> self\n\
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
778 \n\
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
779 For backward compatibility. BZ2File objects now include the performance\n\
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
780 optimizations previously implemented in the xreadlines module.\n\
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
781 ");
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
782
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
783 PyDoc_STRVAR(BZ2File_write__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
784 "write(data) -> None\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
785 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
786 Write the 'data' string to file. Note that due to buffering, close() may\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
787 be needed before the file on disk reflects the data written.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
788 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
789
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
790 /* This is a hacked version of Python's fileobject.c:file_write(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
791 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
792 BZ2File_write(BZ2FileObject *self, PyObject *args)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
793 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
794 PyObject *ret = NULL;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
795 Py_buffer pbuf;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
796 char *buf;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
797 int len;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
798 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
799
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
800 if (!PyArg_ParseTuple(args, "s*:write", &pbuf))
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
801 return NULL;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
802 buf = pbuf.buf;
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
803 len = pbuf.len;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
804
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
805 ACQUIRE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
806 switch (self->mode) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
807 case MODE_WRITE:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
808 break;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
809
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
810 case MODE_CLOSED:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
811 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
812 "I/O operation on closed file");
39496
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
813 goto cleanup;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
814
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
815 default:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
816 PyErr_SetString(PyExc_IOError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
817 "file is not ready for writing");
39496
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
818 goto cleanup;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
819 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
820
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
821 self->f_softspace = 0;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
822
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
823 Py_BEGIN_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
824 BZ2_bzWrite (&bzerror, self->fp, buf, len);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
825 self->pos += len;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
826 Py_END_ALLOW_THREADS
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
827
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
828 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
829 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
830 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
831 }
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
832
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
833 Py_INCREF(Py_None);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
834 ret = Py_None;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
835
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
836 cleanup:
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
837 PyBuffer_Release(&pbuf);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
838 RELEASE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
839 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
840 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
841
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
842 PyDoc_STRVAR(BZ2File_writelines__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
843 "writelines(sequence_of_strings) -> None\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
844 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
845 Write the sequence of strings to the file. Note that newlines are not\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
846 added. The sequence can be any iterable object producing strings. This is\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
847 equivalent to calling write() for each string.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
848 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
849
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
850 /* This is a hacked version of Python's fileobject.c:file_writelines(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
851 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
852 BZ2File_writelines(BZ2FileObject *self, PyObject *seq)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
853 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
854 #define CHUNKSIZE 1000
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
855 PyObject *list = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
856 PyObject *iter = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
857 PyObject *ret = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
858 PyObject *line;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
859 int i, j, index, len, islist;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
860 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
861
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
862 ACQUIRE_LOCK(self);
39496
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
863 switch (self->mode) {
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
864 case MODE_WRITE:
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
865 break;
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
866
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
867 case MODE_CLOSED:
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
868 PyErr_SetString(PyExc_ValueError,
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
869 "I/O operation on closed file");
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
870 goto error;
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
871
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
872 default:
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
873 PyErr_SetString(PyExc_IOError,
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
874 "file is not ready for writing");
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
875 goto error;
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
876 }
352ffe77b71d Patch #1535500: fix segfault in BZ2File.writelines and make sure it
Georg Brandl <georg@python.org>
parents: 39135
diff changeset
877
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
878 islist = PyList_Check(seq);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
879 if (!islist) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
880 iter = PyObject_GetIter(seq);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
881 if (iter == NULL) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
882 PyErr_SetString(PyExc_TypeError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
883 "writelines() requires an iterable argument");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
884 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
885 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
886 list = PyList_New(CHUNKSIZE);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
887 if (list == NULL)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
888 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
889 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
890
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
891 /* Strategy: slurp CHUNKSIZE lines into a private list,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
892 checking that they are all strings, then write that list
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
893 without holding the interpreter lock, then come back for more. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
894 for (index = 0; ; index += CHUNKSIZE) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
895 if (islist) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
896 Py_XDECREF(list);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
897 list = PyList_GetSlice(seq, index, index+CHUNKSIZE);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
898 if (list == NULL)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
899 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
900 j = PyList_GET_SIZE(list);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
901 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
902 else {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
903 for (j = 0; j < CHUNKSIZE; j++) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
904 line = PyIter_Next(iter);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
905 if (line == NULL) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
906 if (PyErr_Occurred())
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
907 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
908 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
909 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
910 PyList_SetItem(list, j, line);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
911 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
912 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
913 if (j == 0)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
914 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
915
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
916 /* Check that all entries are indeed strings. If not,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
917 apply the same rules as for file.write() and
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
918 convert the rets to strings. This is slow, but
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
919 seems to be the only way since all conversion APIs
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
920 could potentially execute Python code. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
921 for (i = 0; i < j; i++) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
922 PyObject *v = PyList_GET_ITEM(list, i);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
923 if (!PyString_Check(v)) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
924 const char *buffer;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
925 Py_ssize_t len;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
926 if (PyObject_AsCharBuffer(v, &buffer, &len)) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
927 PyErr_SetString(PyExc_TypeError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
928 "writelines() "
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
929 "argument must be "
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
930 "a sequence of "
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
931 "strings");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
932 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
933 }
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
934 line = PyString_FromStringAndSize(buffer,
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
935 len);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
936 if (line == NULL)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
937 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
938 Py_DECREF(v);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
939 PyList_SET_ITEM(list, i, line);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
940 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
941 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
942
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
943 self->f_softspace = 0;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
944
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
945 /* Since we are releasing the global lock, the
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
946 following code may *not* execute Python code. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
947 Py_BEGIN_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
948 for (i = 0; i < j; i++) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
949 line = PyList_GET_ITEM(list, i);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
950 len = PyString_GET_SIZE(line);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
951 BZ2_bzWrite (&bzerror, self->fp,
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
952 PyString_AS_STRING(line), len);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
953 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
954 Py_BLOCK_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
955 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
956 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
957 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
958 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
959 Py_END_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
960
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
961 if (j < CHUNKSIZE)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
962 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
963 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
964
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
965 Py_INCREF(Py_None);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
966 ret = Py_None;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
967
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
968 error:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
969 RELEASE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
970 Py_XDECREF(list);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
971 Py_XDECREF(iter);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
972 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
973 #undef CHUNKSIZE
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
974 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
975
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
976 PyDoc_STRVAR(BZ2File_seek__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
977 "seek(offset [, whence]) -> None\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
978 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
979 Move to new file position. Argument offset is a byte count. Optional\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
980 argument whence defaults to 0 (offset from start of file, offset\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
981 should be >= 0); other values are 1 (move relative to current position,\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
982 positive or negative), and 2 (move relative to end of file, usually\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
983 negative, although many platforms allow seeking beyond the end of a file).\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
984 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
985 Note that seeking of bz2 files is emulated, and depending on the parameters\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
986 the operation may be extremely slow.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
987 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
988
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
989 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
990 BZ2File_seek(BZ2FileObject *self, PyObject *args)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
991 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
992 int where = 0;
35374
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
993 PyObject *offobj;
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
994 Py_off_t offset;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
995 char small_buffer[SMALLCHUNK];
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
996 char *buffer = small_buffer;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
997 size_t buffersize = SMALLCHUNK;
40467
56dc72c1a1f4 [Patch #1615868 by Lars Gustaebel] Use Py_off_t to fix BZ2File.seek() for offsets > 2Gb
Andrew M. Kuchling <amk@amk.ca>
parents: 39875
diff changeset
998 Py_off_t bytesread = 0;
35516
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
999 size_t readsize;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1000 int chunksize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1001 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1002 PyObject *ret = NULL;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
1003
35374
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
1004 if (!PyArg_ParseTuple(args, "O|i:seek", &offobj, &where))
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
1005 return NULL;
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
1006 #if !defined(HAVE_LARGEFILE_SUPPORT)
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
1007 offset = PyInt_AsLong(offobj);
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
1008 #else
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
1009 offset = PyLong_Check(offobj) ?
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
1010 PyLong_AsLongLong(offobj) : PyInt_AsLong(offobj);
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
1011 #endif
797d82eec625 Fix BZ2File.(x)readlines() for files without a newline.
Georg Brandl <georg@python.org>
parents: 35013
diff changeset
1012 if (PyErr_Occurred())
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1013 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1014
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1015 ACQUIRE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1016 Util_DropReadAhead(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1017 switch (self->mode) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1018 case MODE_READ:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1019 case MODE_READ_EOF:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1020 break;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
1021
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1022 case MODE_CLOSED:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1023 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1024 "I/O operation on closed file");
39875
cab056903b3d Remove extra semi-colons reported by Johnny Lee on python-dev. Backport if anyone cares.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39496
diff changeset
1025 goto cleanup;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
1026
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1027 default:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1028 PyErr_SetString(PyExc_IOError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1029 "seek works only while reading");
39875
cab056903b3d Remove extra semi-colons reported by Johnny Lee on python-dev. Backport if anyone cares.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39496
diff changeset
1030 goto cleanup;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1031 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1032
36571
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1033 if (where == 2) {
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1034 if (self->size == -1) {
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1035 assert(self->mode != MODE_READ_EOF);
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1036 for (;;) {
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1037 Py_BEGIN_ALLOW_THREADS
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1038 chunksize = Util_UnivNewlineRead(
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1039 &bzerror, self->fp,
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1040 buffer, buffersize,
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1041 self);
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1042 self->pos += chunksize;
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1043 Py_END_ALLOW_THREADS
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1044
36571
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1045 bytesread += chunksize;
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1046 if (bzerror == BZ_STREAM_END) {
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1047 break;
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1048 } else if (bzerror != BZ_OK) {
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1049 Util_CatchBZ2Error(bzerror);
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1050 goto cleanup;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1051 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1052 }
36571
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1053 self->mode = MODE_READ_EOF;
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1054 self->size = self->pos;
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1055 bytesread = 0;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1056 }
36571
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1057 offset = self->size + offset;
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1058 } else if (where == 1) {
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1059 offset = self->pos + offset;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1060 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1061
36571
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1062 /* Before getting here, offset must be the absolute position the file
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1063 * pointer should be set to. */
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1064
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1065 if (offset >= self->pos) {
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1066 /* we can move forward */
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1067 offset -= self->pos;
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1068 } else {
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1069 /* we cannot move back, so rewind the stream */
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1070 BZ2_bzReadClose(&bzerror, self->fp);
46337
2d95f7a983d8 Use the new PyFile_IncUseCount & PyFile_DecUseCount calls appropriatly
Gregory P. Smith <greg@mad-scientist.com>
parents: 44350
diff changeset
1071 if (self->fp) {
46411
764aab0e8b9b fix compiler warnings
Gregory P. Smith <greg@mad-scientist.com>
parents: 46337
diff changeset
1072 PyFile_DecUseCount((PyFileObject *)self->file);
46337
2d95f7a983d8 Use the new PyFile_IncUseCount & PyFile_DecUseCount calls appropriatly
Gregory P. Smith <greg@mad-scientist.com>
parents: 44350
diff changeset
1073 self->fp = NULL;
2d95f7a983d8 Use the new PyFile_IncUseCount & PyFile_DecUseCount calls appropriatly
Gregory P. Smith <greg@mad-scientist.com>
parents: 44350
diff changeset
1074 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1075 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1076 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1077 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1078 }
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1079 ret = PyObject_CallMethod(self->file, "seek", "(i)", 0);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1080 if (!ret)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1081 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1082 Py_DECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1083 ret = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1084 self->pos = 0;
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1085 self->fp = BZ2_bzReadOpen(&bzerror, PyFile_AsFile(self->file),
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1086 0, 0, NULL, 0);
46337
2d95f7a983d8 Use the new PyFile_IncUseCount & PyFile_DecUseCount calls appropriatly
Gregory P. Smith <greg@mad-scientist.com>
parents: 44350
diff changeset
1087 if (self->fp)
46411
764aab0e8b9b fix compiler warnings
Gregory P. Smith <greg@mad-scientist.com>
parents: 46337
diff changeset
1088 PyFile_IncUseCount((PyFileObject *)self->file);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1089 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1090 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1091 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1092 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1093 self->mode = MODE_READ;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1094 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1095
36571
18458711ebed Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
Georg Brandl <georg@python.org>
parents: 36501
diff changeset
1096 if (offset <= 0 || self->mode == MODE_READ_EOF)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1097 goto exit;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1098
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1099 /* Before getting here, offset must be set to the number of bytes
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1100 * to walk forward. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1101 for (;;) {
35516
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
1102 if (offset-bytesread > buffersize)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1103 readsize = buffersize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1104 else
35516
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
1105 /* offset might be wider that readsize, but the result
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
1106 * of the subtraction is bound by buffersize (see the
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
1107 * condition above). buffersize is 8192. */
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
1108 readsize = (size_t)(offset-bytesread);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1109 Py_BEGIN_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1110 chunksize = Util_UnivNewlineRead(&bzerror, self->fp,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1111 buffer, readsize, self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1112 self->pos += chunksize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1113 Py_END_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1114 bytesread += chunksize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1115 if (bzerror == BZ_STREAM_END) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1116 self->size = self->pos;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1117 self->mode = MODE_READ_EOF;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1118 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1119 } else if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1120 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1121 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1122 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1123 if (bytesread == offset)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1124 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1125 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1126
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1127 exit:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1128 Py_INCREF(Py_None);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1129 ret = Py_None;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1130
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1131 cleanup:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1132 RELEASE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1133 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1134 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1135
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1136 PyDoc_STRVAR(BZ2File_tell__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1137 "tell() -> int\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1138 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1139 Return the current file position, an integer (may be a long integer).\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1140 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1141
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1142 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1143 BZ2File_tell(BZ2FileObject *self, PyObject *args)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1144 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1145 PyObject *ret = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1146
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1147 if (self->mode == MODE_CLOSED) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1148 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1149 "I/O operation on closed file");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1150 goto cleanup;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1151 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1152
35516
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
1153 #if !defined(HAVE_LARGEFILE_SUPPORT)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1154 ret = PyInt_FromLong(self->pos);
35516
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
1155 #else
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
1156 ret = PyLong_FromLongLong(self->pos);
de1c5d17fde6 bug [ 1274069 ] bz2module.c compiler warning
Georg Brandl <georg@python.org>
parents: 35374
diff changeset
1157 #endif
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1158
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1159 cleanup:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1160 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1161 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1162
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1163 PyDoc_STRVAR(BZ2File_close__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1164 "close() -> None or (perhaps) an integer\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1165 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1166 Close the file. Sets data attribute .closed to true. A closed file\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1167 cannot be used for further I/O operations. close() may be called more\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1168 than once without error.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1169 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1170
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1171 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1172 BZ2File_close(BZ2FileObject *self)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1173 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1174 PyObject *ret = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1175 int bzerror = BZ_OK;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1176
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1177 ACQUIRE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1178 switch (self->mode) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1179 case MODE_READ:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1180 case MODE_READ_EOF:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1181 BZ2_bzReadClose(&bzerror, self->fp);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1182 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1183 case MODE_WRITE:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1184 BZ2_bzWriteClose(&bzerror, self->fp,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1185 0, NULL, NULL);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1186 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1187 }
46337
2d95f7a983d8 Use the new PyFile_IncUseCount & PyFile_DecUseCount calls appropriatly
Gregory P. Smith <greg@mad-scientist.com>
parents: 44350
diff changeset
1188 if (self->fp) {
46411
764aab0e8b9b fix compiler warnings
Gregory P. Smith <greg@mad-scientist.com>
parents: 46337
diff changeset
1189 PyFile_DecUseCount((PyFileObject *)self->file);
46337
2d95f7a983d8 Use the new PyFile_IncUseCount & PyFile_DecUseCount calls appropriatly
Gregory P. Smith <greg@mad-scientist.com>
parents: 44350
diff changeset
1190 self->fp = NULL;
2d95f7a983d8 Use the new PyFile_IncUseCount & PyFile_DecUseCount calls appropriatly
Gregory P. Smith <greg@mad-scientist.com>
parents: 44350
diff changeset
1191 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1192 self->mode = MODE_CLOSED;
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1193 ret = PyObject_CallMethod(self->file, "close", NULL);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1194 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1195 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1196 Py_XDECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1197 ret = NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1198 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1199
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1200 RELEASE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1201 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1202 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1203
50698
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1204 PyDoc_STRVAR(BZ2File_enter_doc,
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1205 "__enter__() -> self.");
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1206
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1207 static PyObject *
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1208 BZ2File_enter(BZ2FileObject *self)
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1209 {
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1210 if (self->mode == MODE_CLOSED) {
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1211 PyErr_SetString(PyExc_ValueError,
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1212 "I/O operation on closed file");
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1213 return NULL;
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1214 }
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1215 Py_INCREF(self);
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1216 return (PyObject *) self;
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1217 }
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1218
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1219 PyDoc_STRVAR(BZ2File_exit_doc,
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1220 "__exit__(*excinfo) -> None. Closes the file.");
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1221
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1222 static PyObject *
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1223 BZ2File_exit(BZ2FileObject *self, PyObject *args)
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1224 {
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1225 PyObject *ret = PyObject_CallMethod((PyObject *) self, "close", NULL);
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1226 if (!ret)
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1227 /* If error occurred, pass through */
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1228 return NULL;
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1229 Py_DECREF(ret);
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1230 Py_RETURN_NONE;
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1231 }
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1232
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1233
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1234 static PyObject *BZ2File_getiter(BZ2FileObject *self);
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1235
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1236 static PyMethodDef BZ2File_methods[] = {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1237 {"read", (PyCFunction)BZ2File_read, METH_VARARGS, BZ2File_read__doc__},
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1238 {"readline", (PyCFunction)BZ2File_readline, METH_VARARGS, BZ2File_readline__doc__},
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1239 {"readlines", (PyCFunction)BZ2File_readlines, METH_VARARGS, BZ2File_readlines__doc__},
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1240 {"xreadlines", (PyCFunction)BZ2File_getiter, METH_VARARGS, BZ2File_xreadlines__doc__},
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1241 {"write", (PyCFunction)BZ2File_write, METH_VARARGS, BZ2File_write__doc__},
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1242 {"writelines", (PyCFunction)BZ2File_writelines, METH_O, BZ2File_writelines__doc__},
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1243 {"seek", (PyCFunction)BZ2File_seek, METH_VARARGS, BZ2File_seek__doc__},
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1244 {"tell", (PyCFunction)BZ2File_tell, METH_NOARGS, BZ2File_tell__doc__},
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1245 {"close", (PyCFunction)BZ2File_close, METH_NOARGS, BZ2File_close__doc__},
50698
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1246 {"__enter__", (PyCFunction)BZ2File_enter, METH_NOARGS, BZ2File_enter_doc},
5d5d9074f4ca Issue #3860: GzipFile and BZ2File now support the context manager protocol.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48221
diff changeset
1247 {"__exit__", (PyCFunction)BZ2File_exit, METH_VARARGS, BZ2File_exit_doc},
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1248 {NULL, NULL} /* sentinel */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1249 };
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1250
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1251
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1252 /* ===================================================================== */
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1253 /* Getters and setters of BZ2File. */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1254
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1255 /* This is a hacked version of Python's fileobject.c:get_newlines(). */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1256 static PyObject *
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1257 BZ2File_get_newlines(BZ2FileObject *self, void *closure)
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1258 {
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1259 switch (self->f_newlinetypes) {
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1260 case NEWLINE_UNKNOWN:
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1261 Py_INCREF(Py_None);
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1262 return Py_None;
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1263 case NEWLINE_CR:
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1264 return PyString_FromString("\r");
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1265 case NEWLINE_LF:
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1266 return PyString_FromString("\n");
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1267 case NEWLINE_CR|NEWLINE_LF:
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1268 return Py_BuildValue("(ss)", "\r", "\n");
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1269 case NEWLINE_CRLF:
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1270 return PyString_FromString("\r\n");
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1271 case NEWLINE_CR|NEWLINE_CRLF:
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1272 return Py_BuildValue("(ss)", "\r", "\r\n");
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1273 case NEWLINE_LF|NEWLINE_CRLF:
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1274 return Py_BuildValue("(ss)", "\n", "\r\n");
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1275 case NEWLINE_CR|NEWLINE_LF|NEWLINE_CRLF:
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1276 return Py_BuildValue("(sss)", "\r", "\n", "\r\n");
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1277 default:
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1278 PyErr_Format(PyExc_SystemError,
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1279 "Unknown newlines value 0x%x\n",
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1280 self->f_newlinetypes);
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1281 return NULL;
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1282 }
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1283 }
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1284
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1285 static PyObject *
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1286 BZ2File_get_closed(BZ2FileObject *self, void *closure)
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1287 {
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1288 return PyInt_FromLong(self->mode == MODE_CLOSED);
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1289 }
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1290
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1291 static PyObject *
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1292 BZ2File_get_mode(BZ2FileObject *self, void *closure)
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1293 {
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1294 return PyObject_GetAttrString(self->file, "mode");
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1295 }
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1296
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1297 static PyObject *
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1298 BZ2File_get_name(BZ2FileObject *self, void *closure)
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1299 {
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1300 return PyObject_GetAttrString(self->file, "name");
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1301 }
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1302
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1303 static PyGetSetDef BZ2File_getset[] = {
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1304 {"closed", (getter)BZ2File_get_closed, NULL,
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1305 "True if the file is closed"},
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1306 {"newlines", (getter)BZ2File_get_newlines, NULL,
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1307 "end-of-line convention used in this file"},
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1308 {"mode", (getter)BZ2File_get_mode, NULL,
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1309 "file mode ('r', 'w', or 'U')"},
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1310 {"name", (getter)BZ2File_get_name, NULL,
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1311 "file name"},
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1312 {NULL} /* Sentinel */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1313 };
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1314
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1315
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1316 /* ===================================================================== */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1317 /* Members of BZ2File_Type. */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1318
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1319 #undef OFF
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1320 #define OFF(x) offsetof(BZ2FileObject, x)
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1321
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1322 static PyMemberDef BZ2File_members[] = {
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1323 {"softspace", T_INT, OFF(f_softspace), 0,
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1324 "flag indicating that a space needs to be printed; used by print"},
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1325 {NULL} /* Sentinel */
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1326 };
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1327
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1328 /* ===================================================================== */
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1329 /* Slot definitions for BZ2File_Type. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1330
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1331 static int
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1332 BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1333 {
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36577
diff changeset
1334 static char *kwlist[] = {"filename", "mode", "buffering",
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35516
diff changeset
1335 "compresslevel", 0};
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1336 PyObject *name;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1337 char *mode = "r";
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1338 int buffering = -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1339 int compresslevel = 9;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1340 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1341 int mode_char = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1342
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1343 self->size = -1;
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
1344
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1345 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|sii:BZ2File",
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1346 kwlist, &name, &mode, &buffering,
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1347 &compresslevel))
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1348 return -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1349
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1350 if (compresslevel < 1 || compresslevel > 9) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1351 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1352 "compresslevel must be between 1 and 9");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1353 return -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1354 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1355
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1356 for (;;) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1357 int error = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1358 switch (*mode) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1359 case 'r':
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1360 case 'w':
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1361 if (mode_char)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1362 error = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1363 mode_char = *mode;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1364 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1365
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1366 case 'b':
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1367 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1368
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1369 case 'U':
39043
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38760
diff changeset
1370 #ifdef __VMS
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38760
diff changeset
1371 self->f_univ_newline = 0;
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38760
diff changeset
1372 #else
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1373 self->f_univ_newline = 1;
39043
c67b23397f30 Patch #1516912: improve Modules support for OpenVMS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38760
diff changeset
1374 #endif
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1375 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1376
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1377 default:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1378 error = 1;
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1379 break;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1380 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1381 if (error) {
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1382 PyErr_Format(PyExc_ValueError,
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1383 "invalid mode char %c", *mode);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1384 return -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1385 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1386 mode++;
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1387 if (*mode == '\0')
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1388 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1389 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1390
35013
4a02a4317655 Bug #1194181: bz2.BZ2File didn't handle mode 'U' correctly.
Georg Brandl <georg@python.org>
parents: 33877
diff changeset
1391 if (mode_char == 0) {
4a02a4317655 Bug #1194181: bz2.BZ2File didn't handle mode 'U' correctly.
Georg Brandl <georg@python.org>
parents: 33877
diff changeset
1392 mode_char = 'r';
4a02a4317655 Bug #1194181: bz2.BZ2File didn't handle mode 'U' correctly.
Georg Brandl <georg@python.org>
parents: 33877
diff changeset
1393 }
4a02a4317655 Bug #1194181: bz2.BZ2File didn't handle mode 'U' correctly.
Georg Brandl <georg@python.org>
parents: 33877
diff changeset
1394
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1395 mode = (mode_char == 'r') ? "rb" : "wb";
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
1396
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1397 self->file = PyObject_CallFunction((PyObject*)&PyFile_Type, "(Osi)",
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1398 name, mode, buffering);
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1399 if (self->file == NULL)
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1400 return -1;
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1401
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1402 /* From now on, we have stuff to dealloc, so jump to error label
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1403 * instead of returning */
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1404
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1405 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1406 self->lock = PyThread_allocate_lock();
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1407 if (!self->lock) {
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1408 PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1409 goto error;
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1410 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1411 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1412
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1413 if (mode_char == 'r')
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1414 self->fp = BZ2_bzReadOpen(&bzerror,
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1415 PyFile_AsFile(self->file),
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1416 0, 0, NULL, 0);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1417 else
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1418 self->fp = BZ2_bzWriteOpen(&bzerror,
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1419 PyFile_AsFile(self->file),
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1420 compresslevel, 0, 0);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1421
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1422 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1423 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1424 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1425 }
46411
764aab0e8b9b fix compiler warnings
Gregory P. Smith <greg@mad-scientist.com>
parents: 46337
diff changeset
1426 PyFile_IncUseCount((PyFileObject *)self->file);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1427
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1428 self->mode = (mode_char == 'r') ? MODE_READ : MODE_WRITE;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1429
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1430 return 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1431
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1432 error:
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1433 Py_CLEAR(self->file);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1434 #ifdef WITH_THREAD
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1435 if (self->lock) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1436 PyThread_free_lock(self->lock);
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1437 self->lock = NULL;
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1438 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1439 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1440 return -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1441 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1442
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1443 static void
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1444 BZ2File_dealloc(BZ2FileObject *self)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1445 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1446 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1447 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1448 if (self->lock)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1449 PyThread_free_lock(self->lock);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1450 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1451 switch (self->mode) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1452 case MODE_READ:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1453 case MODE_READ_EOF:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1454 BZ2_bzReadClose(&bzerror, self->fp);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1455 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1456 case MODE_WRITE:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1457 BZ2_bzWriteClose(&bzerror, self->fp,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1458 0, NULL, NULL);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1459 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1460 }
46337
2d95f7a983d8 Use the new PyFile_IncUseCount & PyFile_DecUseCount calls appropriatly
Gregory P. Smith <greg@mad-scientist.com>
parents: 44350
diff changeset
1461 if (self->fp) {
46411
764aab0e8b9b fix compiler warnings
Gregory P. Smith <greg@mad-scientist.com>
parents: 46337
diff changeset
1462 PyFile_DecUseCount((PyFileObject *)self->file);
46337
2d95f7a983d8 Use the new PyFile_IncUseCount & PyFile_DecUseCount calls appropriatly
Gregory P. Smith <greg@mad-scientist.com>
parents: 44350
diff changeset
1463 self->fp = NULL;
2d95f7a983d8 Use the new PyFile_IncUseCount & PyFile_DecUseCount calls appropriatly
Gregory P. Smith <greg@mad-scientist.com>
parents: 44350
diff changeset
1464 }
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1465 Util_DropReadAhead(self);
28885
671e4e2eec4b Applying patch #728656, by logistix, fixing opening of nonexistent
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28861
diff changeset
1466 Py_XDECREF(self->file);
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43379
diff changeset
1467 Py_TYPE(self)->tp_free((PyObject *)self);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1468 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1469
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1470 /* This is a hacked version of Python's fileobject.c:file_getiter(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1471 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1472 BZ2File_getiter(BZ2FileObject *self)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1473 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1474 if (self->mode == MODE_CLOSED) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1475 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1476 "I/O operation on closed file");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1477 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1478 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1479 Py_INCREF((PyObject*)self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1480 return (PyObject *)self;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1481 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1482
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1483 /* This is a hacked version of Python's fileobject.c:file_iternext(). */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1484 #define READAHEAD_BUFSIZE 8192
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1485 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1486 BZ2File_iternext(BZ2FileObject *self)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1487 {
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1488 PyStringObject* ret;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1489 ACQUIRE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1490 if (self->mode == MODE_CLOSED) {
47906
30fbf8e45549 - Issue #3309: Fix bz2.BZFile itererator to release its internal lock
Gregory P. Smith <greg@mad-scientist.com>
parents: 47527
diff changeset
1491 RELEASE_LOCK(self);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1492 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1493 "I/O operation on closed file");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1494 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1495 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1496 ret = Util_ReadAheadGetLineSkip(self, 0, READAHEAD_BUFSIZE);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1497 RELEASE_LOCK(self);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1498 if (ret == NULL || PyString_GET_SIZE(ret) == 0) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1499 Py_XDECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1500 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1501 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1502 return (PyObject *)ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1503 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1504
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1505 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1506 /* BZ2File_Type definition. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1507
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1508 PyDoc_VAR(BZ2File__doc__) =
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1509 PyDoc_STR(
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1510 "BZ2File(name [, mode='r', buffering=0, compresslevel=9]) -> file object\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1511 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1512 Open a bz2 file. The mode can be 'r' or 'w', for reading (default) or\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1513 writing. When opened for writing, the file will be created if it doesn't\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1514 exist, and truncated otherwise. If the buffering argument is given, 0 means\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1515 unbuffered, and larger numbers specify the buffer size. If compresslevel\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1516 is given, must be a number between 1 and 9.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1517 ")
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1518 PyDoc_STR(
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1519 "\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1520 Add a 'U' to mode to open the file for input with universal newline\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1521 support. Any line ending in the input file will be seen as a '\\n' in\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1522 Python. Also, a file so opened gains the attribute 'newlines'; the value\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1523 for this attribute is one of None (no newline read yet), '\\r', '\\n',\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1524 '\\r\\n' or a tuple containing all the newline types seen. Universal\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1525 newlines are available only when reading.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1526 ")
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1527 ;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1528
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1529 static PyTypeObject BZ2File_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 41154
diff changeset
1530 PyVarObject_HEAD_INIT(NULL, 0)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1531 "bz2.BZ2File", /*tp_name*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1532 sizeof(BZ2FileObject), /*tp_basicsize*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1533 0, /*tp_itemsize*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1534 (destructor)BZ2File_dealloc, /*tp_dealloc*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1535 0, /*tp_print*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1536 0, /*tp_getattr*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1537 0, /*tp_setattr*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1538 0, /*tp_compare*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1539 0, /*tp_repr*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1540 0, /*tp_as_number*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1541 0, /*tp_as_sequence*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1542 0, /*tp_as_mapping*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1543 0, /*tp_hash*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1544 0, /*tp_call*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1545 0, /*tp_str*/
27104
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
1546 PyObject_GenericGetAttr,/*tp_getattro*/
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
1547 PyObject_GenericSetAttr,/*tp_setattro*/
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1548 0, /*tp_as_buffer*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1549 Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1550 BZ2File__doc__, /*tp_doc*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1551 0, /*tp_traverse*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1552 0, /*tp_clear*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1553 0, /*tp_richcompare*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1554 0, /*tp_weaklistoffset*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1555 (getiterfunc)BZ2File_getiter, /*tp_iter*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1556 (iternextfunc)BZ2File_iternext, /*tp_iternext*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1557 BZ2File_methods, /*tp_methods*/
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1558 BZ2File_members, /*tp_members*/
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1559 BZ2File_getset, /*tp_getset*/
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1560 0, /*tp_base*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1561 0, /*tp_dict*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1562 0, /*tp_descr_get*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1563 0, /*tp_descr_set*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1564 0, /*tp_dictoffset*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1565 (initproc)BZ2File_init, /*tp_init*/
27104
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
1566 PyType_GenericAlloc, /*tp_alloc*/
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1567 PyType_GenericNew, /*tp_new*/
27104
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
1568 _PyObject_Del, /*tp_free*/
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1569 0, /*tp_is_gc*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1570 };
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1571
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1572
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1573 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1574 /* Methods of BZ2Comp. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1575
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1576 PyDoc_STRVAR(BZ2Comp_compress__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1577 "compress(data) -> string\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1578 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1579 Provide more data to the compressor object. It will return chunks of\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1580 compressed data whenever possible. When you've finished providing data\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1581 to compress, call the flush() method to finish the compression process,\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1582 and return what is left in the internal buffers.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1583 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1584
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1585 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1586 BZ2Comp_compress(BZ2CompObject *self, PyObject *args)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1587 {
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1588 Py_buffer pdata;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1589 char *data;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1590 int datasize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1591 int bufsize = SMALLCHUNK;
28437
871da703e4c0 Rename LONG_LONG to PY_LONG_LONG. Fixes #710285.
Martin v. Löwis <martin@v.loewis.de>
parents: 27819
diff changeset
1592 PY_LONG_LONG totalout;
26045
6ee2f9b4bf5c * bzmodule.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26043
diff changeset
1593 PyObject *ret = NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1594 bz_stream *bzs = &self->bzs;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1595 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1596
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1597 if (!PyArg_ParseTuple(args, "s*:compress", &pdata))
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1598 return NULL;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1599 data = pdata.buf;
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1600 datasize = pdata.len;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1601
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1602 if (datasize == 0) {
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1603 PyBuffer_Release(&pdata);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1604 return PyString_FromString("");
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1605 }
31524
3d927e1c78c8 - Fixed #853061: allow BZ2Compressor.compress() to receive an empty string
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 31471
diff changeset
1606
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1607 ACQUIRE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1608 if (!self->running) {
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1609 PyErr_SetString(PyExc_ValueError,
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1610 "this object was already flushed");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1611 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1612 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1613
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1614 ret = PyString_FromStringAndSize(NULL, bufsize);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1615 if (!ret)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1616 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1617
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1618 bzs->next_in = data;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1619 bzs->avail_in = datasize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1620 bzs->next_out = BUF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1621 bzs->avail_out = bufsize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1622
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1623 totalout = BZS_TOTAL_OUT(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1624
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1625 for (;;) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1626 Py_BEGIN_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1627 bzerror = BZ2_bzCompress(bzs, BZ_RUN);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1628 Py_END_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1629 if (bzerror != BZ_RUN_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1630 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1631 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1632 }
41154
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
1633 if (bzs->avail_in == 0)
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
1634 break; /* no more input data */
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1635 if (bzs->avail_out == 0) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1636 bufsize = Util_NewBufferSize(bufsize);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1637 if (_PyString_Resize(&ret, bufsize) < 0) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1638 BZ2_bzCompressEnd(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1639 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1640 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1641 bzs->next_out = BUF(ret) + (BZS_TOTAL_OUT(bzs)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1642 - totalout);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1643 bzs->avail_out = bufsize - (bzs->next_out - BUF(ret));
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1644 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1645 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1646
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1647 _PyString_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout));
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1648
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1649 RELEASE_LOCK(self);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1650 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1651 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1652
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1653 error:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1654 RELEASE_LOCK(self);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1655 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1656 Py_XDECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1657 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1658 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1659
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1660 PyDoc_STRVAR(BZ2Comp_flush__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1661 "flush() -> string\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1662 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1663 Finish the compression process and return what is left in internal buffers.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1664 You must not use the compressor object after calling this method.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1665 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1666
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1667 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1668 BZ2Comp_flush(BZ2CompObject *self)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1669 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1670 int bufsize = SMALLCHUNK;
26045
6ee2f9b4bf5c * bzmodule.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26043
diff changeset
1671 PyObject *ret = NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1672 bz_stream *bzs = &self->bzs;
28437
871da703e4c0 Rename LONG_LONG to PY_LONG_LONG. Fixes #710285.
Martin v. Löwis <martin@v.loewis.de>
parents: 27819
diff changeset
1673 PY_LONG_LONG totalout;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1674 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1675
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1676 ACQUIRE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1677 if (!self->running) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1678 PyErr_SetString(PyExc_ValueError, "object was already "
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1679 "flushed");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1680 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1681 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1682 self->running = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1683
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1684 ret = PyString_FromStringAndSize(NULL, bufsize);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1685 if (!ret)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1686 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1687
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1688 bzs->next_out = BUF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1689 bzs->avail_out = bufsize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1690
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1691 totalout = BZS_TOTAL_OUT(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1692
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1693 for (;;) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1694 Py_BEGIN_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1695 bzerror = BZ2_bzCompress(bzs, BZ_FINISH);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1696 Py_END_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1697 if (bzerror == BZ_STREAM_END) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1698 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1699 } else if (bzerror != BZ_FINISH_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1700 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1701 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1702 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1703 if (bzs->avail_out == 0) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1704 bufsize = Util_NewBufferSize(bufsize);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1705 if (_PyString_Resize(&ret, bufsize) < 0)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1706 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1707 bzs->next_out = BUF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1708 bzs->next_out = BUF(ret) + (BZS_TOTAL_OUT(bzs)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1709 - totalout);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1710 bzs->avail_out = bufsize - (bzs->next_out - BUF(ret));
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1711 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1712 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1713
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1714 if (bzs->avail_out != 0)
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1715 _PyString_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout));
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1716
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1717 RELEASE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1718 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1719
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1720 error:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1721 RELEASE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1722 Py_XDECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1723 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1724 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1725
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1726 static PyMethodDef BZ2Comp_methods[] = {
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1727 {"compress", (PyCFunction)BZ2Comp_compress, METH_VARARGS,
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1728 BZ2Comp_compress__doc__},
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1729 {"flush", (PyCFunction)BZ2Comp_flush, METH_NOARGS,
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1730 BZ2Comp_flush__doc__},
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1731 {NULL, NULL} /* sentinel */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1732 };
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1733
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1734
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1735 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1736 /* Slot definitions for BZ2Comp_Type. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1737
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1738 static int
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1739 BZ2Comp_init(BZ2CompObject *self, PyObject *args, PyObject *kwargs)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1740 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1741 int compresslevel = 9;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1742 int bzerror;
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36577
diff changeset
1743 static char *kwlist[] = {"compresslevel", 0};
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1744
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1745 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:BZ2Compressor",
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1746 kwlist, &compresslevel))
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1747 return -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1748
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1749 if (compresslevel < 1 || compresslevel > 9) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1750 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1751 "compresslevel must be between 1 and 9");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1752 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1753 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1754
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1755 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1756 self->lock = PyThread_allocate_lock();
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1757 if (!self->lock) {
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1758 PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1759 goto error;
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1760 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1761 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1762
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1763 memset(&self->bzs, 0, sizeof(bz_stream));
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1764 bzerror = BZ2_bzCompressInit(&self->bzs, compresslevel, 0, 0);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1765 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1766 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1767 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1768 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1769
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1770 self->running = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1771
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1772 return 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1773 error:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1774 #ifdef WITH_THREAD
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1775 if (self->lock) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1776 PyThread_free_lock(self->lock);
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1777 self->lock = NULL;
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1778 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1779 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1780 return -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1781 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1782
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1783 static void
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1784 BZ2Comp_dealloc(BZ2CompObject *self)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1785 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1786 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1787 if (self->lock)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1788 PyThread_free_lock(self->lock);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1789 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1790 BZ2_bzCompressEnd(&self->bzs);
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43379
diff changeset
1791 Py_TYPE(self)->tp_free((PyObject *)self);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1792 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1793
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1794
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1795 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1796 /* BZ2Comp_Type definition. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1797
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1798 PyDoc_STRVAR(BZ2Comp__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1799 "BZ2Compressor([compresslevel=9]) -> compressor object\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1800 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1801 Create a new compressor object. This object may be used to compress\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1802 data sequentially. If you want to compress data in one shot, use the\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1803 compress() function instead. The compresslevel parameter, if given,\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1804 must be a number between 1 and 9.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1805 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1806
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
1807 static PyTypeObject BZ2Comp_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 41154
diff changeset
1808 PyVarObject_HEAD_INIT(NULL, 0)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1809 "bz2.BZ2Compressor", /*tp_name*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1810 sizeof(BZ2CompObject), /*tp_basicsize*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1811 0, /*tp_itemsize*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1812 (destructor)BZ2Comp_dealloc, /*tp_dealloc*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1813 0, /*tp_print*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1814 0, /*tp_getattr*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1815 0, /*tp_setattr*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1816 0, /*tp_compare*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1817 0, /*tp_repr*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1818 0, /*tp_as_number*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1819 0, /*tp_as_sequence*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1820 0, /*tp_as_mapping*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1821 0, /*tp_hash*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1822 0, /*tp_call*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1823 0, /*tp_str*/
27104
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
1824 PyObject_GenericGetAttr,/*tp_getattro*/
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
1825 PyObject_GenericSetAttr,/*tp_setattro*/
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1826 0, /*tp_as_buffer*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1827 Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1828 BZ2Comp__doc__, /*tp_doc*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1829 0, /*tp_traverse*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1830 0, /*tp_clear*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1831 0, /*tp_richcompare*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1832 0, /*tp_weaklistoffset*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1833 0, /*tp_iter*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1834 0, /*tp_iternext*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1835 BZ2Comp_methods, /*tp_methods*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1836 0, /*tp_members*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1837 0, /*tp_getset*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1838 0, /*tp_base*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1839 0, /*tp_dict*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1840 0, /*tp_descr_get*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1841 0, /*tp_descr_set*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1842 0, /*tp_dictoffset*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1843 (initproc)BZ2Comp_init, /*tp_init*/
27104
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
1844 PyType_GenericAlloc, /*tp_alloc*/
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
1845 PyType_GenericNew, /*tp_new*/
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
1846 _PyObject_Del, /*tp_free*/
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1847 0, /*tp_is_gc*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1848 };
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1849
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1850
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1851 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1852 /* Members of BZ2Decomp. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1853
27819
ee10d7e7f818 Unparenting BZ2File, as discussed in SF patch #661796.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 27104
diff changeset
1854 #undef OFF
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1855 #define OFF(x) offsetof(BZ2DecompObject, x)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1856
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1857 static PyMemberDef BZ2Decomp_members[] = {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1858 {"unused_data", T_OBJECT, OFF(unused_data), RO},
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1859 {NULL} /* Sentinel */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1860 };
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1861
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1862
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1863 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1864 /* Methods of BZ2Decomp. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1865
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1866 PyDoc_STRVAR(BZ2Decomp_decompress__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1867 "decompress(data) -> string\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1868 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1869 Provide more data to the decompressor object. It will return chunks\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1870 of decompressed data whenever possible. If you try to decompress data\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1871 after the end of stream is found, EOFError will be raised. If any data\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1872 was found after the end of stream, it'll be ignored and saved in\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1873 unused_data attribute.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1874 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1875
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1876 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1877 BZ2Decomp_decompress(BZ2DecompObject *self, PyObject *args)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1878 {
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1879 Py_buffer pdata;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1880 char *data;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1881 int datasize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1882 int bufsize = SMALLCHUNK;
28437
871da703e4c0 Rename LONG_LONG to PY_LONG_LONG. Fixes #710285.
Martin v. Löwis <martin@v.loewis.de>
parents: 27819
diff changeset
1883 PY_LONG_LONG totalout;
26043
9da026937fa5 Fix SF #633935, test_bz2 fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 26037
diff changeset
1884 PyObject *ret = NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1885 bz_stream *bzs = &self->bzs;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1886 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1887
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1888 if (!PyArg_ParseTuple(args, "s*:decompress", &pdata))
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1889 return NULL;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1890 data = pdata.buf;
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1891 datasize = pdata.len;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1892
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1893 ACQUIRE_LOCK(self);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1894 if (!self->running) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1895 PyErr_SetString(PyExc_EOFError, "end of stream was "
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1896 "already found");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1897 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1898 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1899
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1900 ret = PyString_FromStringAndSize(NULL, bufsize);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1901 if (!ret)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1902 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1903
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1904 bzs->next_in = data;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1905 bzs->avail_in = datasize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1906 bzs->next_out = BUF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1907 bzs->avail_out = bufsize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1908
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1909 totalout = BZS_TOTAL_OUT(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1910
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1911 for (;;) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1912 Py_BEGIN_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1913 bzerror = BZ2_bzDecompress(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1914 Py_END_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1915 if (bzerror == BZ_STREAM_END) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1916 if (bzs->avail_in != 0) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1917 Py_DECREF(self->unused_data);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1918 self->unused_data =
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1919 PyString_FromStringAndSize(bzs->next_in,
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1920 bzs->avail_in);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1921 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1922 self->running = 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1923 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1924 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1925 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1926 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1927 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1928 }
41154
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
1929 if (bzs->avail_in == 0)
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
1930 break; /* no more input data */
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1931 if (bzs->avail_out == 0) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1932 bufsize = Util_NewBufferSize(bufsize);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1933 if (_PyString_Resize(&ret, bufsize) < 0) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1934 BZ2_bzDecompressEnd(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1935 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1936 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1937 bzs->next_out = BUF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1938 bzs->next_out = BUF(ret) + (BZS_TOTAL_OUT(bzs)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1939 - totalout);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1940 bzs->avail_out = bufsize - (bzs->next_out - BUF(ret));
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1941 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1942 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1943
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1944 if (bzs->avail_out != 0)
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1945 _PyString_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout));
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1946
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1947 RELEASE_LOCK(self);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1948 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1949 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1950
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1951 error:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1952 RELEASE_LOCK(self);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
1953 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1954 Py_XDECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1955 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1956 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1957
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1958 static PyMethodDef BZ2Decomp_methods[] = {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1959 {"decompress", (PyCFunction)BZ2Decomp_decompress, METH_VARARGS, BZ2Decomp_decompress__doc__},
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1960 {NULL, NULL} /* sentinel */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1961 };
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1962
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1963
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1964 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1965 /* Slot definitions for BZ2Decomp_Type. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1966
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1967 static int
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1968 BZ2Decomp_init(BZ2DecompObject *self, PyObject *args, PyObject *kwargs)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1969 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1970 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1971
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1972 if (!PyArg_ParseTuple(args, ":BZ2Decompressor"))
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1973 return -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1974
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1975 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1976 self->lock = PyThread_allocate_lock();
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1977 if (!self->lock) {
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1978 PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1979 goto error;
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
1980 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1981 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1982
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
1983 self->unused_data = PyString_FromString("");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1984 if (!self->unused_data)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1985 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1986
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1987 memset(&self->bzs, 0, sizeof(bz_stream));
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1988 bzerror = BZ2_bzDecompressInit(&self->bzs, 0, 0);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1989 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1990 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1991 goto error;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1992 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1993
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1994 self->running = 1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1995
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1996 return 0;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1997
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1998 error:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
1999 #ifdef WITH_THREAD
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
2000 if (self->lock) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2001 PyThread_free_lock(self->lock);
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
2002 self->lock = NULL;
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
2003 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2004 #endif
39135
12e973bdfeee Fix more memory allocation issues found with failmalloc.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39043
diff changeset
2005 Py_CLEAR(self->unused_data);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2006 return -1;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2007 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2008
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2009 static void
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2010 BZ2Decomp_dealloc(BZ2DecompObject *self)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2011 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2012 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2013 if (self->lock)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2014 PyThread_free_lock(self->lock);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2015 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2016 Py_XDECREF(self->unused_data);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2017 BZ2_bzDecompressEnd(&self->bzs);
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43379
diff changeset
2018 Py_TYPE(self)->tp_free((PyObject *)self);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2019 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2020
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2021
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2022 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2023 /* BZ2Decomp_Type definition. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2024
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2025 PyDoc_STRVAR(BZ2Decomp__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2026 "BZ2Decompressor() -> decompressor object\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2027 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2028 Create a new decompressor object. This object may be used to decompress\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2029 data sequentially. If you want to decompress data in one shot, use the\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2030 decompress() function instead.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2031 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2032
26113
9ffea50e8330 * Modules/bz2module.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26045
diff changeset
2033 static PyTypeObject BZ2Decomp_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 41154
diff changeset
2034 PyVarObject_HEAD_INIT(NULL, 0)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2035 "bz2.BZ2Decompressor", /*tp_name*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2036 sizeof(BZ2DecompObject), /*tp_basicsize*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2037 0, /*tp_itemsize*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2038 (destructor)BZ2Decomp_dealloc, /*tp_dealloc*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2039 0, /*tp_print*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2040 0, /*tp_getattr*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2041 0, /*tp_setattr*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2042 0, /*tp_compare*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2043 0, /*tp_repr*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2044 0, /*tp_as_number*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2045 0, /*tp_as_sequence*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2046 0, /*tp_as_mapping*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2047 0, /*tp_hash*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2048 0, /*tp_call*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2049 0, /*tp_str*/
27104
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
2050 PyObject_GenericGetAttr,/*tp_getattro*/
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
2051 PyObject_GenericSetAttr,/*tp_setattro*/
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2052 0, /*tp_as_buffer*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2053 Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2054 BZ2Decomp__doc__, /*tp_doc*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2055 0, /*tp_traverse*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2056 0, /*tp_clear*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2057 0, /*tp_richcompare*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2058 0, /*tp_weaklistoffset*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2059 0, /*tp_iter*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2060 0, /*tp_iternext*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2061 BZ2Decomp_methods, /*tp_methods*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2062 BZ2Decomp_members, /*tp_members*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2063 0, /*tp_getset*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2064 0, /*tp_base*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2065 0, /*tp_dict*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2066 0, /*tp_descr_get*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2067 0, /*tp_descr_set*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2068 0, /*tp_dictoffset*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2069 (initproc)BZ2Decomp_init, /*tp_init*/
27104
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
2070 PyType_GenericAlloc, /*tp_alloc*/
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
2071 PyType_GenericNew, /*tp_new*/
2443c557cbc3 Patch #661760: Cygwin auto-import module patch
Jason Tishler <jason@tishler.net>
parents: 26541
diff changeset
2072 _PyObject_Del, /*tp_free*/
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2073 0, /*tp_is_gc*/
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2074 };
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2075
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2076
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2077 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2078 /* Module functions. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2079
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2080 PyDoc_STRVAR(bz2_compress__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2081 "compress(data [, compresslevel=9]) -> string\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2082 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2083 Compress data in one shot. If you want to compress data sequentially,\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2084 use an instance of BZ2Compressor instead. The compresslevel parameter, if\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2085 given, must be a number between 1 and 9.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2086 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2087
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2088 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2089 bz2_compress(PyObject *self, PyObject *args, PyObject *kwargs)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2090 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2091 int compresslevel=9;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2092 Py_buffer pdata;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2093 char *data;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2094 int datasize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2095 int bufsize;
26045
6ee2f9b4bf5c * bzmodule.c
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 26043
diff changeset
2096 PyObject *ret = NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2097 bz_stream _bzs;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2098 bz_stream *bzs = &_bzs;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2099 int bzerror;
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36577
diff changeset
2100 static char *kwlist[] = {"data", "compresslevel", 0};
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2101
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2102 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|i",
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2103 kwlist, &pdata,
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2104 &compresslevel))
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2105 return NULL;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2106 data = pdata.buf;
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2107 datasize = pdata.len;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2108
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2109 if (compresslevel < 1 || compresslevel > 9) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2110 PyErr_SetString(PyExc_ValueError,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2111 "compresslevel must be between 1 and 9");
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2112 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2113 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2114 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2115
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2116 /* Conforming to bz2 manual, this is large enough to fit compressed
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2117 * data in one shot. We will check it later anyway. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2118 bufsize = datasize + (datasize/100+1) + 600;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2119
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
2120 ret = PyString_FromStringAndSize(NULL, bufsize);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2121 if (!ret) {
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2122 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2123 return NULL;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2124 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2125
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2126 memset(bzs, 0, sizeof(bz_stream));
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2127
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2128 bzs->next_in = data;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2129 bzs->avail_in = datasize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2130 bzs->next_out = BUF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2131 bzs->avail_out = bufsize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2132
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2133 bzerror = BZ2_bzCompressInit(bzs, compresslevel, 0, 0);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2134 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2135 Util_CatchBZ2Error(bzerror);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2136 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2137 Py_DECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2138 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2139 }
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
2140
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2141 for (;;) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2142 Py_BEGIN_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2143 bzerror = BZ2_bzCompress(bzs, BZ_FINISH);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2144 Py_END_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2145 if (bzerror == BZ_STREAM_END) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2146 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2147 } else if (bzerror != BZ_FINISH_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2148 BZ2_bzCompressEnd(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2149 Util_CatchBZ2Error(bzerror);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2150 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2151 Py_DECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2152 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2153 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2154 if (bzs->avail_out == 0) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2155 bufsize = Util_NewBufferSize(bufsize);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
2156 if (_PyString_Resize(&ret, bufsize) < 0) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2157 BZ2_bzCompressEnd(bzs);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2158 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2159 Py_DECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2160 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2161 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2162 bzs->next_out = BUF(ret) + BZS_TOTAL_OUT(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2163 bzs->avail_out = bufsize - (bzs->next_out - BUF(ret));
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2164 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2165 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2166
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2167 if (bzs->avail_out != 0)
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
2168 _PyString_Resize(&ret, (Py_ssize_t)BZS_TOTAL_OUT(bzs));
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2169 BZ2_bzCompressEnd(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2170
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2171 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2172 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2173 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2174
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2175 PyDoc_STRVAR(bz2_decompress__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2176 "decompress(data) -> decompressed data\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2177 \n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2178 Decompress data in one shot. If you want to decompress data sequentially,\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2179 use an instance of BZ2Decompressor instead.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2180 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2181
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2182 static PyObject *
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2183 bz2_decompress(PyObject *self, PyObject *args)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2184 {
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2185 Py_buffer pdata;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2186 char *data;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2187 int datasize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2188 int bufsize = SMALLCHUNK;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2189 PyObject *ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2190 bz_stream _bzs;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2191 bz_stream *bzs = &_bzs;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2192 int bzerror;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2193
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2194 if (!PyArg_ParseTuple(args, "s*:decompress", &pdata))
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2195 return NULL;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2196 data = pdata.buf;
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2197 datasize = pdata.len;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2198
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2199 if (datasize == 0) {
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2200 PyBuffer_Release(&pdata);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
2201 return PyString_FromString("");
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2202 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2203
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
2204 ret = PyString_FromStringAndSize(NULL, bufsize);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2205 if (!ret) {
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2206 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2207 return NULL;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2208 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2209
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2210 memset(bzs, 0, sizeof(bz_stream));
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2211
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2212 bzs->next_in = data;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2213 bzs->avail_in = datasize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2214 bzs->next_out = BUF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2215 bzs->avail_out = bufsize;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2216
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2217 bzerror = BZ2_bzDecompressInit(bzs, 0, 0);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2218 if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2219 Util_CatchBZ2Error(bzerror);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2220 Py_DECREF(ret);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2221 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2222 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2223 }
26117
e9aebd4cf56c This couldn't compile on WIndows, due to hardcoded "long long". Repaired.
Tim Peters <tim.peters@gmail.com>
parents: 26113
diff changeset
2224
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2225 for (;;) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2226 Py_BEGIN_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2227 bzerror = BZ2_bzDecompress(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2228 Py_END_ALLOW_THREADS
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2229 if (bzerror == BZ_STREAM_END) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2230 break;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2231 } else if (bzerror != BZ_OK) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2232 BZ2_bzDecompressEnd(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2233 Util_CatchBZ2Error(bzerror);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2234 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2235 Py_DECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2236 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2237 }
41154
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
2238 if (bzs->avail_in == 0) {
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
2239 BZ2_bzDecompressEnd(bzs);
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
2240 PyErr_SetString(PyExc_ValueError,
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
2241 "couldn't find end of stream");
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2242 PyBuffer_Release(&pdata);
41154
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
2243 Py_DECREF(ret);
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
2244 return NULL;
a4e0c79015d8 Bug #1622896: fix a rare corner case where the bz2 module raised an
Georg Brandl <georg@python.org>
parents: 40467
diff changeset
2245 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2246 if (bzs->avail_out == 0) {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2247 bufsize = Util_NewBufferSize(bufsize);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
2248 if (_PyString_Resize(&ret, bufsize) < 0) {
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2249 BZ2_bzDecompressEnd(bzs);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2250 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2251 Py_DECREF(ret);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2252 return NULL;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2253 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2254 bzs->next_out = BUF(ret) + BZS_TOTAL_OUT(bzs);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2255 bzs->avail_out = bufsize - (bzs->next_out - BUF(ret));
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2256 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2257 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2258
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2259 if (bzs->avail_out != 0)
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
2260 _PyString_Resize(&ret, (Py_ssize_t)BZS_TOTAL_OUT(bzs));
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2261 BZ2_bzDecompressEnd(bzs);
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48201
diff changeset
2262 PyBuffer_Release(&pdata);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2263
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2264 return ret;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2265 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2266
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2267 static PyMethodDef bz2_methods[] = {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2268 {"compress", (PyCFunction) bz2_compress, METH_VARARGS|METH_KEYWORDS,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2269 bz2_compress__doc__},
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2270 {"decompress", (PyCFunction) bz2_decompress, METH_VARARGS,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2271 bz2_decompress__doc__},
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2272 {NULL, NULL} /* sentinel */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2273 };
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2274
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2275 /* ===================================================================== */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2276 /* Initialization function. */
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2277
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2278 PyDoc_STRVAR(bz2__doc__,
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2279 "The python bz2 module provides a comprehensive interface for\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2280 the bz2 compression library. It implements a complete file\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2281 interface, one shot (de)compression functions, and types for\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2282 sequential (de)compression.\n\
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2283 ");
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2284
29726
85e52ec85629 Use appropriate macros not the deprecated DL_IMPORT/DL_EXPORT macros
Neal Norwitz <nnorwitz@gmail.com>
parents: 28949
diff changeset
2285 PyMODINIT_FUNC
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2286 initbz2(void)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2287 {
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2288 PyObject *m;
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2289
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43379
diff changeset
2290 Py_TYPE(&BZ2File_Type) = &PyType_Type;
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43379
diff changeset
2291 Py_TYPE(&BZ2Comp_Type) = &PyType_Type;
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43379
diff changeset
2292 Py_TYPE(&BZ2Decomp_Type) = &PyType_Type;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2293
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2294 m = Py_InitModule3("bz2", bz2_methods, bz2__doc__);
36324
1af7f719ed28 Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36315
diff changeset
2295 if (m == NULL)
1af7f719ed28 Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36315
diff changeset
2296 return;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2297
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
2298 PyModule_AddObject(m, "__author__", PyString_FromString(__author__));
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2299
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2300 Py_INCREF(&BZ2File_Type);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2301 PyModule_AddObject(m, "BZ2File", (PyObject *)&BZ2File_Type);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2302
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2303 Py_INCREF(&BZ2Comp_Type);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2304 PyModule_AddObject(m, "BZ2Compressor", (PyObject *)&BZ2Comp_Type);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2305
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2306 Py_INCREF(&BZ2Decomp_Type);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2307 PyModule_AddObject(m, "BZ2Decompressor", (PyObject *)&BZ2Decomp_Type);
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2308 }