66 BESDEBUG(
"bes",
"BESUncompress3Z::uncompress - src=" << src.c_str() << endl );
68 srcFile = open(src.c_str(), O_RDONLY);
71 string err =
"Unable to open the compressed file " + src +
": ";
72 char *serr = strerror(my_errno);
77 err.append(
"unknown error occurred");
86 BESDEBUG(
"bes",
"BESUncompress3Z::uncompress - start decompress" << endl);
88#define FIRSTBYTE (unsigned char)'\037'
89#define SECONDBYTE (unsigned char)'\235'
92#define BLOCK_MODE 0x80
93#define MAXCODE(n) (1L << (n))
98#define HSIZE (1<<HBITS)
99#define HMASK (HSIZE-1)
101#define de_stack ((unsigned char *)&(htab[HSIZE-1]))
102#define BYTEORDER 0000
105 unsigned char htab[HSIZE * 4];
106 unsigned short codetab[HSIZE];
108 int block_mode = BLOCK_MODE;
110 unsigned char inbuf[BUFSIZ + 64];
111 unsigned char outbuf[BUFSIZ + 2048];
112 unsigned char *stackp;
130 BESDEBUG(
"bes",
"BESUncompress3Z::uncompress - read file" << endl);;
134 while (insize < 3 && (rsize = read(srcFile, inbuf + insize, BUFSIZ)) > 0) {
137 BESDEBUG(
"bes",
"BESUncompress3Z::uncompress - insize: " << insize << endl);;
142 if ((insize < 3) || (inbuf[0] != FIRSTBYTE) || (inbuf[1] != SECONDBYTE)) {
143 BESDEBUG(
"bes",
"BESUncompress3Z::uncompress - not a compress file" << endl);;
145 string err =
"Could not read file ";
152 string err = src.c_str();
153 err +=
": not in compressed format";
158 string err =
"unknown error";
167 maxbits = inbuf[2] & BIT_MASK;
168 block_mode = inbuf[2] & BLOCK_MODE;
169 maxmaxcode = MAXCODE(maxbits);
171 if (maxbits > BITS) {
172 string err = src.c_str();
173 err +=
": compressed with ";
175 err +=
" bits, can only handle";
181 maxcode = MAXCODE(n_bits = INIT_BITS) - 1;
182 bitmask = (1 << n_bits) - 1;
188 free_ent = ((block_mode) ? FIRST : 256);
190 BESDEBUG(
"bes",
"BESUncompress3Z::uncompress - entering loop" << endl);
192 memset(codetab, 0, 256);
194 for (code = 255; code >= 0; --code) {
195 ((
unsigned char *) (htab))[code] = (
unsigned char) code;
205 int e = insize - (o = (posbits >> 3));
207 for (i = 0; i < e; ++i)
208 inbuf[i] = inbuf[i + o];
214 if ((
unsigned int)insize <
sizeof(inbuf) - BUFSIZ) {
215 if ((rsize = read(srcFile, inbuf + insize, BUFSIZ)) < 0) {
216 string err =
"Could not read file ";
225 inbits = ((rsize > 0) ? (insize - insize % n_bits) << 3 : (insize << 3) - (n_bits - 1));
227 while (inbits > posbits) {
228 if (free_ent > maxcode) {
229 posbits = ((posbits - 1) + ((n_bits << 3) - (posbits - 1 + (n_bits << 3)) % (n_bits << 3)));
232 if (n_bits == maxbits)
233 maxcode = maxmaxcode;
235 maxcode = MAXCODE(n_bits) - 1;
237 bitmask = (1 << n_bits) - 1;
241 unsigned char*p = &inbuf[posbits >> 3];
243 code = ((((long) (p[0])) | ((long) (p[1]) << 8) | ((long) (p[2]) << 16)) >> (posbits & 0x7)) & bitmask;
249 string err =
"oldcode:-1 code: ";
251 err +=
" !!!! uncompress: corrupt input!!!";
255 outbuf[outpos++] = (
unsigned char) (finchar = (
int) (oldcode = code));
260 if (code == CLEAR && block_mode) {
261 memset(codetab, 0, 256);
262 free_ent = FIRST - 1;
263 posbits = ((posbits - 1) + ((n_bits << 3) - (posbits - 1 + (n_bits << 3)) % (n_bits << 3)));
264 maxcode = MAXCODE( n_bits = INIT_BITS ) - 1;
265 bitmask = (1 << n_bits) - 1;
273 if (code >= free_ent) {
274 if (code > free_ent) {
279 *--stackp = (
unsigned char) finchar;
284 while ((
unsigned long) code >= (
unsigned long) 256) {
285 *--stackp = htab[code];
286 code = codetab[code];
289 *--stackp = (
unsigned char) (finchar = htab[code]);
294 if (outpos + (i = (de_stack - stackp)) >= BUFSIZ) {
297 if (i > BUFSIZ - outpos) {
302 memcpy(outbuf + outpos, stackp, i);
306 if (outpos >= BUFSIZ) {
307 if (write(fd, outbuf, outpos) != outpos) {
308 string err =
"uncompress: write eror";
315 }
while ((i = (de_stack - stackp)) > 0);
318 memcpy(outbuf + outpos, stackp, i);
323 if ((code = free_ent) < maxmaxcode) {
324 codetab[code] = (
unsigned short) oldcode;
325 htab[code] = (
unsigned char) finchar;
335 if (outpos > 0 && write(fd, outbuf, outpos) != outpos) {
336 string err =
"uncompress: write eror";
343 BESDEBUG(
"bes",
"BESUncompress3Z::uncompress - end decompres" << endl);