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