⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gzio.cpp

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    /* Check the rest of the gzip header */    method = get_byte(s);    flags = get_byte(s);    if (method != Z_DEFLATED || (flags & RESERVED) != 0) {        s->z_err = Z_DATA_ERROR;        return;    }    /* Discard time, xflags and OS code: */    for (len = 0; len < 6; len++) (void)get_byte(s);    if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */        len  =  (uInt)get_byte(s);        len += ((uInt)get_byte(s))<<8;        /* len is garbage if EOF but the loop below will quit anyway */        while (len-- != 0 && get_byte(s) != EOF) ;    }    if ((flags & ORIG_NAME) != 0) { /* skip the original file name */        while ((c = get_byte(s)) != 0 && c != EOF) ;    }    if ((flags & COMMENT) != 0) {   /* skip the .gz file comment */        while ((c = get_byte(s)) != 0 && c != EOF) ;    }    if ((flags & HEAD_CRC) != 0) {  /* skip the header crc */        for (len = 0; len < 2; len++) (void)get_byte(s);    }    s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK;} /* =========================================================================== * Cleanup then free the given gz_stream. Return a zlib error code.   Try freeing in the reverse order of allocations. */local int destroy (gz_stream *s){    int err = Z_OK;    if (!s) return Z_STREAM_ERROR;    TRYFREE(s->msg);    if (s->stream.state != NULL) {        if (s->mode == 'w') {#ifdef NO_GZCOMPRESS            err = Z_STREAM_ERROR;#else            err = deflateEnd(&(s->stream));#endif        } else if (s->mode == 'r') {            err = inflateEnd(&(s->stream));        }    }    if (s->file != NULL && fclose(s->file)) {#ifdef ESPIPE        if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */#endif            err = Z_ERRNO;    }    if (s->z_err < 0) err = s->z_err;    TRYFREE(s->inbuf);    TRYFREE(s->outbuf);    TRYFREE(s->path);    TRYFREE(s);    return err;}/* ===========================================================================     Reads the given number of uncompressed bytes from the compressed file.   gzread returns the number of bytes actually read (0 for end of file).*/GZ_EXPORTint gzread (gzFile file, voidp buf, unsigned len){    gz_stream *s = (gz_stream*)file;    Bytef *start = (Bytef*)buf; /* starting point for crc computation */    Byte  *next_out; /* == stream.next_out but not forced far (for MSDOS) */    if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR;    if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1;    if (s->z_err == Z_STREAM_END) return 0;  /* EOF */    next_out = (Byte*)buf;    s->stream.next_out = (Bytef*)buf;    s->stream.avail_out = len;    if (s->stream.avail_out && s->back != EOF) {        *next_out++ = s->back;        s->stream.next_out++;        s->stream.avail_out--;        s->back = EOF;        s->out++;        start++;        if (s->last) {            s->z_err = Z_STREAM_END;            return 1;        }    }    while (s->stream.avail_out != 0) {        if (s->transparent) {            /* Copy first the lookahead bytes: */            uInt n = s->stream.avail_in;            if (n > s->stream.avail_out) n = s->stream.avail_out;            if (n > 0) {                zmemcpy(s->stream.next_out, s->stream.next_in, n);                next_out += n;                s->stream.next_out = next_out;                s->stream.next_in   += n;                s->stream.avail_out -= n;                s->stream.avail_in  -= n;            }            if (s->stream.avail_out > 0) {                s->stream.avail_out -=                    (uInt)fread(next_out, 1, s->stream.avail_out, s->file);            }            len -= s->stream.avail_out;            s->in  += len;            s->out += len;            if (len == 0) s->z_eof = 1;            return (int)len;        }        if (s->stream.avail_in == 0 && !s->z_eof) {            errno = 0;            s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file);            if (s->stream.avail_in == 0) {                s->z_eof = 1;                if (ferror(s->file)) {                    s->z_err = Z_ERRNO;                    break;                }            }            s->stream.next_in = s->inbuf;        }        s->in += s->stream.avail_in;        s->out += s->stream.avail_out;        s->z_err = inflate(&(s->stream), Z_NO_FLUSH);        s->in -= s->stream.avail_in;        s->out -= s->stream.avail_out;        if (s->z_err == Z_STREAM_END) {            /* Check CRC and original size */            s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));            start = s->stream.next_out;            if (getLong(s) != s->crc) {                s->z_err = Z_DATA_ERROR;            } else {                (void)getLong(s);                /* The uncompressed length returned by above getlong() may be                 * different from s->out in case of concatenated .gz files.                 * Check for such files:                 */                check_header(s);                if (s->z_err == Z_OK) {                    inflateReset(&(s->stream));                    s->crc = crc32(0L, Z_NULL, 0);                }            }        }        if (s->z_err != Z_OK || s->z_eof) break;    }    s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));    if (len == s->stream.avail_out &&        (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO))        return -1;    return (int)(len - s->stream.avail_out);}/* ===========================================================================      Reads one byte from the compressed file. gzgetc returns this byte   or -1 in case of end of file or error.*/int gzgetc(gzFile file){    unsigned char c;    return gzread(file, &c, 1) == 1 ? c : -1;}/* ===========================================================================      Push one byte back onto the stream.*/int gzungetc(int c, gzFile file){    gz_stream *s = (gz_stream*)file;    if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF;    s->back = c;    s->out--;    s->last = (s->z_err == Z_STREAM_END);    if (s->last) s->z_err = Z_OK;    s->z_eof = 0;    return c;}/* ===========================================================================      Reads bytes from the compressed file until len-1 characters are   read, or a newline character is read and transferred to buf, or an   end-of-file condition is encountered.  The string is then terminated   with a null character.      gzgets returns buf, or Z_NULL in case of error.      The current implementation is not optimized at all.*/char * gzgets(gzFile file, char *buf, int len){    char *b = buf;    if (buf == Z_NULL || len <= 0) return Z_NULL;    while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ;    *buf = '\0';    return b == buf && len > 0 ? Z_NULL : b;}#ifndef NO_GZCOMPRESS/* ===========================================================================     Writes the given number of uncompressed bytes into the compressed file.   gzwrite returns the number of bytes actually written (0 in case of error).*/int gzwrite (gzFile file, void *const buf, unsigned len){    gz_stream *s = (gz_stream*)file;    if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;    s->stream.next_in = (Bytef*)buf;    s->stream.avail_in = len;    while (s->stream.avail_in != 0) {        if (s->stream.avail_out == 0) {            s->stream.next_out = s->outbuf;            if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {                s->z_err = Z_ERRNO;                break;            }            s->stream.avail_out = Z_BUFSIZE;        }        s->in += s->stream.avail_in;        s->out += s->stream.avail_out;        s->z_err = deflate(&(s->stream), Z_NO_FLUSH);        s->in -= s->stream.avail_in;        s->out -= s->stream.avail_out;        if (s->z_err != Z_OK) break;    }    s->crc = crc32(s->crc, (const Bytef *)buf, len);    return (int)(len - s->stream.avail_in);}/* ===========================================================================     Converts, formats, and writes the args to the compressed file under   control of the format string, as in fprintf. gzprintf returns the number of   uncompressed bytes actually written (0 in case of error).*/#ifdef STDC#include <stdarg.h>int gzprintf (gzFile file, const char *format, /* args */ ...){    char buf[Z_PRINTF_BUFSIZE];    va_list va;    int len = 0;    buf[sizeof(buf) - 1] = 0;    va_start(va, format);#ifdef NO_vsnprintf#  ifdef HAS_vsprintf_void    (void)vsprintf(buf, format, va);    va_end(va);    for (len = 0; len < sizeof(buf); len++)        if (buf[len] == 0) break;#  else    len = vsprintf(buf, format, va);    va_end(va);#  endif#else#  ifdef HAS_vsnprintf_void    (void)vsnprintf(buf, sizeof(buf), format, va);    va_end(va);    len = strlen(buf);#  else	/*Benoit: to be checked if needed*/    //len = vsnprintf(buf, sizeof(buf), format, va);    //va_end(va);#  endif#endif    if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0)        return 0;    return gzwrite(file, buf, (unsigned)len);}#else /* not ANSI C */int gzprintf (gzFile file, const char *format, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10,                       int a11, int a12, int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20){    char buf[Z_PRINTF_BUFSIZE];    int len;    buf[sizeof(buf) - 1] = 0;#ifdef NO_snprintf#  ifdef HAS_sprintf_void    sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8,            a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);    for (len = 0; len < sizeof(buf); len++)        if (buf[len] == 0) break;#  else    len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8,                a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);#  endif#else#  ifdef HAS_snprintf_void    snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8,             a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);    len = strlen(buf);#  else    len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8,                 a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);#  endif#endif    if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0)        return 0;    return gzwrite(file, buf, len);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -