Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
DeflateOutputStreamBuffer.cc
Go to the documentation of this file.
1// Copyright FreeHEP, 2005.
2
4
5/**
6 * @author Mark Donszelmann
7 * @version $Id: DeflateOutputStreamBuffer.cc,v 1.6 2005-06-02 21:28:45 duns Exp $
8 */
9namespace cheprep {
10
11 using namespace std;
12
13 unsigned long DeflateOutputStreamBuffer::crctable[] = {
14 0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
15 0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
16 0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
17 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,
18 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
19 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,
20 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,
21 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,
22 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,
23 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
24 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,
25 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,
26 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,
27 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,
28 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
29 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,
30 0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,
31 0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,
32 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,
33 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
34 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,
35 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,
36 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,
37 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,
38 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
39 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,
40 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,
41 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,
42 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,
43 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
44 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,
45 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,
46 0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,
47 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,
48 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
49 0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,
50 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,
51 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,
52 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,
53 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
54 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,
55 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,
56 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,
57 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,
58 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
59 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,
60 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,
61 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,
62 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,
63 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
64 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,
65 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,
66 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,
67 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,
68 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
69 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,
70 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,
71 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,
72 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,
73 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
74 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,
75 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,
76 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,
77 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL
78 };
79
81 : buffer(aBuffer)
82 , crc(0)
83 , size(0)
84#ifndef CHEPREP_NO_ZLIB
85 , zStreamOpen(false)
86 , in(inSize)
87 , out(outSize)
88#endif // CHEPREP_NO_ZLIB
89 {
90
91#ifndef CHEPREP_NO_ZLIB
92 zStream.zalloc = Z_NULL;
93 zStream.zfree = Z_NULL;
94 zStream.opaque = Z_NULL;
95#endif // CHEPREP_NO_ZLIB
96 }
97
98#ifndef CHEPREP_NO_ZLIB
100
101 if (compress) {
102 if (zStreamOpen) return;
103
104 zStream.next_in = reinterpret_cast<unsigned char *>(&(in[0]));
105 zStream.avail_in = 0 ;
106
107 zStream.next_out = reinterpret_cast<unsigned char *>(&(out[0]));
108 zStream.avail_out = out.size();
109
110 if (deflateInit2(&zStream, 6, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY ) != Z_OK) {
111 cerr << "ERROR: deflateInit2 failed" << endl;
112 } else {
113 zStreamOpen = true;
114 setp(&(in[0]), &(in[0])+inSize);
115 }
116 }
117#else
118 void DeflateOutputStreamBuffer::init(bool /*compress*/) {
119#endif // CHEPREP_NO_ZLIB
120
121 crc = 0;
122 size = 0;
123 }
124
126
127#ifndef CHEPREP_NO_ZLIB
128 if (zStreamOpen) {
129
130 overflow() ;
131
132 zStream.next_out = reinterpret_cast<unsigned char *>(&(out[0]));
133 zStream.avail_out = outSize;
134
135 int err = Z_OK ;
136 while ( err == Z_OK ) {
137 if (zStream.avail_out == 0) {
138 flushOut();
139 }
140 err = deflate(&zStream, Z_FINISH);
141 }
142
143 flushOut() ;
144
145 if (err != Z_STREAM_END) {
146 cerr << "ERROR: deflation failed" << endl;
147 }
148
149 if (deflateEnd(&zStream) != Z_OK) {
150 cerr << "ERROR: deflateEnd failed" << endl;
151 }
152
153 zStreamOpen = false ;
154 }
155#endif // CHEPREP_NO_ZLIB
156 }
157
159 }
160
161
162#ifndef CHEPREP_NO_ZLIB
163 #define DO1 crc = crctable[(crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
164 #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
165#endif // CHEPREP_NO_ZLIB
166
167
169
170#ifndef CHEPREP_NO_ZLIB
171 if (zStreamOpen) {
172 zStream.avail_in = pptr() - pbase() ;
173 zStream.next_in = reinterpret_cast<unsigned char *>(&(in[0]));
174
175 int len = zStream.avail_in;
176 unsigned char* buf = zStream.next_in;
177
178 crc = crc ^ 0xffffffffUL;
179 while (len >= 8) {
180 DO8;
181 len -= 8;
182 }
183 if (len) do {
184 DO1;
185 } while (--len);
186 crc = crc ^ 0xffffffffUL;
187
188 size += zStream.avail_in;
189
190 zStream.next_out = reinterpret_cast<unsigned char *>(&(out[0]));
191 zStream.avail_out = outSize ;
192
193 int err = Z_OK ;
194 while ((zStream.avail_in > 0 || zStream.avail_out == 0) && err == Z_OK) {
195 if (zStream.avail_out == 0 ) {
196 flushOut();
197 }
198 err = deflate(&zStream, Z_NO_FLUSH);
199 }
200
201 flushOut();
202
203 setp(&(in[0]), &(in[0]) + inSize);
204
205 if ((err != Z_OK) && (err != Z_STREAM_END)) {
206 cerr << "ERROR: deflation failed" << endl;
207 return EOF ;
208 }
209
210 if ( c != EOF ) {
211 *pptr() = c ;
212 pbump(1);
213 }
214
215 return 0 ;
216 } else {
217#endif // CHEPREP_NO_ZLIB
218 crc = crc ^ 0xffffffffUL;
219 crc = crctable[(crc ^ c) & 0xff] ^ (crc >> 8);
220 crc = crc ^ 0xffffffffUL;
221 size++;
222 return buffer->sputc((char)c);
223#ifndef CHEPREP_NO_ZLIB
224 }
225#endif // CHEPREP_NO_ZLIB
226 }
227
228
229#ifndef CHEPREP_NO_ZLIB
231 int deflatedCount = outSize - zStream.avail_out;
232 int byteCount = buffer->sputn(&(out[0]), deflatedCount);
233
234 zStream.next_out = reinterpret_cast<unsigned char *>(&(out[0]));
235 zStream.avail_out = outSize ;
236
237 return deflatedCount == byteCount ;
238 }
239#endif // CHEPREP_NO_ZLIB
240
241} // cheprep
#define DO1(buf, i)
Definition: adler32.cc:15
#define DO8(buf, i)
Definition: adler32.cc:18
int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
Definition: compress.cc:57
int ZEXPORT deflateEnd(z_streamp strm)
Definition: deflate.cc:670
int ZEXPORT deflate(z_streamp strm, int flush)
Definition: deflate.cc:496
uInt avail_in
Definition: zlib.h:84
Bytef * next_in
Definition: zlib.h:83
alloc_func zalloc
Definition: zlib.h:94
uInt avail_out
Definition: zlib.h:88
free_func zfree
Definition: zlib.h:95
voidpf opaque
Definition: zlib.h:96
Bytef * next_out
Definition: zlib.h:87
#define buffer
Definition: xmlparse.cc:611
#define MAX_WBITS
Definition: zconf.h:142
#define Z_DEFLATED
Definition: zlib.h:177
#define Z_DEFAULT_STRATEGY
Definition: zlib.h:169
#define deflateInit2(strm, level, method, windowBits, memLevel, strategy)
Definition: zlib.h:1178
#define Z_STREAM_END
Definition: zlib.h:148
#define Z_FINISH
Definition: zlib.h:143
#define Z_OK
Definition: zlib.h:147
#define Z_NO_FLUSH
Definition: zlib.h:139
#define Z_NULL
Definition: zlib.h:180