25 #if !defined(USE_MEMORY_NOWRAPPERS) && !defined(CPPPARSER) 28 do_zlib_alloc(voidpf opaque, uInt items, uInt size) {
29 return PANDA_MALLOC_ARRAY(items * size);
32 do_zlib_free(voidpf opaque, voidpf address) {
33 PANDA_FREE_ARRAY(address);
35 #endif // !USE_MEMORY_NOWRAPPERS 48 _buffer = (
char *)PANDA_MALLOC_ARRAY(4096);
49 char *ebuf = _buffer + 4096;
50 setg(_buffer, ebuf, ebuf);
55 setg(base(), ebuf(), ebuf());
68 PANDA_FREE_ARRAY(_buffer);
76 open_read(std::istream *source,
bool owns_source) {
78 _owns_source = owns_source;
80 _z_source.next_in = Z_NULL;
81 _z_source.avail_in = 0;
82 _z_source.next_out = Z_NULL;
83 _z_source.avail_out = 0;
84 #ifdef USE_MEMORY_NOWRAPPERS 85 _z_source.zalloc = Z_NULL;
86 _z_source.zfree = Z_NULL;
88 _z_source.zalloc = (alloc_func)&do_zlib_alloc;
89 _z_source.zfree = (free_func)&do_zlib_free;
91 _z_source.opaque = Z_NULL;
92 _z_source.msg = (
char *)
"no error message";
94 int result = inflateInit2(&_z_source, 32 + 15);
96 show_zlib_error(
"inflateInit2", result, _z_source);
99 thread_consider_yield();
107 if (_source !=
nullptr) {
109 int result = inflateEnd(&_z_source);
111 show_zlib_error(
"inflateEnd", result, _z_source);
113 thread_consider_yield();
117 _owns_source =
false;
127 open_write(std::ostream *dest,
bool owns_dest,
int compression_level) {
129 _owns_dest = owns_dest;
131 _z_dest.next_in = Z_NULL;
132 _z_dest.avail_in = 0;
133 _z_dest.next_out = Z_NULL;
134 _z_dest.avail_out = 0;
135 #ifdef USE_MEMORY_NOWRAPPERS 136 _z_dest.zalloc = Z_NULL;
137 _z_dest.zfree = Z_NULL;
139 _z_dest.zalloc = (alloc_func)&do_zlib_alloc;
140 _z_dest.zfree = (free_func)&do_zlib_free;
142 _z_dest.opaque = Z_NULL;
143 _z_dest.msg = (
char *)
"no error message";
145 int result = deflateInit(&_z_dest, compression_level);
147 show_zlib_error(
"deflateInit", result, _z_dest);
150 thread_consider_yield();
158 if (_dest !=
nullptr) {
159 size_t n = pptr() - pbase();
160 write_chars(pbase(), n, Z_FINISH);
163 int result = deflateEnd(&_z_dest);
165 show_zlib_error(
"deflateEnd", result, _z_dest);
167 thread_consider_yield();
181 streampos ZStreamBuf::
182 seekoff(streamoff off, ios_seekdir dir, ios_openmode which) {
183 if (which != ios::in) {
189 size_t n = egptr() - gptr();
190 streampos gpos = _z_source.total_out - n;
193 if ((dir == ios::cur && off == 0) ||
194 (dir == ios::beg && off == gpos)) {
198 if (off != 0 || dir != ios::beg) {
205 _source->seekg(0, ios::beg);
206 if (_source->tellg() == (streampos)0) {
207 _z_source.next_in = Z_NULL;
208 _z_source.avail_in = 0;
209 _z_source.next_out = Z_NULL;
210 _z_source.avail_out = 0;
211 int result = inflateReset(&_z_source);
213 show_zlib_error(
"inflateReset", result, _z_source);
225 streampos ZStreamBuf::
226 seekpos(streampos pos, ios_openmode which) {
227 return seekoff(pos, ios::beg, which);
236 size_t n = pptr() - pbase();
238 write_chars(pbase(), n, 0);
245 write_chars(&c, 1, 0);
257 if (_source !=
nullptr) {
258 size_t n = egptr() - gptr();
262 if (_dest !=
nullptr) {
263 size_t n = pptr() - pbase();
264 write_chars(pbase(), n, Z_SYNC_FLUSH);
279 if (gptr() >= egptr()) {
280 size_t buffer_size = egptr() - eback();
281 gbump(-(
int)buffer_size);
283 size_t num_bytes = buffer_size;
284 size_t read_count = read_chars(gptr(), buffer_size);
286 if (read_count != num_bytes) {
288 if (read_count == 0) {
294 nassertr(read_count < num_bytes, EOF);
295 size_t delta = num_bytes - read_count;
296 memmove(gptr() + delta, gptr(), read_count);
301 return (
unsigned char)*gptr();
309 read_chars(
char *start,
size_t length) {
310 _z_source.next_out = (Bytef *)start;
311 _z_source.avail_out = length;
313 bool eof = (_source->eof() || _source->fail());
316 while (_z_source.avail_out > 0) {
317 if (_z_source.avail_in == 0 && !eof) {
318 _source->read(decompress_buffer, decompress_buffer_size);
319 size_t read_count = _source->gcount();
320 eof = (read_count == 0 || _source->eof() || _source->fail());
322 _z_source.next_in = (Bytef *)decompress_buffer;
323 _z_source.avail_in = read_count;
325 int result = inflate(&_z_source, flush);
326 thread_consider_yield();
327 size_t bytes_read = length - _z_source.avail_out;
329 if (result == Z_STREAM_END) {
333 }
else if (result == Z_BUF_ERROR && flush == 0) {
339 }
else if (result < 0) {
340 show_zlib_error(
"inflate", result, _z_source);
353 write_chars(
const char *start,
size_t length,
int flush) {
354 static const size_t compress_buffer_size = 4096;
355 char compress_buffer[compress_buffer_size];
357 _z_dest.next_in = (Bytef *)(
char *)start;
358 _z_dest.avail_in = length;
360 _z_dest.next_out = (Bytef *)compress_buffer;
361 _z_dest.avail_out = compress_buffer_size;
363 int result = deflate(&_z_dest, flush);
364 if (result < 0 && result != Z_BUF_ERROR) {
365 show_zlib_error(
"deflate", result, _z_dest);
367 thread_consider_yield();
369 while (_z_dest.avail_in != 0) {
370 if (_z_dest.avail_out != compress_buffer_size) {
371 _dest->write(compress_buffer, compress_buffer_size - _z_dest.avail_out);
372 _z_dest.next_out = (Bytef *)compress_buffer;
373 _z_dest.avail_out = compress_buffer_size;
375 result = deflate(&_z_dest, flush);
377 show_zlib_error(
"deflate", result, _z_dest);
379 thread_consider_yield();
382 while (_z_dest.avail_out != compress_buffer_size) {
383 _dest->write(compress_buffer, compress_buffer_size - _z_dest.avail_out);
384 _z_dest.next_out = (Bytef *)compress_buffer;
385 _z_dest.avail_out = compress_buffer_size;
386 result = deflate(&_z_dest, flush);
387 if (result < 0 && result != Z_BUF_ERROR) {
388 show_zlib_error(
"deflate", result, _z_dest);
390 thread_consider_yield();
398 show_zlib_error(
const char *
function,
int error_code, z_stream &z) {
399 std::stringstream error_line;
402 <<
"zlib error in " <<
function <<
": ";
403 switch (error_code) {
405 error_line <<
"Z_OK";
408 error_line <<
"Z_STREAM_END";
411 error_line <<
"Z_NEED_DICT";
414 error_line <<
"Z_ERRNO";
417 error_line <<
"Z_STREAM_ERROR";
420 error_line <<
"Z_DATA_ERROR";
423 error_line <<
"Z_MEM_ERROR";
426 error_line <<
"Z_BUF_ERROR";
428 case Z_VERSION_ERROR:
429 error_line <<
"Z_VERSION_ERROR";
432 error_line << error_code;
434 if (z.msg !=
nullptr) {
439 express_cat.warning() << error_line.str() <<
"\n";
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.