112 #include <grass/config.h> 116 #error "GRASS requires libz to compile" 124 #include <grass/gis.h> 128 #define G_ZLIB_COMPRESSED_NO (unsigned char)'0' 129 #define G_ZLIB_COMPRESSED_YES (unsigned char)'1' 131 static void _init_zstruct(z_stream * z)
136 z->zalloc = (alloc_func) 0;
137 z->zfree = (free_func) 0;
138 z->opaque = (voidpf) 0;
141 int G_zlib_read(
int fd,
int rbytes,
unsigned char *dst,
int nbytes)
143 int bsize, nread,
err;
146 if (dst ==
NULL || nbytes < 0)
152 if (
NULL == (b = (
unsigned char *)
153 G_calloc(bsize,
sizeof(
unsigned char))))
159 err = read(fd, b + nread, bsize - nread);
162 }
while (err > 0 && nread < bsize);
165 if (nread < rbytes && err > 0) {
171 if (b[0] == G_ZLIB_COMPRESSED_NO) {
173 for (err = 0; err < nread - 1 && err < nbytes; err++)
174 dst[err] = b[err + 1];
179 else if (b[0] != G_ZLIB_COMPRESSED_YES) {
189 err = G_zlib_expand(b + 1, bsize - 1, dst, nbytes);
200 int G_zlib_write(
int fd,
const unsigned char *src,
int nbytes)
202 int dst_sz, nwritten,
err;
203 unsigned char *dst, compressed;
206 if (src ==
NULL || nbytes < 0)
210 if (
NULL == (dst = (
unsigned char *)
211 G_calloc(dst_sz,
sizeof(
unsigned char))))
215 err = G_zlib_compress(src, nbytes, dst, dst_sz);
221 if (err > 0 && err <= dst_sz) {
224 compressed = G_ZLIB_COMPRESSED_YES;
225 if (write(fd, &compressed, 1) != 1) {
231 err = write(fd, dst + nwritten, dst_sz - nwritten);
234 }
while (err > 0 && nwritten < dst_sz);
240 compressed = G_ZLIB_COMPRESSED_NO;
241 if (write(fd, &compressed, 1) != 1) {
247 err = write(fd, src + nwritten, nbytes - nwritten);
250 }
while (err > 0 && nwritten < nbytes);
266 int G_zlib_write_noCompress(
int fd,
const unsigned char *src,
int nbytes)
269 unsigned char compressed;
272 if (src ==
NULL || nbytes < 0)
276 compressed = G_ZLIB_COMPRESSED_NO;
277 if (write(fd, &compressed, 1) != 1)
283 err = write(fd, src + nwritten, nbytes - nwritten);
286 }
while (err > 0 && nwritten < nbytes);
288 if (err < 0 || nwritten != nbytes)
301 G_zlib_compress(
const unsigned char *src,
int src_sz,
unsigned char *dst,
304 int err, nbytes, buf_sz;
313 if (src_sz <= 0 || dst_sz <= 0)
317 buf_sz = (int)((
double)dst_sz * 1.01 + (double)12);
318 if (
NULL == (buf = (
unsigned char *)
319 G_calloc(buf_sz,
sizeof(
unsigned char))))
323 _init_zstruct(&c_stream);
326 c_stream.avail_in = src_sz;
327 c_stream.next_in = (
unsigned char *) src;
328 c_stream.avail_out = buf_sz;
329 c_stream.next_out = buf;
335 err = deflateInit(&c_stream,
346 err = deflate(&c_stream, Z_FINISH);
347 if (err != Z_STREAM_END) {
351 deflateEnd(&c_stream);
356 deflateEnd(&c_stream);
365 nbytes = buf_sz - c_stream.avail_out;
366 if (nbytes > dst_sz) {
368 deflateEnd(&c_stream);
372 for (err = 0; err < nbytes; err++)
376 deflateEnd(&c_stream);
382 G_zlib_expand(
const unsigned char *src,
int src_sz,
unsigned char *dst,
393 if (src_sz <= 0 || dst_sz <= 0)
397 _init_zstruct(&c_stream);
400 c_stream.avail_in = src_sz;
401 c_stream.next_in = (
unsigned char *)src;
402 c_stream.avail_out = dst_sz;
403 c_stream.next_out = dst;
406 err = inflateInit(&c_stream);
413 err = inflate(&c_stream, Z_FINISH);
418 nbytes = dst_sz - c_stream.avail_out;
423 if (!(err == Z_STREAM_END || err == Z_OK)) {
424 if (!(err == Z_BUF_ERROR && nbytes == dst_sz)) {
425 inflateEnd(&c_stream);
433 inflateEnd(&c_stream);
SYMBOL * err(FILE *fp, SYMBOL *s, char *msg)
void G_free(void *buf)
Free allocated memory.