128 assert(Buffer !=
NULL);
135 if (destbuf ==
NULL || slen < 1) {
146 int len = (slen < Counter) ? slen : Counter;
148 memmove(destbuf, &Buffer[BlockHeader.UncompCount-Counter], len);
150 memmove(destbuf, &Buffer2[(BlockHeader.CompCount+
sizeof(BlockHeader))-Counter], len);
152 destbuf = ((
char *)destbuf) + len;
157 if (slen == 0)
break;
160 int incount =
Straw::Get(&BlockHeader,
sizeof(BlockHeader));
161 if (incount !=
sizeof(BlockHeader))
break;
163 char *staging_buffer =
new char [BlockHeader.CompCount];
164 incount =
Straw::Get(staging_buffer, BlockHeader.CompCount);
165 if (incount != BlockHeader.CompCount)
break;
166 unsigned int length =
sizeof(Buffer);
167 lzo1x_decompress ((
unsigned char*)staging_buffer, BlockHeader.CompCount, (
unsigned char*)Buffer, &length,
NULL);
168 delete [] staging_buffer;
169 Counter = BlockHeader.UncompCount;
171 BlockHeader.UncompCount = (
unsigned short)
Straw::Get(Buffer, BlockSize);
172 if (BlockHeader.UncompCount == 0)
break;
173 char *dictionary =
new char [64*1024];
174 unsigned int length =
sizeof (Buffer2) -
sizeof (BlockHeader);
175 lzo1x_1_compress ((
unsigned char*)Buffer, BlockHeader.UncompCount, (
unsigned char*)(&Buffer2[
sizeof(BlockHeader)]), &length, dictionary);
176 BlockHeader.CompCount = (
unsigned short)length;
177 delete [] dictionary;
178 memmove(Buffer2, &BlockHeader,
sizeof(BlockHeader));
179 Counter = BlockHeader.CompCount+
sizeof(BlockHeader);