annotate Modules/_bz2module.c @ 86127:a3d09c19bb93

merge with 3.3
author Georg Brandl <georg@python.org>
date Sun, 06 Oct 2013 19:24:00 +0200
parents 12f26c356611
children b9df25608ad0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
1 /* _bz2 - Low-level Python interface to libbzip2. */
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
2
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
3 #define PY_SSIZE_T_CLEAN
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
4
26365
d1d8959b138a Include Python.h first.
Martin v. Löwis <martin@v.loewis.de>
parents: 26123
diff changeset
5 #include "Python.h"
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
6 #include "structmember.h"
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 #ifdef WITH_THREAD
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
9 #include "pythread.h"
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
10 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
11
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
12 #include <bzlib.h>
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
13 #include <stdio.h>
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
14
28861
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
15
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
16 #ifndef BZ_CONFIG_ERROR
28861
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
17 #define BZ2_bzCompress bzCompress
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
18 #define BZ2_bzCompressInit bzCompressInit
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
19 #define BZ2_bzCompressEnd bzCompressEnd
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
20 #define BZ2_bzDecompress bzDecompress
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
21 #define BZ2_bzDecompressInit bzDecompressInit
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
22 #define BZ2_bzDecompressEnd bzDecompressEnd
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
23 #endif /* ! BZ_CONFIG_ERROR */
28861
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
24
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
25
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
26 #ifdef WITH_THREAD
56853
86531de75894 Merged revisions 75820 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 51270
diff changeset
27 #define ACQUIRE_LOCK(obj) do { \
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
28 if (!PyThread_acquire_lock((obj)->lock, 0)) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
29 Py_BEGIN_ALLOW_THREADS \
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
30 PyThread_acquire_lock((obj)->lock, 1); \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
31 Py_END_ALLOW_THREADS \
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
32 } } while (0)
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
33 #define RELEASE_LOCK(obj) PyThread_release_lock((obj)->lock)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
34 #else
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
35 #define ACQUIRE_LOCK(obj)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
36 #define RELEASE_LOCK(obj)
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
37 #endif
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
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
40 typedef struct {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
41 PyObject_HEAD
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
42 bz_stream bzs;
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
43 int flushed;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
44 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
45 PyThread_type_lock lock;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
46 #endif
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
47 } BZ2Compressor;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
48
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
49 typedef struct {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
50 PyObject_HEAD
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
51 bz_stream bzs;
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
52 char eof; /* T_BOOL expects a char */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
53 PyObject *unused_data;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
54 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
55 PyThread_type_lock lock;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
56 #endif
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
57 } BZ2Decompressor;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
58
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
59
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
60 /* Helper functions. */
63457
3c0ffe39557d Merged revisions 83440 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61467
diff changeset
61
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
62 static int
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
63 catch_bz2_error(int bzerror)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
64 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
65 switch(bzerror) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
66 case BZ_OK:
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
67 case BZ_RUN_OK:
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
68 case BZ_FLUSH_OK:
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
69 case BZ_FINISH_OK:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
70 case BZ_STREAM_END:
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
71 return 0;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
72
28861
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
73 #ifdef BZ_CONFIG_ERROR
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
74 case BZ_CONFIG_ERROR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
75 PyErr_SetString(PyExc_SystemError,
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
76 "libbzip2 was not compiled correctly");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
77 return 1;
28861
64230ee8eea5 Applying patch by Neal Norwitz:
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 28437
diff changeset
78 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
79 case BZ_PARAM_ERROR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
80 PyErr_SetString(PyExc_ValueError,
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
81 "Internal error - "
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
82 "invalid parameters passed to libbzip2");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
83 return 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
84 case BZ_MEM_ERROR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
85 PyErr_NoMemory();
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
86 return 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
87 case BZ_DATA_ERROR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
88 case BZ_DATA_ERROR_MAGIC:
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
89 PyErr_SetString(PyExc_IOError, "Invalid data stream");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
90 return 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
91 case BZ_IO_ERROR:
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
92 PyErr_SetString(PyExc_IOError, "Unknown I/O error");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
93 return 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
94 case BZ_UNEXPECTED_EOF:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
95 PyErr_SetString(PyExc_EOFError,
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
96 "Compressed file ended before the logical "
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
97 "end-of-stream was detected");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
98 return 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
99 case BZ_SEQUENCE_ERROR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
100 PyErr_SetString(PyExc_RuntimeError,
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
101 "Internal error - "
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
102 "Invalid sequence of commands sent to libbzip2");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
103 return 1;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
104 default:
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
105 PyErr_Format(PyExc_IOError,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
106 "Unrecognized error from libbzip2: %d", bzerror);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
107 return 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
108 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
109 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
110
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
111 #if BUFSIZ < 8192
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
112 #define SMALLCHUNK 8192
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
113 #else
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
114 #define SMALLCHUNK BUFSIZ
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
115 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
116
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
117 static int
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
118 grow_buffer(PyObject **buf)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
119 {
72907
d18c80a8c119 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 68257
diff changeset
120 /* Expand the buffer by an amount proportional to the current size,
d18c80a8c119 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 68257
diff changeset
121 giving us amortized linear-time behavior. Use a less-than-double
d18c80a8c119 Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 68257
diff changeset
122 growth factor to avoid excessive allocation. */
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
123 size_t size = PyBytes_GET_SIZE(*buf);
79879
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
124 size_t new_size = size + (size >> 3) + 6;
79878
ebb8c7d79f52 Issue #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72907
diff changeset
125 if (new_size > size) {
ebb8c7d79f52 Issue #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72907
diff changeset
126 return _PyBytes_Resize(buf, new_size);
ebb8c7d79f52 Issue #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72907
diff changeset
127 } else { /* overflow */
ebb8c7d79f52 Issue #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72907
diff changeset
128 PyErr_SetString(PyExc_OverflowError,
ebb8c7d79f52 Issue #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72907
diff changeset
129 "Unable to allocate buffer - output too large");
ebb8c7d79f52 Issue #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72907
diff changeset
130 return -1;
ebb8c7d79f52 Issue #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72907
diff changeset
131 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
132 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
133
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
134
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
135 /* BZ2Compressor class. */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
136
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
137 static PyObject *
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
138 compress(BZ2Compressor *c, char *data, size_t len, int action)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
139 {
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
140 size_t data_size = 0;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
141 PyObject *result;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
142
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
143 result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
144 if (result == NULL)
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
145 return NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
146
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
147 c->bzs.next_in = data;
81254
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
148 c->bzs.avail_in = 0;
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
149 c->bzs.next_out = PyBytes_AS_STRING(result);
84025
46401ce03547 Issue #9566: Fix compiler warning on Windows 64-bit in _bz2module.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84022
diff changeset
150 c->bzs.avail_out = SMALLCHUNK;
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
151 for (;;) {
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
152 char *this_out;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
153 int bzerror;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
154
81254
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
155 /* On a 64-bit system, len might not fit in avail_in (an unsigned int).
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
156 Do compression in chunks of no more than UINT_MAX bytes each. */
69275
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
157 if (c->bzs.avail_in == 0 && len > 0) {
84025
46401ce03547 Issue #9566: Fix compiler warning on Windows 64-bit in _bz2module.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84022
diff changeset
158 c->bzs.avail_in = (unsigned int)Py_MIN(len, UINT_MAX);
69275
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
159 len -= c->bzs.avail_in;
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
160 }
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
161
81254
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
162 /* In regular compression mode, stop when input data is exhausted. */
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
163 if (action == BZ_RUN && c->bzs.avail_in == 0)
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
164 break;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
165
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
166 if (c->bzs.avail_out == 0) {
79879
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
167 size_t buffer_left = PyBytes_GET_SIZE(result) - data_size;
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
168 if (buffer_left == 0) {
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
169 if (grow_buffer(&result) < 0)
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
170 goto error;
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
171 c->bzs.next_out = PyBytes_AS_STRING(result) + data_size;
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
172 buffer_left = PyBytes_GET_SIZE(result) - data_size;
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
173 }
84025
46401ce03547 Issue #9566: Fix compiler warning on Windows 64-bit in _bz2module.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84022
diff changeset
174 c->bzs.avail_out = (unsigned int)Py_MIN(buffer_left, UINT_MAX);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
175 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
176
81254
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
177 Py_BEGIN_ALLOW_THREADS
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
178 this_out = c->bzs.next_out;
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
179 bzerror = BZ2_bzCompress(&c->bzs, action);
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
180 data_size += c->bzs.next_out - this_out;
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
181 Py_END_ALLOW_THREADS
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
182 if (catch_bz2_error(bzerror))
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
183 goto error;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
184
81254
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
185 /* In flushing mode, stop when all buffered data has been flushed. */
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
186 if (action == BZ_FINISH && bzerror == BZ_STREAM_END)
011981143087 Issue #16828: Fix error incorrectly raised by bz2.compress('').
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 81253 79879
diff changeset
187 break;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
188 }
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
189 if (data_size != PyBytes_GET_SIZE(result))
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
190 if (_PyBytes_Resize(&result, data_size) < 0)
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
191 goto error;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
192 return result;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
193
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
194 error:
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
195 Py_XDECREF(result);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
196 return NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
197 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
198
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
199 PyDoc_STRVAR(BZ2Compressor_compress__doc__,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
200 "compress(data) -> bytes\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
201 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
202 "Provide data to the compressor object. Returns a chunk of\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
203 "compressed data if possible, or b'' otherwise.\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
204 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
205 "When you have finished providing data to the compressor, call the\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
206 "flush() method to finish the compression process.\n");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
207
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
208 static PyObject *
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
209 BZ2Compressor_compress(BZ2Compressor *self, PyObject *args)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
210 {
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
211 Py_buffer buffer;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
212 PyObject *result = NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
213
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
214 if (!PyArg_ParseTuple(args, "y*:compress", &buffer))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
215 return NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
216
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
217 ACQUIRE_LOCK(self);
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
218 if (self->flushed)
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
219 PyErr_SetString(PyExc_ValueError, "Compressor has been flushed");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
220 else
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
221 result = compress(self, buffer.buf, buffer.len, BZ_RUN);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
222 RELEASE_LOCK(self);
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
223 PyBuffer_Release(&buffer);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
224 return result;
26037
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
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
227 PyDoc_STRVAR(BZ2Compressor_flush__doc__,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
228 "flush() -> bytes\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
229 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
230 "Finish the compression process. Returns the compressed data left\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
231 "in internal buffers.\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
232 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
233 "The compressor object may not be used after this method is called.\n");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
234
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
235 static PyObject *
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
236 BZ2Compressor_flush(BZ2Compressor *self, PyObject *noargs)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
237 {
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
238 PyObject *result = NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
239
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
240 ACQUIRE_LOCK(self);
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
241 if (self->flushed)
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
242 PyErr_SetString(PyExc_ValueError, "Repeated call to flush()");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
243 else {
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
244 self->flushed = 1;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
245 result = compress(self, NULL, 0, BZ_FINISH);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
246 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
247 RELEASE_LOCK(self);
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
248 return result;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
249 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
250
84494
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
251 static void*
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
252 BZ2_Malloc(void* ctx, int items, int size)
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
253 {
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
254 if (items < 0 || size < 0)
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
255 return NULL;
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
256 if ((size_t)items > (size_t)PY_SSIZE_T_MAX / (size_t)size)
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
257 return NULL;
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
258 /* PyMem_Malloc() cannot be used: compress() and decompress()
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
259 release the GIL */
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
260 return PyMem_RawMalloc(items * size);
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
261 }
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
262
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
263 static void
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
264 BZ2_Free(void* ctx, void *ptr)
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
265 {
84496
12f26c356611 Issue #18227: "Free" function of bz2, lzma and zlib modules has no return value (void)
Victor Stinner <victor.stinner@gmail.com>
parents: 84494
diff changeset
266 PyMem_RawFree(ptr);
84494
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
267 }
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
268
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
269 static int
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
270 BZ2Compressor_init(BZ2Compressor *self, PyObject *args, PyObject *kwargs)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
271 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
272 int compresslevel = 9;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
273 int bzerror;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
274
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
275 if (!PyArg_ParseTuple(args, "|i:BZ2Compressor", &compresslevel))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
276 return -1;
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
277 if (!(1 <= compresslevel && compresslevel <= 9)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
278 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
279 "compresslevel must be between 1 and 9");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
280 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
281 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
282
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
283 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
284 self->lock = PyThread_allocate_lock();
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
285 if (self->lock == NULL) {
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
286 PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
287 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
288 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
289 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
290
84494
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
291 self->bzs.opaque = NULL;
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
292 self->bzs.bzalloc = BZ2_Malloc;
a876d9d2e4fc Issue #18227: Use PyMem_RawAlloc() in bz2, lzma and zlib modules
Victor Stinner <victor.stinner@gmail.com>
parents: 84025
diff changeset
293 self->bzs.bzfree = BZ2_Free;
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
294 bzerror = BZ2_bzCompressInit(&self->bzs, compresslevel, 0, 0);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
295 if (catch_bz2_error(bzerror))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
296 goto error;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
297
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
298 return 0;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
299
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
300 error:
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
301 #ifdef WITH_THREAD
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
302 PyThread_free_lock(self->lock);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
303 self->lock = NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
304 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
305 return -1;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
306 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
307
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
308 static void
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
309 BZ2Compressor_dealloc(BZ2Compressor *self)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
310 {
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
311 BZ2_bzCompressEnd(&self->bzs);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
312 #ifdef WITH_THREAD
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
313 if (self->lock != NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
314 PyThread_free_lock(self->lock);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
315 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
316 Py_TYPE(self)->tp_free((PyObject *)self);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
317 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
318
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
319 static PyMethodDef BZ2Compressor_methods[] = {
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
320 {"compress", (PyCFunction)BZ2Compressor_compress, METH_VARARGS,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
321 BZ2Compressor_compress__doc__},
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
322 {"flush", (PyCFunction)BZ2Compressor_flush, METH_NOARGS,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
323 BZ2Compressor_flush__doc__},
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
324 {NULL}
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
325 };
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
326
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
327 PyDoc_STRVAR(BZ2Compressor__doc__,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
328 "BZ2Compressor(compresslevel=9)\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
329 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
330 "Create a compressor object for compressing data incrementally.\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
331 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
332 "compresslevel, if given, must be a number between 1 and 9.\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
333 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
334 "For one-shot compression, use the compress() function instead.\n");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
335
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
336 static PyTypeObject BZ2Compressor_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
337 PyVarObject_HEAD_INIT(NULL, 0)
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
338 "_bz2.BZ2Compressor", /* tp_name */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
339 sizeof(BZ2Compressor), /* tp_basicsize */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
340 0, /* tp_itemsize */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
341 (destructor)BZ2Compressor_dealloc, /* tp_dealloc */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
342 0, /* tp_print */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
343 0, /* tp_getattr */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
344 0, /* tp_setattr */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
345 0, /* tp_reserved */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
346 0, /* tp_repr */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
347 0, /* tp_as_number */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
348 0, /* tp_as_sequence */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
349 0, /* tp_as_mapping */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
350 0, /* tp_hash */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
351 0, /* tp_call */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
352 0, /* tp_str */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
353 0, /* tp_getattro */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
354 0, /* tp_setattro */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
355 0, /* tp_as_buffer */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
356 Py_TPFLAGS_DEFAULT, /* tp_flags */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
357 BZ2Compressor__doc__, /* tp_doc */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
358 0, /* tp_traverse */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
359 0, /* tp_clear */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
360 0, /* tp_richcompare */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
361 0, /* tp_weaklistoffset */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
362 0, /* tp_iter */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
363 0, /* tp_iternext */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
364 BZ2Compressor_methods, /* tp_methods */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
365 0, /* tp_members */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
366 0, /* tp_getset */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
367 0, /* tp_base */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
368 0, /* tp_dict */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
369 0, /* tp_descr_get */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
370 0, /* tp_descr_set */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
371 0, /* tp_dictoffset */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
372 (initproc)BZ2Compressor_init, /* tp_init */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
373 0, /* tp_alloc */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
374 PyType_GenericNew, /* tp_new */
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
375 };
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
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
378 /* BZ2Decompressor class. */
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
379
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
380 static PyObject *
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
381 decompress(BZ2Decompressor *d, char *data, size_t len)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
382 {
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
383 size_t data_size = 0;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
384 PyObject *result;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
385
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
386 result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
387 if (result == NULL)
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
388 return result;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
389 d->bzs.next_in = data;
69275
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
390 /* On a 64-bit system, len might not fit in avail_in (an unsigned int).
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
391 Do decompression in chunks of no more than UINT_MAX bytes each. */
84025
46401ce03547 Issue #9566: Fix compiler warning on Windows 64-bit in _bz2module.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84022
diff changeset
392 d->bzs.avail_in = (unsigned int)Py_MIN(len, UINT_MAX);
69275
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
393 len -= d->bzs.avail_in;
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
394 d->bzs.next_out = PyBytes_AS_STRING(result);
84025
46401ce03547 Issue #9566: Fix compiler warning on Windows 64-bit in _bz2module.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84022
diff changeset
395 d->bzs.avail_out = SMALLCHUNK;
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
396 for (;;) {
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
397 char *this_out;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
398 int bzerror;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
399
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
400 Py_BEGIN_ALLOW_THREADS
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
401 this_out = d->bzs.next_out;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
402 bzerror = BZ2_bzDecompress(&d->bzs);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
403 data_size += d->bzs.next_out - this_out;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
404 Py_END_ALLOW_THREADS
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
405 if (catch_bz2_error(bzerror))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
406 goto error;
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
407 if (bzerror == BZ_STREAM_END) {
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
408 d->eof = 1;
69275
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
409 len += d->bzs.avail_in;
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
410 if (len > 0) { /* Save leftover input to unused_data */
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
411 Py_CLEAR(d->unused_data);
69275
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
412 d->unused_data = PyBytes_FromStringAndSize(d->bzs.next_in, len);
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
413 if (d->unused_data == NULL)
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
414 goto error;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
415 }
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
416 break;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
417 }
69275
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
418 if (d->bzs.avail_in == 0) {
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
419 if (len == 0)
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
420 break;
84025
46401ce03547 Issue #9566: Fix compiler warning on Windows 64-bit in _bz2module.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84022
diff changeset
421 d->bzs.avail_in = (unsigned int)Py_MIN(len, UINT_MAX);
69275
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
422 len -= d->bzs.avail_in;
0010cc5f22d4 Fix 64-bit safety issue in BZ2Compressor and BZ2Decompressor.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 69112
diff changeset
423 }
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
424 if (d->bzs.avail_out == 0) {
79879
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
425 size_t buffer_left = PyBytes_GET_SIZE(result) - data_size;
79878
ebb8c7d79f52 Issue #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72907
diff changeset
426 if (buffer_left == 0) {
79879
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
427 if (grow_buffer(&result) < 0)
79878
ebb8c7d79f52 Issue #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 72907
diff changeset
428 goto error;
79879
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
429 d->bzs.next_out = PyBytes_AS_STRING(result) + data_size;
25fdf297c077 Merge #14398: Fix size truncation and overflow bugs in bz2 module.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents: 79878 72908
diff changeset
430 buffer_left = PyBytes_GET_SIZE(result) - data_size;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
431 }
84025
46401ce03547 Issue #9566: Fix compiler warning on Windows 64-bit in _bz2module.c
Victor Stinner <victor.stinner@gmail.com>
parents: 84022
diff changeset
432 d->bzs.avail_out = (unsigned int)Py_MIN(buffer_left, UINT_MAX);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
433 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
434 }
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
435 if (data_size != PyBytes_GET_SIZE(result))
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
436 if (_PyBytes_Resize(&result, data_size) < 0)
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
437 goto error;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
438 return result;
26037
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 error:
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
441 Py_XDECREF(result);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
442 return NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
443 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
444
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
445 PyDoc_STRVAR(BZ2Decompressor_decompress__doc__,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
446 "decompress(data) -> bytes\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
447 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
448 "Provide data to the decompressor object. Returns a chunk of\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
449 "decompressed data if possible, or b'' otherwise.\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
450 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
451 "Attempting to decompress data after the end of stream is reached\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
452 "raises an EOFError. Any data found after the end of the stream\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
453 "is ignored and saved in the unused_data attribute.\n");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
454
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
455 static PyObject *
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
456 BZ2Decompressor_decompress(BZ2Decompressor *self, PyObject *args)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
457 {
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
458 Py_buffer buffer;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
459 PyObject *result = NULL;
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
460
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
461 if (!PyArg_ParseTuple(args, "y*:decompress", &buffer))
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
462 return NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
463
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
464 ACQUIRE_LOCK(self);
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
465 if (self->eof)
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
466 PyErr_SetString(PyExc_EOFError, "End of stream already reached");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
467 else
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
468 result = decompress(self, buffer.buf, buffer.len);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
469 RELEASE_LOCK(self);
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
470 PyBuffer_Release(&buffer);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
471 return result;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
472 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
473
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
474 static int
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
475 BZ2Decompressor_init(BZ2Decompressor *self, PyObject *args, PyObject *kwargs)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
476 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
477 int bzerror;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
478
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
479 if (!PyArg_ParseTuple(args, ":BZ2Decompressor"))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
480 return -1;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
481
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
482 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
483 self->lock = PyThread_allocate_lock();
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
484 if (self->lock == NULL) {
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
485 PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
486 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
487 }
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
488 #endif
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
489
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
490 self->unused_data = PyBytes_FromStringAndSize("", 0);
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
491 if (self->unused_data == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
492 goto error;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
493
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
494 bzerror = BZ2_bzDecompressInit(&self->bzs, 0, 0);
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
495 if (catch_bz2_error(bzerror))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
496 goto error;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
497
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
498 return 0;
26037
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 error:
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
501 Py_CLEAR(self->unused_data);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
502 #ifdef WITH_THREAD
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
503 PyThread_free_lock(self->lock);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
504 self->lock = NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
505 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
506 return -1;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
507 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
508
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
509 static void
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
510 BZ2Decompressor_dealloc(BZ2Decompressor *self)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
511 {
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
512 BZ2_bzDecompressEnd(&self->bzs);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
513 Py_CLEAR(self->unused_data);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
514 #ifdef WITH_THREAD
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
515 if (self->lock != NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
516 PyThread_free_lock(self->lock);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
517 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
518 Py_TYPE(self)->tp_free((PyObject *)self);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
519 }
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
520
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
521 static PyMethodDef BZ2Decompressor_methods[] = {
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
522 {"decompress", (PyCFunction)BZ2Decompressor_decompress, METH_VARARGS,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
523 BZ2Decompressor_decompress__doc__},
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
524 {NULL}
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
525 };
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
526
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
527 PyDoc_STRVAR(BZ2Decompressor_eof__doc__,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
528 "True if the end-of-stream marker has been reached.");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
529
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
530 PyDoc_STRVAR(BZ2Decompressor_unused_data__doc__,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
531 "Data found after the end of the compressed stream.");
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
532
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
533 static PyMemberDef BZ2Decompressor_members[] = {
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
534 {"eof", T_BOOL, offsetof(BZ2Decompressor, eof),
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
535 READONLY, BZ2Decompressor_eof__doc__},
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
536 {"unused_data", T_OBJECT_EX, offsetof(BZ2Decompressor, unused_data),
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
537 READONLY, BZ2Decompressor_unused_data__doc__},
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
538 {NULL}
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
539 };
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
540
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
541 PyDoc_STRVAR(BZ2Decompressor__doc__,
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
542 "BZ2Decompressor()\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
543 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
544 "Create a decompressor object for decompressing data incrementally.\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
545 "\n"
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
546 "For one-shot decompression, use the decompress() function instead.\n");
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
547
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
548 static PyTypeObject BZ2Decompressor_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
549 PyVarObject_HEAD_INIT(NULL, 0)
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
550 "_bz2.BZ2Decompressor", /* tp_name */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
551 sizeof(BZ2Decompressor), /* tp_basicsize */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
552 0, /* tp_itemsize */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
553 (destructor)BZ2Decompressor_dealloc,/* tp_dealloc */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
554 0, /* tp_print */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
555 0, /* tp_getattr */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
556 0, /* tp_setattr */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
557 0, /* tp_reserved */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
558 0, /* tp_repr */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
559 0, /* tp_as_number */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
560 0, /* tp_as_sequence */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
561 0, /* tp_as_mapping */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
562 0, /* tp_hash */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
563 0, /* tp_call */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
564 0, /* tp_str */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
565 0, /* tp_getattro */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
566 0, /* tp_setattro */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
567 0, /* tp_as_buffer */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
568 Py_TPFLAGS_DEFAULT, /* tp_flags */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
569 BZ2Decompressor__doc__, /* tp_doc */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
570 0, /* tp_traverse */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
571 0, /* tp_clear */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
572 0, /* tp_richcompare */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
573 0, /* tp_weaklistoffset */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
574 0, /* tp_iter */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
575 0, /* tp_iternext */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
576 BZ2Decompressor_methods, /* tp_methods */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
577 BZ2Decompressor_members, /* tp_members */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
578 0, /* tp_getset */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
579 0, /* tp_base */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
580 0, /* tp_dict */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
581 0, /* tp_descr_get */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
582 0, /* tp_descr_set */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
583 0, /* tp_dictoffset */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
584 (initproc)BZ2Decompressor_init, /* tp_init */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
585 0, /* tp_alloc */
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
586 PyType_GenericNew, /* tp_new */
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
587 };
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
588
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
589
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
590 /* Module initialization. */
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
591
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
592 static struct PyModuleDef _bz2module = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
593 PyModuleDef_HEAD_INIT,
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
594 "_bz2",
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
595 NULL,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
596 -1,
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
597 NULL,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
598 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
599 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
600 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
601 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
602 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
603
29726
85e52ec85629 Use appropriate macros not the deprecated DL_IMPORT/DL_EXPORT macros
Neal Norwitz <nnorwitz@gmail.com>
parents: 28949
diff changeset
604 PyMODINIT_FUNC
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
605 PyInit__bz2(void)
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
606 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
607 PyObject *m;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
608
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
609 if (PyType_Ready(&BZ2Compressor_Type) < 0)
64911
51d8fffcd260 Merged revisions 84980 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63457
diff changeset
610 return NULL;
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
611 if (PyType_Ready(&BZ2Decompressor_Type) < 0)
64911
51d8fffcd260 Merged revisions 84980 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63457
diff changeset
612 return NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
613
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
614 m = PyModule_Create(&_bz2module);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
615 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
616 return NULL;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
617
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
618 Py_INCREF(&BZ2Compressor_Type);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
619 PyModule_AddObject(m, "BZ2Compressor", (PyObject *)&BZ2Compressor_Type);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
620
69112
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
621 Py_INCREF(&BZ2Decompressor_Type);
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
622 PyModule_AddObject(m, "BZ2Decompressor",
2cb07a46f4b5 Issue #5863: Rewrite BZ2File in pure Python, and allow it to accept
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
623 (PyObject *)&BZ2Decompressor_Type);
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
624
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60888
diff changeset
625 return m;
26037
521e89c4ff44 Patch implementing bz2 module.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
diff changeset
626 }