Blame Zlib.xs

Packit Service 4a2782
/* Filename: Zlib.xs
Packit Service 4a2782
 * Author  : Paul Marquess, <pmqs@cpan.org>
Packit Service 4a2782
 * Created : 22nd January 1996
Packit Service 4a2782
 * Version : 2.000
Packit Service 4a2782
 *
Packit Service 4a2782
 *   Copyright (c) 1995-2013 Paul Marquess. All rights reserved.
Packit Service 4a2782
 *   This program is free software; you can redistribute it and/or
Packit Service 4a2782
 *   modify it under the same terms as Perl itself.
Packit Service 4a2782
 *
Packit Service 4a2782
 */
Packit Service 4a2782
Packit Service 4a2782
/* Parts of this code are based on the files gzio.c and gzappend.c from 
Packit Service 4a2782
 * the standard zlib source distribution. Below are the copyright statements
Packit Service 4a2782
 * from each. 
Packit Service 4a2782
 */
Packit Service 4a2782
Packit Service 4a2782
/* gzio.c -- IO on .gz files
Packit Service 4a2782
 * Copyright (C) 1995 Jean-loup Gailly.
Packit Service 4a2782
 * For conditions of distribution and use, see copyright notice in zlib.h
Packit Service 4a2782
 */
Packit Service 4a2782
Packit Service 4a2782
/* gzappend -- command to append to a gzip file
Packit Service 4a2782
Packit Service 4a2782
  Copyright (C) 2003 Mark Adler, all rights reserved
Packit Service 4a2782
  version 1.1, 4 Nov 2003
Packit Service 4a2782
*/
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
#define PERL_NO_GET_CONTEXT
Packit Service 4a2782
#include "EXTERN.h"
Packit Service 4a2782
#include "perl.h"
Packit Service 4a2782
#include "XSUB.h"
Packit Service 4a2782
Packit Service 4a2782
#include "zlib.h" 
Packit Service 4a2782
Packit Service 4a2782
/* zlib prior to 1.06 doesn't know about z_off_t */
Packit Service 4a2782
#ifndef z_off_t
Packit Service 4a2782
#  define z_off_t   long
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if  ! defined(ZLIB_VERNUM) || ZLIB_VERNUM < 0x1200
Packit Service 4a2782
#  define NEED_DUMMY_BYTE_AT_END 
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if  defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1210
Packit Service 4a2782
#  define MAGIC_APPEND
Packit Service 4a2782
#  define AT_LEAST_ZLIB_1_2_1
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if  defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1221
Packit Service 4a2782
#  define AT_LEAST_ZLIB_1_2_2_1
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if  defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1222
Packit Service 4a2782
#  define AT_LEAST_ZLIB_1_2_2_2
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if  defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1223
Packit Service 4a2782
#  define AT_LEAST_ZLIB_1_2_2_3
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if  defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1230
Packit Service 4a2782
#  define AT_LEAST_ZLIB_1_2_3
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if  defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1252
Packit Service 4a2782
/* 
Packit Service 4a2782
    Use Z_SOLO to build source means need own malloc/free
Packit Service 4a2782
 */
Packit Service 4a2782
#  define AT_LEAST_ZLIB_1_2_5_2
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if  defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1280
Packit Service 4a2782
#  define AT_LEAST_ZLIB_1_2_8
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if  defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1290
Packit Service 4a2782
#  define AT_LEAST_ZLIB_1_2_9
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#ifdef USE_PPPORT_H
Packit Service 4a2782
#  define NEED_sv_2pvbyte
Packit Service 4a2782
#  define NEED_sv_2pv_nolen
Packit Service 4a2782
#  define NEED_sv_pvn_force_flags
Packit Service 4a2782
#  include "ppport.h"
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if PERL_REVISION == 5 && PERL_VERSION == 9
Packit Service 4a2782
    /* For Andreas */
Packit Service 4a2782
#   define sv_pvbyte_force(sv,lp) sv_pvbyten_force(sv,lp)
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if PERL_REVISION == 5 && (PERL_VERSION < 8 || (PERL_VERSION == 8 && PERL_SUBVERSION < 4 ))
Packit Service 4a2782
Packit Service 4a2782
#    ifdef SvPVbyte_force
Packit Service 4a2782
#        undef SvPVbyte_force
Packit Service 4a2782
#    endif
Packit Service 4a2782
Packit Service 4a2782
#    define SvPVbyte_force(sv,lp) SvPV_force(sv,lp)
Packit Service 4a2782
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#ifndef SvPVbyte_nolen
Packit Service 4a2782
#    define SvPVbyte_nolen SvPV_nolen
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
#if 0
Packit Service 4a2782
#  ifndef SvPVbyte_nolen
Packit Service 4a2782
#    define SvPVbyte_nolen SvPV_nolen
Packit Service 4a2782
#  endif
Packit Service 4a2782
Packit Service 4a2782
#  ifndef SvPVbyte_force
Packit Service 4a2782
#    define SvPVbyte_force(sv,lp) SvPV_force(sv,lp)
Packit Service 4a2782
#  endif
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if PERL_REVISION == 5 && (PERL_VERSION >= 8 || (PERL_VERSION == 8 && PERL_SUBVERSION < 4 ))
Packit Service 4a2782
#    define UTF8_AVAILABLE
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
typedef int                     DualType ;
Packit Service 4a2782
typedef int                     int_undef ;
Packit Service 4a2782
Packit Service 4a2782
typedef struct di_stream {
Packit Service 4a2782
    int      flags ;
Packit Service 4a2782
#define FLAG_APPEND             1
Packit Service 4a2782
#define FLAG_CRC32              2
Packit Service 4a2782
#define FLAG_ADLER32            4
Packit Service 4a2782
#define FLAG_CONSUME_INPUT      8
Packit Service 4a2782
#define FLAG_LIMIT_OUTPUT       16
Packit Service 4a2782
    uLong    crc32 ;
Packit Service 4a2782
    uLong    adler32 ;
Packit Service 4a2782
    z_stream stream;
Packit Service 4a2782
    uLong     bufsize; 
Packit Service 4a2782
    SV *     dictionary ;
Packit Service 4a2782
    uLong    dict_adler ;
Packit Service 4a2782
    int      last_error ;
Packit Service 4a2782
    bool     zip_mode ;
Packit Service 4a2782
/* #define SETP_BYTE */
Packit Service 4a2782
#ifdef SETP_BYTE
Packit Service 4a2782
    /* SETP_BYTE only works with zlib up to 1.2.8 */
Packit Service 4a2782
    bool     deflateParams_out_valid ;
Packit Service 4a2782
    Bytef    deflateParams_out_byte;
Packit Service 4a2782
#else
Packit Service 4a2782
#define deflateParams_BUFFER_SIZE       0x40000
Packit Service 4a2782
    uLong    deflateParams_out_length;
Packit Service 4a2782
    Bytef*   deflateParams_out_buffer;
Packit Service 4a2782
#endif
Packit Service 4a2782
    int      Level;
Packit Service 4a2782
    int      Method;
Packit Service 4a2782
    int      WindowBits;
Packit Service 4a2782
    int      MemLevel;
Packit Service 4a2782
    int      Strategy;
Packit Service 4a2782
    uLong    bytesInflated ;
Packit Service 4a2782
    uLong    compressedBytes ;
Packit Service 4a2782
    uLong    uncompressedBytes ;
Packit Service 4a2782
#ifdef MAGIC_APPEND
Packit Service 4a2782
Packit Service 4a2782
#define WINDOW_SIZE 32768U
Packit Service 4a2782
Packit Service 4a2782
    bool     matchedEndBlock;
Packit Service 4a2782
    Bytef*   window ;
Packit Service 4a2782
    int      window_lastbit,  window_left,  window_full;
Packit Service 4a2782
    unsigned window_have;
Packit Service 4a2782
    off_t    window_lastoff, window_end;
Packit Service 4a2782
    off_t    window_endOffset;
Packit Service 4a2782
Packit Service 4a2782
    uLong    lastBlockOffset ;
Packit Service 4a2782
    unsigned char window_lastByte ;
Packit Service 4a2782
                
Packit Service 4a2782
Packit Service 4a2782
#endif
Packit Service 4a2782
} di_stream;
Packit Service 4a2782
Packit Service 4a2782
typedef di_stream * deflateStream ;
Packit Service 4a2782
typedef di_stream * Compress__Raw__Zlib__deflateStream ;
Packit Service 4a2782
typedef di_stream * inflateStream ;
Packit Service 4a2782
typedef di_stream * Compress__Raw__Zlib__inflateStream ;
Packit Service 4a2782
typedef di_stream * Compress__Raw__Zlib__inflateScanStream ;
Packit Service 4a2782
Packit Service 4a2782
#define ZMALLOC(to, typ) (to = (typ *)safecalloc(sizeof(typ), 1))
Packit Service 4a2782
Packit Service 4a2782
/* Figure out the Operating System */
Packit Service 4a2782
#ifdef MSDOS
Packit Service 4a2782
#  define OS_CODE  0x00
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if defined(AMIGA) || defined(AMIGAOS) || defined(__amigaos4__)
Packit Service 4a2782
#  define OS_CODE  0x01
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
#if defined(VAXC) || defined(VMS)
Packit Service 4a2782
#  define OS_CODE  0x02
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if 0 /* VM/CMS */
Packit Service 4a2782
#  define OS_CODE  0x04
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
#if defined(ATARI) || defined(atarist)
Packit Service 4a2782
#  define OS_CODE  0x05
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
#ifdef OS2
Packit Service 4a2782
#  define OS_CODE  0x06
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
#if defined(MACOS) || defined(TARGET_OS_MAC)
Packit Service 4a2782
#  define OS_CODE  0x07
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#if 0 /* Z-System */
Packit Service 4a2782
#  define OS_CODE  0x08
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
#if 0 /* CP/M */
Packit Service 4a2782
#  define OS_CODE  0x09
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
#ifdef TOPS20
Packit Service 4a2782
#  define OS_CODE  0x0a
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#ifdef WIN32 /* Window 95 & Windows NT */
Packit Service 4a2782
#  define OS_CODE  0x0b
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
#if 0 /* QDOS */
Packit Service 4a2782
#  define OS_CODE  0x0c
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
#if 0 /* Acorn RISCOS */
Packit Service 4a2782
#  define OS_CODE  0x0d
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
#if 0 /* ???  */
Packit Service 4a2782
#  define OS_CODE  0x0e
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
#ifdef __50SERIES /* Prime/PRIMOS */
Packit Service 4a2782
#  define OS_CODE  0x0F
Packit Service 4a2782
#endif
Packit Service 4a2782
 
Packit Service 4a2782
/* Default to UNIX */ 
Packit Service 4a2782
#ifndef OS_CODE
Packit Service 4a2782
#  define OS_CODE  0x03  /* assume Unix */
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#ifndef GZIP_OS_CODE
Packit Service 4a2782
#  define GZIP_OS_CODE OS_CODE
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#define adlerInitial adler32(0L, Z_NULL, 0)
Packit Service 4a2782
#define crcInitial crc32(0L, Z_NULL, 0)
Packit Service 4a2782
Packit Service 4a2782
/* static const char * const my_z_errmsg[] = { */
Packit Service 4a2782
static const char my_z_errmsg[][32] = {
Packit Service 4a2782
    "need dictionary",     /* Z_NEED_DICT     2 */
Packit Service 4a2782
    "stream end",          /* Z_STREAM_END    1 */
Packit Service 4a2782
    "",                    /* Z_OK            0 */
Packit Service 4a2782
    "file error",          /* Z_ERRNO        (-1) */
Packit Service 4a2782
    "stream error",        /* Z_STREAM_ERROR (-2) */
Packit Service 4a2782
    "data error",          /* Z_DATA_ERROR   (-3) */
Packit Service 4a2782
    "insufficient memory", /* Z_MEM_ERROR    (-4) */
Packit Service 4a2782
    "buffer error",        /* Z_BUF_ERROR    (-5) */
Packit Service 4a2782
    "incompatible version",/* Z_VERSION_ERROR(-6) */
Packit Service 4a2782
    ""};
Packit Service 4a2782
Packit Service 4a2782
#define setDUALstatus(var, err)                                         \
Packit Service 4a2782
                sv_setnv(var, (double)err) ;                            \
Packit Service 4a2782
                sv_setpv(var, ((err) ? GetErrorString(err) : "")) ;     \
Packit Service 4a2782
                SvNOK_on(var);
Packit Service 4a2782
Packit Service 4a2782
   
Packit Service 4a2782
#if defined(__SYMBIAN32__)
Packit Service 4a2782
# define NO_WRITEABLE_DATA
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
/* Set TRACE_DEFAULT to a non-zero value to enable tracing */
Packit Service 4a2782
#define TRACE_DEFAULT 0
Packit Service 4a2782
Packit Service 4a2782
#if defined(NO_WRITEABLE_DATA) || TRACE_DEFAULT == 0
Packit Service 4a2782
#  define trace TRACE_DEFAULT
Packit Service 4a2782
#else
Packit Service 4a2782
  static int trace = TRACE_DEFAULT ;
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
/* Dodge PerlIO hiding of these functions. */
Packit Service 4a2782
#undef printf
Packit Service 4a2782
Packit Service 4a2782
static char *
Packit Service 4a2782
#ifdef CAN_PROTOTYPE
Packit Service 4a2782
GetErrorString(int error_no)
Packit Service 4a2782
#else
Packit Service 4a2782
GetErrorString(error_no)
Packit Service 4a2782
int error_no ;
Packit Service 4a2782
#endif
Packit Service 4a2782
{
Packit Service 4a2782
    dTHX;
Packit Service 4a2782
    char * errstr ;
Packit Service 4a2782
  
Packit Service 4a2782
    if (error_no == Z_ERRNO) {
Packit Service 4a2782
        errstr = Strerror(errno) ;
Packit Service 4a2782
    }
Packit Service 4a2782
    else
Packit Service 4a2782
        /* errstr = gzerror(fil, &error_no) ; */
Packit Service 4a2782
        errstr = (char*) my_z_errmsg[2 - error_no]; 
Packit Service 4a2782
Packit Service 4a2782
    return errstr ;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
#ifdef MAGIC_APPEND
Packit Service 4a2782
Packit Service 4a2782
/*
Packit Service 4a2782
   The following two functions are taken almost directly from
Packit Service 4a2782
   examples/gzappend.c. Only cosmetic changes have been made to conform to
Packit Service 4a2782
   the coding style of the rest of the code in this file.
Packit Service 4a2782
*/
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
/* return the greatest common divisor of a and b using Euclid's algorithm,
Packit Service 4a2782
   modified to be fast when one argument much greater than the other, and
Packit Service 4a2782
   coded to avoid unnecessary swapping */
Packit Service 4a2782
static unsigned 
Packit Service 4a2782
#ifdef CAN_PROTOTYPE
Packit Service 4a2782
gcd(unsigned a, unsigned b)
Packit Service 4a2782
#else
Packit Service 4a2782
gcd(a, b)
Packit Service 4a2782
    unsigned a;
Packit Service 4a2782
    unsigned b;
Packit Service 4a2782
#endif
Packit Service 4a2782
{
Packit Service 4a2782
    unsigned c;
Packit Service 4a2782
Packit Service 4a2782
    while (a && b)
Packit Service 4a2782
        if (a > b) {
Packit Service 4a2782
            c = b;
Packit Service 4a2782
            while (a - c >= c)
Packit Service 4a2782
                c <<= 1;
Packit Service 4a2782
            a -= c;
Packit Service 4a2782
        }
Packit Service 4a2782
        else {
Packit Service 4a2782
            c = a;
Packit Service 4a2782
            while (b - c >= c)
Packit Service 4a2782
                c <<= 1;
Packit Service 4a2782
            b -= c;
Packit Service 4a2782
        }
Packit Service 4a2782
    return a + b;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
/* rotate list[0..len-1] left by rot positions, in place */
Packit Service 4a2782
static void 
Packit Service 4a2782
#ifdef CAN_PROTOTYPE
Packit Service 4a2782
rotate(unsigned char *list, unsigned len, unsigned rot)
Packit Service 4a2782
#else
Packit Service 4a2782
rotate(list, len, rot)
Packit Service 4a2782
    unsigned char *list;
Packit Service 4a2782
    unsigned len ;
Packit Service 4a2782
    unsigned rot;
Packit Service 4a2782
#endif
Packit Service 4a2782
{
Packit Service 4a2782
    unsigned char tmp;
Packit Service 4a2782
    unsigned cycles;
Packit Service 4a2782
    unsigned char *start, *last, *to, *from;
Packit Service 4a2782
Packit Service 4a2782
    /* normalize rot and handle degenerate cases */
Packit Service 4a2782
    if (len < 2) return;
Packit Service 4a2782
    if (rot >= len) rot %= len;
Packit Service 4a2782
    if (rot == 0) return;
Packit Service 4a2782
Packit Service 4a2782
    /* pointer to last entry in list */
Packit Service 4a2782
    last = list + (len - 1);
Packit Service 4a2782
Packit Service 4a2782
    /* do simple left shift by one */
Packit Service 4a2782
    if (rot == 1) {
Packit Service 4a2782
        tmp = *list;
Packit Service 4a2782
        memmove(list, list + 1, len - 1);
Packit Service 4a2782
        *last = tmp;
Packit Service 4a2782
        return;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    /* do simple right shift by one */
Packit Service 4a2782
    if (rot == len - 1) {
Packit Service 4a2782
        tmp = *last;
Packit Service 4a2782
        memmove(list + 1, list, len - 1);
Packit Service 4a2782
        *list = tmp;
Packit Service 4a2782
        return;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    /* otherwise do rotate as a set of cycles in place */
Packit Service 4a2782
    cycles = gcd(len, rot);             /* number of cycles */
Packit Service 4a2782
    do {
Packit Service 4a2782
        start = from = list + cycles;   /* start index is arbitrary */
Packit Service 4a2782
        tmp = *from;                    /* save entry to be overwritten */
Packit Service 4a2782
        for (;;) {
Packit Service 4a2782
            to = from;                  /* next step in cycle */
Packit Service 4a2782
            from += rot;                /* go right rot positions */
Packit Service 4a2782
            if (from > last) from -= len;   /* (pointer better not wrap) */
Packit Service 4a2782
            if (from == start) break;   /* all but one shifted */
Packit Service 4a2782
            *to = *from;                /* shift left */
Packit Service 4a2782
        }
Packit Service 4a2782
        *to = tmp;                      /* complete the circle */
Packit Service 4a2782
    } while (--cycles);
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
#endif /* MAGIC_APPEND */
Packit Service 4a2782
Packit Service 4a2782
static void
Packit Service 4a2782
#ifdef CAN_PROTOTYPE
Packit Service 4a2782
DispHex(void * ptr, int length)
Packit Service 4a2782
#else
Packit Service 4a2782
DispHex(ptr, length)
Packit Service 4a2782
    void * ptr;
Packit Service 4a2782
    int length;
Packit Service 4a2782
#endif
Packit Service 4a2782
{
Packit Service 4a2782
    char * p = (char*)ptr;
Packit Service 4a2782
    int i;
Packit Service 4a2782
    for (i = 0; i < length; ++i) {
Packit Service 4a2782
        printf(" %02x", 0xFF & *(p+i));
Packit Service 4a2782
    }
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
static void
Packit Service 4a2782
#ifdef CAN_PROTOTYPE
Packit Service 4a2782
DispStream(di_stream * s, const char * message)
Packit Service 4a2782
#else
Packit Service 4a2782
DispStream(s, message)
Packit Service 4a2782
    di_stream * s;
Packit Service 4a2782
    const char * message;
Packit Service 4a2782
#endif
Packit Service 4a2782
{
Packit Service 4a2782
Packit Service 4a2782
#if 0
Packit Service 4a2782
    if (! trace)
Packit Service 4a2782
        return ;
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#define EnDis(f) (s->flags & f ? "Enabled" : "Disabled")
Packit Service 4a2782
Packit Service 4a2782
    printf("DispStream %p", s) ;
Packit Service 4a2782
    if (message)
Packit Service 4a2782
        printf("- %s \n", message) ;
Packit Service 4a2782
    printf("\n") ;
Packit Service 4a2782
Packit Service 4a2782
    if (!s)  {
Packit Service 4a2782
        printf("    stream pointer is NULL\n");
Packit Service 4a2782
    }
Packit Service 4a2782
    else     {
Packit Service 4a2782
        printf("    stream           %p\n", &(s->stream));
Packit Service 4a2782
        printf("           zalloc    %p\n", s->stream.zalloc);
Packit Service 4a2782
        printf("           zfree     %p\n", s->stream.zfree);
Packit Service 4a2782
        printf("           opaque    %p\n", s->stream.opaque);
Packit Service 4a2782
        printf("           state     %p\n", s->stream.state);
Packit Service 4a2782
        if (s->stream.msg)
Packit Service 4a2782
            printf("           msg       %s\n", s->stream.msg);
Packit Service 4a2782
        else
Packit Service 4a2782
            printf("           msg       \n");
Packit Service 4a2782
        printf("           next_in   %p", s->stream.next_in);
Packit Service 4a2782
        if (s->stream.next_in){
Packit Service 4a2782
            printf(" =>");
Packit Service 4a2782
            DispHex(s->stream.next_in, 4);
Packit Service 4a2782
        }
Packit Service 4a2782
        printf("\n");
Packit Service 4a2782
Packit Service 4a2782
        printf("           next_out  %p", s->stream.next_out);
Packit Service 4a2782
        if (s->stream.next_out){
Packit Service 4a2782
            printf(" =>");
Packit Service 4a2782
            DispHex(s->stream.next_out, 4);
Packit Service 4a2782
        }
Packit Service 4a2782
        printf("\n");
Packit Service 4a2782
Packit Service 4a2782
        printf("           avail_in  %lu\n",  (unsigned long)s->stream.avail_in);
Packit Service 4a2782
        printf("           avail_out %lu\n",  (unsigned long)s->stream.avail_out);
Packit Service 4a2782
        printf("           total_in  %ld\n",  s->stream.total_in);
Packit Service 4a2782
        printf("           total_out %ld\n",  s->stream.total_out);
Packit Service 4a2782
        printf("           adler     %ld\n",  s->stream.adler    );
Packit Service 4a2782
        printf("    bufsize          %ld\n",  s->bufsize);
Packit Service 4a2782
        printf("    dictionary       %p\n",   s->dictionary);
Packit Service 4a2782
        printf("    dict_adler       0x%ld\n",s->dict_adler);
Packit Service 4a2782
        printf("    zip_mode         %d\n",   s->zip_mode);
Packit Service 4a2782
        printf("    crc32            0x%x\n", (unsigned)s->crc32);
Packit Service 4a2782
        printf("    adler32          0x%x\n", (unsigned)s->adler32);
Packit Service 4a2782
        printf("    flags            0x%x\n", s->flags);
Packit Service 4a2782
        printf("           APPEND    %s\n",   EnDis(FLAG_APPEND));
Packit Service 4a2782
        printf("           CRC32     %s\n",   EnDis(FLAG_CRC32));
Packit Service 4a2782
        printf("           ADLER32   %s\n",   EnDis(FLAG_ADLER32));
Packit Service 4a2782
        printf("           CONSUME   %s\n",   EnDis(FLAG_CONSUME_INPUT));
Packit Service 4a2782
        printf("           LIMIT     %s\n",   EnDis(FLAG_LIMIT_OUTPUT));
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
#ifdef MAGIC_APPEND
Packit Service 4a2782
        printf("    window           %p\n", s->window);
Packit Service 4a2782
#endif
Packit Service 4a2782
        printf("\n");
Packit Service 4a2782
Packit Service 4a2782
    }
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
#ifdef AT_LEAST_ZLIB_1_2_5_2
Packit Service 4a2782
voidpf my_zcalloc (voidpf opaque, unsigned items, unsigned size)
Packit Service 4a2782
{
Packit Service 4a2782
    PERL_UNUSED_VAR(opaque);
Packit Service 4a2782
    /* TODO - put back to calloc */
Packit Service 4a2782
    /* return safecalloc(items, size); */
Packit Service 4a2782
    return safemalloc(items* size);
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
void my_zcfree (voidpf opaque, voidpf ptr)
Packit Service 4a2782
{
Packit Service 4a2782
    PERL_UNUSED_VAR(opaque);
Packit Service 4a2782
    safefree(ptr);
Packit Service 4a2782
    return; 
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
static di_stream *
Packit Service 4a2782
#ifdef CAN_PROTOTYPE
Packit Service 4a2782
InitStream(void)
Packit Service 4a2782
#else
Packit Service 4a2782
InitStream()
Packit Service 4a2782
#endif
Packit Service 4a2782
{
Packit Service 4a2782
    di_stream *s ;
Packit Service 4a2782
Packit Service 4a2782
    ZMALLOC(s, di_stream) ;
Packit Service 4a2782
Packit Service 4a2782
#ifdef AT_LEAST_ZLIB_1_2_5_2
Packit Service 4a2782
    s->stream.zalloc = my_zcalloc;
Packit Service 4a2782
    s->stream.zfree = my_zcfree;
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
    return s ;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
static void
Packit Service 4a2782
#ifdef CAN_PROTOTYPE
Packit Service 4a2782
PostInitStream(di_stream * s, int flags, int bufsize, int windowBits)
Packit Service 4a2782
#else
Packit Service 4a2782
PostInitStream(s, flags, bufsize, windowBits)
Packit Service 4a2782
    di_stream *s ;
Packit Service 4a2782
    int flags ;
Packit Service 4a2782
    int bufsize ;
Packit Service 4a2782
    int windowBits ;
Packit Service 4a2782
#endif
Packit Service 4a2782
{
Packit Service 4a2782
    s->bufsize = bufsize ;
Packit Service 4a2782
    s->compressedBytes =
Packit Service 4a2782
    s->uncompressedBytes =
Packit Service 4a2782
    s->last_error = 0 ;
Packit Service 4a2782
    s->flags    = flags ;
Packit Service 4a2782
    s->zip_mode = (windowBits < 0) ;
Packit Service 4a2782
    if (flags & FLAG_CRC32) 
Packit Service 4a2782
        s->crc32 = crcInitial ;
Packit Service 4a2782
    if (flags & FLAG_ADLER32) 
Packit Service 4a2782
        s->adler32 = adlerInitial ;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
static SV* 
Packit Service 4a2782
#ifdef CAN_PROTOTYPE
Packit Service 4a2782
deRef(SV * sv, const char * string)
Packit Service 4a2782
#else
Packit Service 4a2782
deRef(sv, string)
Packit Service 4a2782
SV * sv ;
Packit Service 4a2782
char * string;
Packit Service 4a2782
#endif
Packit Service 4a2782
{
Packit Service 4a2782
    dTHX;
Packit Service 4a2782
    SvGETMAGIC(sv);
Packit Service 4a2782
Packit Service 4a2782
    if (SvROK(sv)) {
Packit Service 4a2782
        sv = SvRV(sv) ;
Packit Service 4a2782
        SvGETMAGIC(sv);
Packit Service 4a2782
        switch(SvTYPE(sv)) {
Packit Service 4a2782
            case SVt_PVAV:
Packit Service 4a2782
            case SVt_PVHV:
Packit Service 4a2782
            case SVt_PVCV:
Packit Service 4a2782
                croak("%s: buffer parameter is not a SCALAR reference", string);
Packit Service 4a2782
            default:
Packit Service 4a2782
                break;
Packit Service 4a2782
        }
Packit Service 4a2782
        if (SvROK(sv))
Packit Service 4a2782
            croak("%s: buffer parameter is a reference to a reference", string) ;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    if (!SvOK(sv))
Packit Service 4a2782
        sv = sv_2mortal(newSVpv("", 0));
Packit Service 4a2782
Packit Service 4a2782
    return sv ;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
static SV*
Packit Service 4a2782
#ifdef CAN_PROTOTYPE
Packit Service 4a2782
deRef_l(SV * sv, const char * string)
Packit Service 4a2782
#else
Packit Service 4a2782
deRef_l(sv, string)
Packit Service 4a2782
SV * sv ;
Packit Service 4a2782
char * string ;
Packit Service 4a2782
#endif
Packit Service 4a2782
{
Packit Service 4a2782
    dTHX;
Packit Service 4a2782
    bool wipe = 0 ;
Packit Service 4a2782
    STRLEN na;
Packit Service 4a2782
    
Packit Service 4a2782
    SvGETMAGIC(sv);
Packit Service 4a2782
    wipe = ! SvOK(sv) ;
Packit Service 4a2782
Packit Service 4a2782
    if (SvROK(sv)) {
Packit Service 4a2782
        sv = SvRV(sv) ;
Packit Service 4a2782
        SvGETMAGIC(sv);
Packit Service 4a2782
        wipe = ! SvOK(sv) ;
Packit Service 4a2782
Packit Service 4a2782
        switch(SvTYPE(sv)) {
Packit Service 4a2782
            case SVt_PVAV:
Packit Service 4a2782
            case SVt_PVHV:
Packit Service 4a2782
            case SVt_PVCV:
Packit Service 4a2782
                croak("%s: buffer parameter is not a SCALAR reference", string);
Packit Service 4a2782
            default:
Packit Service 4a2782
                break;
Packit Service 4a2782
        }
Packit Service 4a2782
        if (SvROK(sv))
Packit Service 4a2782
            croak("%s: buffer parameter is a reference to a reference", string) ;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    if (SvREADONLY(sv) && PL_curcop != &PL_compiling)
Packit Service 4a2782
        croak("%s: buffer parameter is read-only", string);
Packit Service 4a2782
Packit Service 4a2782
    SvUPGRADE(sv, SVt_PV);
Packit Service 4a2782
Packit Service 4a2782
    if (wipe)
Packit Service 4a2782
        sv_setpv(sv, "") ;
Packit Service 4a2782
    else
Packit Service 4a2782
        (void)SvPVbyte_force(sv, na) ;
Packit Service 4a2782
Packit Service 4a2782
    return sv ;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
#if 0
Packit Service 4a2782
int
Packit Service 4a2782
flushToBuffer(di_stream* s, int flush)
Packit Service 4a2782
{
Packit Service 4a2782
    dTHX;
Packit Service 4a2782
    int ret ;
Packit Service 4a2782
    z_stream * strm = &s->stream;
Packit Service 4a2782
Packit Service 4a2782
    Bytef* output = s->deflateParams_out_buffer ;
Packit Service 4a2782
Packit Service 4a2782
    strm->next_in = NULL;
Packit Service 4a2782
    strm->avail_in = 0;
Packit Service 4a2782
    
Packit Service 4a2782
    uLong total_output = 0;
Packit Service 4a2782
    uLong have = 0;
Packit Service 4a2782
Packit Service 4a2782
    do 
Packit Service 4a2782
    {
Packit Service 4a2782
        if (output)
Packit Service 4a2782
            output = (unsigned char *)saferealloc(output, total_output + s->bufsize);
Packit Service 4a2782
        else
Packit Service 4a2782
            output = (unsigned char *)safemalloc(s->bufsize);
Packit Service 4a2782
Packit Service 4a2782
        strm->next_out  = output + total_output;
Packit Service 4a2782
        strm->avail_out = s->bufsize;
Packit Service 4a2782
Packit Service 4a2782
        ret = deflate(strm, flush);    /* no bad return value */
Packit Service 4a2782
        //assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
Packit Service 4a2782
        if(ret == Z_STREAM_ERROR)
Packit Service 4a2782
        {
Packit Service 4a2782
            safefree(output);
Packit Service 4a2782
            return ret;
Packit Service 4a2782
        }
Packit Service 4a2782
        have = s->bufsize - strm->avail_out;
Packit Service 4a2782
        total_output += have;
Packit Service 4a2782
Packit Service 4a2782
        //fprintf(stderr, "FLUSH %s %d, return %d\n", flush_flags[flush], have, ret);
Packit Service 4a2782
Packit Service 4a2782
    } while (strm->avail_out == 0);
Packit Service 4a2782
Packit Service 4a2782
    s->deflateParams_out_buffer = output;
Packit Service 4a2782
    s->deflateParams_out_length = total_output; 
Packit Service 4a2782
Packit Service 4a2782
    return Z_OK;
Packit Service 4a2782
}
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
#ifndef SETP_BYTE
Packit Service 4a2782
int
Packit Service 4a2782
flushParams(di_stream* s)
Packit Service 4a2782
{
Packit Service 4a2782
    dTHX;
Packit Service 4a2782
    int ret ;
Packit Service 4a2782
    z_stream * strm = &s->stream;
Packit Service 4a2782
Packit Service 4a2782
    Bytef* output = s->deflateParams_out_buffer ;
Packit Service 4a2782
    uLong total_output = s->deflateParams_out_length;
Packit Service 4a2782
    uLong have = 0;
Packit Service 4a2782
Packit Service 4a2782
    strm->next_in = NULL;
Packit Service 4a2782
    strm->avail_in = 0;
Packit Service 4a2782
    
Packit Service 4a2782
Packit Service 4a2782
    do 
Packit Service 4a2782
    {
Packit Service 4a2782
        if (output)
Packit Service 4a2782
            output = (unsigned char *)saferealloc(output, total_output + s->bufsize);
Packit Service 4a2782
        else
Packit Service 4a2782
            output = (unsigned char *)safemalloc(s->bufsize);
Packit Service 4a2782
Packit Service 4a2782
        strm->next_out  = output + total_output;
Packit Service 4a2782
        strm->avail_out = s->bufsize;
Packit Service 4a2782
Packit Service 4a2782
        ret = deflateParams(&(s->stream), s->Level, s->Strategy);
Packit Service 4a2782
        /* fprintf(stderr, "deflateParams %d %s %lu\n", ret,
Packit Service 4a2782
            GetErrorString(ret),  s->bufsize - strm->avail_out); */
Packit Service 4a2782
Packit Service 4a2782
        if (ret == Z_STREAM_ERROR) 
Packit Service 4a2782
            break;
Packit Service 4a2782
Packit Service 4a2782
        have = s->bufsize - strm->avail_out;
Packit Service 4a2782
        total_output += have;
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
    } while (ret == Z_BUF_ERROR) ;
Packit Service 4a2782
Packit Service 4a2782
    if(ret == Z_STREAM_ERROR)
Packit Service 4a2782
        safefree(output);
Packit Service 4a2782
    else 
Packit Service 4a2782
    {
Packit Service 4a2782
        s->deflateParams_out_buffer = output;
Packit Service 4a2782
        s->deflateParams_out_length = total_output; 
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    return ret;
Packit Service 4a2782
}
Packit Service 4a2782
#endif /* ! SETP_BYTE */
Packit Service 4a2782
Packit Service 4a2782
#include "constants.h"
Packit Service 4a2782
Packit Service 4a2782
MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib        PREFIX = Zip_
Packit Service 4a2782
Packit Service 4a2782
REQUIRE:	1.924
Packit Service 4a2782
PROTOTYPES:	DISABLE
Packit Service 4a2782
Packit Service 4a2782
INCLUDE: constants.xs
Packit Service 4a2782
Packit Service 4a2782
BOOT:
Packit Service 4a2782
    /* Check this version of zlib is == 1 */
Packit Service 4a2782
    if (zlibVersion()[0] != '1')
Packit Service 4a2782
	croak("Compress::Raw::Zlib needs zlib version 1.x\n") ;
Packit Service 4a2782
	
Packit Service 4a2782
    {
Packit Service 4a2782
        /* Create the $os_code scalar */
Packit Service 4a2782
        SV * os_code_sv = perl_get_sv("Compress::Raw::Zlib::gzip_os_code", GV_ADDMULTI) ;
Packit Service 4a2782
        sv_setiv(os_code_sv, GZIP_OS_CODE) ;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
#define Zip_zlib_version()	(const char*)zlib_version
Packit Service 4a2782
const char*
Packit Service 4a2782
Zip_zlib_version()
Packit Service 4a2782
Packit Service 4a2782
unsigned
Packit Service 4a2782
ZLIB_VERNUM()
Packit Service 4a2782
    CODE:
Packit Service 4a2782
#ifdef ZLIB_VERNUM
Packit Service 4a2782
        RETVAL = ZLIB_VERNUM ;
Packit Service 4a2782
#else
Packit Service 4a2782
        /* 1.1.4 => 0x1140 */
Packit Service 4a2782
        RETVAL  = (ZLIB_VERSION[0] - '0') << 12 ;
Packit Service 4a2782
        RETVAL += (ZLIB_VERSION[2] - '0') <<  8 ;
Packit Service 4a2782
        RETVAL += (ZLIB_VERSION[4] - '0') <<  4 ;
Packit Service 4a2782
        if (strlen(ZLIB_VERSION) > 5)
Packit Service 4a2782
            RETVAL += (ZLIB_VERSION[6] - '0')  ;
Packit Service 4a2782
#endif
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
        RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
#ifndef AT_LEAST_ZLIB_1_2_1
Packit Service 4a2782
#define zlibCompileFlags() 0
Packit Service 4a2782
#endif
Packit Service 4a2782
uLong
Packit Service 4a2782
zlibCompileFlags()
Packit Service 4a2782
Packit Service 4a2782
MODULE = Compress::Raw::Zlib	PACKAGE = Compress::Raw::Zlib	PREFIX = Zip_
Packit Service 4a2782
Packit Service 4a2782
#define Zip_adler32(buf, adler) adler32(adler, buf, (uInt)len)
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
Zip_adler32(buf, adler=adlerInitial)
Packit Service 4a2782
        uLong    adler = NO_INIT
Packit Service 4a2782
        STRLEN   len = NO_INIT
Packit Service 4a2782
        Bytef *  buf = NO_INIT
Packit Service 4a2782
	SV *	 sv = ST(0) ;
Packit Service 4a2782
	INIT:
Packit Service 4a2782
    	/* If the buffer is a reference, dereference it */
Packit Service 4a2782
	sv = deRef(sv, "adler32") ;
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
    if (DO_UTF8(sv) && !sv_utf8_downgrade(sv, 1))
Packit Service 4a2782
         croak("Wide character in Compress::Raw::Zlib::adler32");
Packit Service 4a2782
#endif         
Packit Service 4a2782
	buf = (Byte*)SvPVbyte(sv, len) ;
Packit Service 4a2782
Packit Service 4a2782
	if (items < 2)
Packit Service 4a2782
	  adler = adlerInitial;
Packit Service 4a2782
	else if (SvOK(ST(1)))
Packit Service 4a2782
	  adler = SvUV(ST(1)) ;
Packit Service 4a2782
	else
Packit Service 4a2782
	  adler = adlerInitial;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
        RETVAL
Packit Service 4a2782
 
Packit Service 4a2782
#define Zip_crc32(buf, crc, offset) crc32(crc, buf+offset, (uInt)len-offset)
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
Zip_crc32(buf, crc=crcInitial, offset=0)
Packit Service 4a2782
        uLong    crc = NO_INIT
Packit Service 4a2782
        STRLEN   len = NO_INIT
Packit Service 4a2782
        Bytef *  buf = NO_INIT
Packit Service 4a2782
        STRLEN   offset       
Packit Service 4a2782
	SV *	 sv = ST(0) ;
Packit Service 4a2782
	INIT:
Packit Service 4a2782
    	/* If the buffer is a reference, dereference it */
Packit Service 4a2782
	sv = deRef(sv, "crc32") ;
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
    if (DO_UTF8(sv) && !sv_utf8_downgrade(sv, 1))
Packit Service 4a2782
         croak("Wide character in Compress::Raw::Zlib::crc32");
Packit Service 4a2782
#endif         
Packit Service 4a2782
	buf = (Byte*)SvPVbyte(sv, len) ;
Packit Service 4a2782
Packit Service 4a2782
	if (offset > len)
Packit Service 4a2782
	  croak("Offset out of range in Compress::Raw::Zlib::crc32");
Packit Service 4a2782
Packit Service 4a2782
	if (items < 2)
Packit Service 4a2782
	  crc = crcInitial;
Packit Service 4a2782
	else if (SvOK(ST(1)))
Packit Service 4a2782
	  crc = SvUV(ST(1)) ;
Packit Service 4a2782
	else
Packit Service 4a2782
	  crc = crcInitial;
Packit Service 4a2782
 
Packit Service 4a2782
uLong
Packit Service 4a2782
crc32_combine(crc1, crc2, len2)
Packit Service 4a2782
        uLong    crc1 
Packit Service 4a2782
        uLong    crc2 
Packit Service 4a2782
        z_off_t   len2 
Packit Service 4a2782
	CODE:
Packit Service 4a2782
#ifndef AT_LEAST_ZLIB_1_2_2_1
Packit Service 4a2782
        crc1 = crc1; crc2 = crc2 ; len2 = len2; /* Silence -Wall */
Packit Service 4a2782
        croak("crc32_combine needs zlib 1.2.3 or better");
Packit Service 4a2782
#else
Packit Service 4a2782
        RETVAL = crc32_combine(crc1, crc2, len2);
Packit Service 4a2782
#endif
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
        RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
adler32_combine(adler1, adler2, len2)
Packit Service 4a2782
        uLong    adler1 
Packit Service 4a2782
        uLong    adler2 
Packit Service 4a2782
        z_off_t   len2 
Packit Service 4a2782
	CODE:
Packit Service 4a2782
#ifndef AT_LEAST_ZLIB_1_2_2_1
Packit Service 4a2782
        adler1 = adler1; adler2 = adler2 ; len2 = len2; /* Silence -Wall */
Packit Service 4a2782
        croak("adler32_combine needs zlib 1.2.3 or better");
Packit Service 4a2782
#else
Packit Service 4a2782
        RETVAL = adler32_combine(adler1, adler2, len2);
Packit Service 4a2782
#endif
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
        RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib
Packit Service 4a2782
Packit Service 4a2782
void
Packit Service 4a2782
_deflateInit(flags,level, method, windowBits, memLevel, strategy, bufsize, dictionary)
Packit Service 4a2782
    int flags
Packit Service 4a2782
    int	level
Packit Service 4a2782
    int method
Packit Service 4a2782
    int windowBits
Packit Service 4a2782
    int memLevel
Packit Service 4a2782
    int strategy
Packit Service 4a2782
    uLong bufsize
Packit Service 4a2782
    SV* dictionary
Packit Service 4a2782
  PPCODE:
Packit Service 4a2782
    int err ;
Packit Service 4a2782
    deflateStream s ;
Packit Service 4a2782
Packit Service 4a2782
    if (trace) 
Packit Service 4a2782
        warn("in _deflateInit(level=%d, method=%d, windowBits=%d, memLevel=%d, strategy=%d, bufsize=%ld dictionary=%p)\n", 
Packit Service 4a2782
	level, method, windowBits, memLevel, strategy, bufsize, dictionary) ;
Packit Service 4a2782
    if ((s = InitStream() )) {
Packit Service 4a2782
Packit Service 4a2782
        s->Level      = level;
Packit Service 4a2782
        s->Method     = method;
Packit Service 4a2782
        s->WindowBits = windowBits;
Packit Service 4a2782
        s->MemLevel   = memLevel;
Packit Service 4a2782
        s->Strategy   = strategy;
Packit Service 4a2782
Packit Service 4a2782
        err = deflateInit2(&(s->stream), level, 
Packit Service 4a2782
			   method, windowBits, memLevel, strategy);
Packit Service 4a2782
Packit Service 4a2782
        if (trace) {
Packit Service 4a2782
            warn(" _deflateInit2 returned %d (state %p)\n", err, s);
Packit Service 4a2782
            DispStream(s, "INIT");
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
	/* Check if a dictionary has been specified */
Packit Service 4a2782
	SvGETMAGIC(dictionary);
Packit Service 4a2782
	if (err == Z_OK && SvPOK(dictionary) && SvCUR(dictionary)) {
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
            if (DO_UTF8(dictionary) && !sv_utf8_downgrade(dictionary, 1))
Packit Service 4a2782
                croak("Wide character in Compress::Raw::Zlib::Deflate::new dicrionary parameter");
Packit Service 4a2782
#endif         
Packit Service 4a2782
	    err = deflateSetDictionary(&(s->stream), (const Bytef*) SvPVX(dictionary), SvCUR(dictionary)) ;
Packit Service 4a2782
        if (trace) 
Packit Service 4a2782
            warn("deflateSetDictionary returned %d\n", err);
Packit Service 4a2782
	    s->dict_adler = s->stream.adler ;
Packit Service 4a2782
	}
Packit Service 4a2782
Packit Service 4a2782
        if (err != Z_OK) {
Packit Service 4a2782
            Safefree(s) ;
Packit Service 4a2782
            s = NULL ;
Packit Service 4a2782
	}
Packit Service 4a2782
	else
Packit Service 4a2782
	    PostInitStream(s, flags, bufsize, windowBits) ;
Packit Service 4a2782
        
Packit Service 4a2782
    }
Packit Service 4a2782
    else
Packit Service 4a2782
        err = Z_MEM_ERROR ;
Packit Service 4a2782
Packit Service 4a2782
    {
Packit Service 4a2782
        SV* obj = sv_setref_pv(sv_newmortal(), 
Packit Service 4a2782
            "Compress::Raw::Zlib::deflateStream", (void*)s);
Packit Service 4a2782
        XPUSHs(obj);
Packit Service 4a2782
    }
Packit Service 4a2782
    if (GIMME == G_ARRAY) {
Packit Service 4a2782
        SV * sv = sv_2mortal(newSViv(err)) ;
Packit Service 4a2782
	setDUALstatus(sv, err);
Packit Service 4a2782
        XPUSHs(sv) ;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
void
Packit Service 4a2782
_inflateInit(flags, windowBits, bufsize, dictionary)
Packit Service 4a2782
    int flags
Packit Service 4a2782
    int windowBits
Packit Service 4a2782
    uLong bufsize
Packit Service 4a2782
    SV * dictionary
Packit Service 4a2782
  ALIAS:
Packit Service 4a2782
    _inflateScanInit = 1
Packit Service 4a2782
  PPCODE:
Packit Service 4a2782
 
Packit Service 4a2782
    int err = Z_OK ;
Packit Service 4a2782
    inflateStream s ;
Packit Service 4a2782
#ifndef MAGIC_APPEND
Packit Service 4a2782
    if (ix == 1)
Packit Service 4a2782
        croak("inflateScanInit needs zlib 1.2.1 or better");
Packit Service 4a2782
#endif
Packit Service 4a2782
    if (trace)
Packit Service 4a2782
        warn("in _inflateInit(windowBits=%d, bufsize=%lu, dictionary=%lu\n",
Packit Service 4a2782
                windowBits, bufsize, (unsigned long)SvCUR(dictionary)) ;
Packit Service 4a2782
    if ((s = InitStream() )) {
Packit Service 4a2782
Packit Service 4a2782
        s->WindowBits = windowBits;
Packit Service 4a2782
Packit Service 4a2782
        err = inflateInit2(&(s->stream), windowBits);
Packit Service 4a2782
        if (err != Z_OK) {
Packit Service 4a2782
            Safefree(s) ;
Packit Service 4a2782
            s = NULL ;
Packit Service 4a2782
	}
Packit Service 4a2782
	else if (sv_len(dictionary)) {
Packit Service 4a2782
#ifdef AT_LEAST_ZLIB_1_2_2_1
Packit Service 4a2782
        /* Zlib 1.2.2.1 or better allows a dictionary with raw inflate */
Packit Service 4a2782
        if (s->WindowBits < 0) {
Packit Service 4a2782
            STRLEN dlen;
Packit Service 4a2782
            const Bytef* b = (const Bytef*)SvPVbyte(dictionary, dlen);
Packit Service 4a2782
            err = inflateSetDictionary(&(s->stream), 
Packit Service 4a2782
                b, dlen);
Packit Service 4a2782
            if (err != Z_OK) {
Packit Service 4a2782
                Safefree(s) ;
Packit Service 4a2782
                s = NULL ;
Packit Service 4a2782
            }
Packit Service 4a2782
        }
Packit Service 4a2782
        else
Packit Service 4a2782
#endif
Packit Service 4a2782
            /* Dictionary specified - take a copy for use in inflate */
Packit Service 4a2782
	    s->dictionary = newSVsv(dictionary) ;
Packit Service 4a2782
	}
Packit Service 4a2782
	if (s) {
Packit Service 4a2782
	    PostInitStream(s, flags, bufsize, windowBits) ;
Packit Service 4a2782
#ifdef MAGIC_APPEND
Packit Service 4a2782
            if (ix == 1)
Packit Service 4a2782
            {
Packit Service 4a2782
                s->window = (unsigned char *)safemalloc(WINDOW_SIZE);
Packit Service 4a2782
            }
Packit Service 4a2782
#endif
Packit Service 4a2782
        }
Packit Service 4a2782
    }
Packit Service 4a2782
    else
Packit Service 4a2782
	err = Z_MEM_ERROR ;
Packit Service 4a2782
Packit Service 4a2782
    {
Packit Service 4a2782
        SV* obj = sv_setref_pv(sv_newmortal(), 
Packit Service 4a2782
                   ix == 1 
Packit Service 4a2782
                   ? "Compress::Raw::Zlib::inflateScanStream" 
Packit Service 4a2782
                   :  "Compress::Raw::Zlib::inflateStream",
Packit Service 4a2782
                   (void*)s);
Packit Service 4a2782
        XPUSHs(obj);
Packit Service 4a2782
    }
Packit Service 4a2782
    if (GIMME == G_ARRAY) {
Packit Service 4a2782
        SV * sv = sv_2mortal(newSViv(err)) ;
Packit Service 4a2782
	setDUALstatus(sv, err);
Packit Service 4a2782
        XPUSHs(sv) ;
Packit Service 4a2782
    }
Packit Service 4a2782
 
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib::deflateStream
Packit Service 4a2782
Packit Service 4a2782
void
Packit Service 4a2782
DispStream(s, message=NULL)
Packit Service 4a2782
    Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    const char *  message
Packit Service 4a2782
Packit Service 4a2782
DualType
Packit Service 4a2782
deflateReset(s)
Packit Service 4a2782
    Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
  CODE:
Packit Service 4a2782
      RETVAL = deflateReset(&(s->stream)) ;
Packit Service 4a2782
      if (RETVAL == Z_OK) {
Packit Service 4a2782
	  PostInitStream(s, s->flags, s->bufsize, s->WindowBits) ;
Packit Service 4a2782
      }
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
      RETVAL
Packit Service 4a2782
Packit Service 4a2782
DualType 
Packit Service 4a2782
deflate (s, buf, output)
Packit Service 4a2782
    Compress::Raw::Zlib::deflateStream	s
Packit Service 4a2782
    SV *	buf
Packit Service 4a2782
    SV * 	output 
Packit Service 4a2782
    uInt	cur_length = NO_INIT
Packit Service 4a2782
    uInt	increment = NO_INIT
Packit Service 4a2782
    uInt	prefix    = NO_INIT
Packit Service 4a2782
    int		RETVAL = 0;
Packit Service 4a2782
    uLong     bufinc = NO_INIT
Packit Service 4a2782
    STRLEN    origlen = NO_INIT
Packit Service 4a2782
  CODE:
Packit Service 4a2782
    bufinc = s->bufsize;
Packit Service 4a2782
Packit Service 4a2782
    /* If the input buffer is a reference, dereference it */
Packit Service 4a2782
    buf = deRef(buf, "deflate") ;
Packit Service 4a2782
 
Packit Service 4a2782
    /* initialise the input buffer */
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
    if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1))
Packit Service 4a2782
         croak("Wide character in Compress::Raw::Zlib::Deflate::deflate input parameter");
Packit Service 4a2782
#endif         
Packit Service 4a2782
    s->stream.next_in = (Bytef*)SvPV_nomg(buf, origlen) ;
Packit Service 4a2782
    s->stream.avail_in = origlen;
Packit Service 4a2782
    
Packit Service 4a2782
    if (s->flags & FLAG_CRC32)
Packit Service 4a2782
        s->crc32 = crc32(s->crc32, s->stream.next_in, s->stream.avail_in) ;
Packit Service 4a2782
Packit Service 4a2782
    if (s->flags & FLAG_ADLER32)
Packit Service 4a2782
        s->adler32 = adler32(s->adler32, s->stream.next_in, s->stream.avail_in) ;
Packit Service 4a2782
Packit Service 4a2782
    /* and retrieve the output buffer */
Packit Service 4a2782
    output = deRef_l(output, "deflate") ;
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
    if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1))
Packit Service 4a2782
         croak("Wide character in Compress::Raw::Zlib::Deflate::deflate output parameter");
Packit Service 4a2782
#endif         
Packit Service 4a2782
Packit Service 4a2782
    if((s->flags & FLAG_APPEND) != FLAG_APPEND) {
Packit Service 4a2782
        SvCUR_set(output, 0);
Packit Service 4a2782
        /* sv_setpvn(output, "", 0); */
Packit Service 4a2782
    }
Packit Service 4a2782
    prefix = cur_length =  SvCUR(output) ;
Packit Service 4a2782
    s->stream.next_out = (Bytef*) SvPVX(output) + cur_length;
Packit Service 4a2782
    increment =  SvLEN(output) -  cur_length;
Packit Service 4a2782
    s->stream.avail_out =  increment;
Packit Service 4a2782
#ifdef SETP_BYTE
Packit Service 4a2782
    /* Check for saved output from deflateParams */
Packit Service 4a2782
    if (s->deflateParams_out_valid) {
Packit Service 4a2782
	*(s->stream.next_out) = s->deflateParams_out_byte;
Packit Service 4a2782
	++ s->stream.next_out;
Packit Service 4a2782
	-- s->stream.avail_out ;
Packit Service 4a2782
	s->deflateParams_out_valid = FALSE;
Packit Service 4a2782
    }
Packit Service 4a2782
#else
Packit Service 4a2782
    /* Check for saved output from deflateParams */
Packit Service 4a2782
    if (s->deflateParams_out_length) {
Packit Service 4a2782
        uLong plen = s->deflateParams_out_length ;
Packit Service 4a2782
        /* printf("Copy %lu bytes saved data\n", plen); */
Packit Service 4a2782
        if (s->stream.avail_out < plen) {
Packit Service 4a2782
            /* printf("GROW from %d to %lu\n", s->stream.avail_out,
Packit Service 4a2782
                        SvLEN(output) + plen - s->stream.avail_out);  */
Packit Service 4a2782
             s->stream.next_out = (Bytef*) Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ;
Packit Service 4a2782
             s->stream.next_out += cur_length;
Packit Service 4a2782
        }
Packit Service 4a2782
        
Packit Service 4a2782
        Copy(s->deflateParams_out_buffer, s->stream.next_out, plen, Bytef) ;	
Packit Service 4a2782
        cur_length += plen;
Packit Service 4a2782
        SvCUR_set(output, cur_length);
Packit Service 4a2782
        s->stream.next_out += plen ;
Packit Service 4a2782
        s->stream.avail_out = SvLEN(output) - cur_length ;
Packit Service 4a2782
        increment = s->stream.avail_out;
Packit Service 4a2782
Packit Service 4a2782
        s->deflateParams_out_length = 0;
Packit Service 4a2782
        Safefree(s->deflateParams_out_buffer);
Packit Service 4a2782
        s->deflateParams_out_buffer = NULL;
Packit Service 4a2782
    }
Packit Service 4a2782
#endif
Packit Service 4a2782
    RETVAL = Z_OK ;
Packit Service 4a2782
    while (s->stream.avail_in != 0) {
Packit Service 4a2782
Packit Service 4a2782
        if (s->stream.avail_out == 0) {
Packit Service 4a2782
	    /* out of space in the output buffer so make it bigger */
Packit Service 4a2782
            s->stream.next_out = (Bytef*) Sv_Grow(output, SvLEN(output) + bufinc) ;
Packit Service 4a2782
            cur_length += increment ;
Packit Service 4a2782
            s->stream.next_out += cur_length ;
Packit Service 4a2782
            increment = bufinc ;
Packit Service 4a2782
            s->stream.avail_out = increment;
Packit Service 4a2782
            bufinc *= 2 ;
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        if (trace) {
Packit Service 4a2782
          printf("DEFLATE Avail In %d, Out %d\n", s->stream.avail_in, s->stream.avail_out); 
Packit Service 4a2782
          DispStream(s, "BEFORE");
Packit Service 4a2782
          /* Perl_sv_dump(output); */
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        RETVAL = deflate(&(s->stream), Z_NO_FLUSH);
Packit Service 4a2782
        /*
Packit Service 4a2782
        if (RETVAL != Z_STREAM_ERROR) {
Packit Service 4a2782
            int done = increment -  s->stream.avail_out ;
Packit Service 4a2782
            printf("std DEFLATEr returned %d '%s'  avail in %d, out %d wrote %d\n", RETVAL,
Packit Service 4a2782
            GetErrorString(RETVAL), s->stream.avail_in,
Packit Service 4a2782
s->stream.avail_out, done); 
Packit Service 4a2782
        }
Packit Service 4a2782
        */
Packit Service 4a2782
    
Packit Service 4a2782
        if (trace) {
Packit Service 4a2782
            printf("DEFLATE returned %d %s, avail in %d, out %d\n", RETVAL,
Packit Service 4a2782
           GetErrorString(RETVAL), s->stream.avail_in, s->stream.avail_out); 
Packit Service 4a2782
            DispStream(s, "AFTER");
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        if (RETVAL != Z_OK) 
Packit Service 4a2782
            break;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    s->compressedBytes += cur_length + increment - prefix - s->stream.avail_out ;
Packit Service 4a2782
    s->uncompressedBytes  += origlen - s->stream.avail_in  ;
Packit Service 4a2782
Packit Service 4a2782
    s->last_error = RETVAL ;
Packit Service 4a2782
    if (RETVAL == Z_OK) {
Packit Service 4a2782
        SvPOK_only(output);
Packit Service 4a2782
        SvCUR_set(output, cur_length + increment - s->stream.avail_out) ;
Packit Service 4a2782
        SvSETMAGIC(output);
Packit Service 4a2782
    }
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
  
Packit Service 4a2782
Packit Service 4a2782
void
Packit Service 4a2782
DESTROY(s)
Packit Service 4a2782
    Compress::Raw::Zlib::deflateStream	s
Packit Service 4a2782
  CODE:
Packit Service 4a2782
    if (trace)
Packit Service 4a2782
        printf("Compress::Raw::Zlib::deflateStream::DESTROY %p\n", s);
Packit Service 4a2782
    deflateEnd(&s->stream) ;
Packit Service 4a2782
    if (s->dictionary)
Packit Service 4a2782
	SvREFCNT_dec(s->dictionary) ;
Packit Service 4a2782
#ifndef SETP_BYTE
Packit Service 4a2782
    if (s->deflateParams_out_buffer)
Packit Service 4a2782
        Safefree(s->deflateParams_out_buffer);
Packit Service 4a2782
#endif
Packit Service 4a2782
    Safefree(s) ;
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
DualType
Packit Service 4a2782
flush(s, output, f=Z_FINISH)
Packit Service 4a2782
    Compress::Raw::Zlib::deflateStream	s
Packit Service 4a2782
    SV * output 
Packit Service 4a2782
    int  f
Packit Service 4a2782
    uInt	cur_length = NO_INIT
Packit Service 4a2782
    uInt	increment = NO_INIT
Packit Service 4a2782
    uInt	prefix    = NO_INIT
Packit Service 4a2782
    uLong     bufinc = NO_INIT
Packit Service 4a2782
    uLong     availableout = NO_INIT    
Packit Service 4a2782
  CODE:
Packit Service 4a2782
    bufinc = s->bufsize;
Packit Service 4a2782
    
Packit Service 4a2782
  
Packit Service 4a2782
  
Packit Service 4a2782
    /* retrieve the output buffer */
Packit Service 4a2782
    output = deRef_l(output, "flush") ;
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
    if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1))
Packit Service 4a2782
         croak("Wide character in Compress::Raw::Zlib::Deflate::flush input parameter");
Packit Service 4a2782
#endif         
Packit Service 4a2782
    if((s->flags & FLAG_APPEND) != FLAG_APPEND) {
Packit Service 4a2782
        SvCUR_set(output, 0);
Packit Service 4a2782
        /* sv_setpvn(output, "", 0); */
Packit Service 4a2782
    }
Packit Service 4a2782
    prefix = cur_length =  SvCUR(output) ;
Packit Service 4a2782
    s->stream.next_out = (Bytef*) SvPVX(output) + cur_length;
Packit Service 4a2782
    increment =  SvLEN(output) -  cur_length;
Packit Service 4a2782
    s->stream.avail_out =  increment;
Packit Service 4a2782
#ifdef SETP_BYTE
Packit Service 4a2782
    /* Check for saved output from deflateParams */
Packit Service 4a2782
    if (s->deflateParams_out_valid) {
Packit Service 4a2782
	*(s->stream.next_out) = s->deflateParams_out_byte;
Packit Service 4a2782
	++ s->stream.next_out;
Packit Service 4a2782
	-- s->stream.avail_out ;
Packit Service 4a2782
	s->deflateParams_out_valid = FALSE;
Packit Service 4a2782
    }
Packit Service 4a2782
#else
Packit Service 4a2782
    /* Check for saved output from deflateParams */
Packit Service 4a2782
    if (s->deflateParams_out_length) {
Packit Service 4a2782
        uLong plen = s->deflateParams_out_length ;
Packit Service 4a2782
        /* printf("Copy %lu bytes saved data\n", plen); */
Packit Service 4a2782
        if (s->stream.avail_out < plen) {
Packit Service 4a2782
            /* printf("GROW from %d to %lu\n", s->stream.avail_out, 
Packit Service 4a2782
                        SvLEN(output) + plen - s->stream.avail_out); */
Packit Service 4a2782
            s->stream.next_out = (Bytef*) Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ;
Packit Service 4a2782
            s->stream.next_out += cur_length;
Packit Service 4a2782
        }
Packit Service 4a2782
        
Packit Service 4a2782
        Copy(s->deflateParams_out_buffer, s->stream.next_out, plen, Bytef) ;	
Packit Service 4a2782
        cur_length += plen;
Packit Service 4a2782
        SvCUR_set(output, cur_length);
Packit Service 4a2782
        s->stream.next_out += plen ;
Packit Service 4a2782
        s->stream.avail_out = SvLEN(output) - cur_length ;
Packit Service 4a2782
        increment = s->stream.avail_out;
Packit Service 4a2782
Packit Service 4a2782
        s->deflateParams_out_length = 0;
Packit Service 4a2782
        Safefree(s->deflateParams_out_buffer);
Packit Service 4a2782
        s->deflateParams_out_buffer = NULL;
Packit Service 4a2782
    }
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
    for (;;) {
Packit Service 4a2782
        if (s->stream.avail_out == 0) {        
Packit Service 4a2782
            /* consumed all the available output, so extend it */
Packit Service 4a2782
            s->stream.next_out = (Bytef*) Sv_Grow(output, SvLEN(output) + bufinc) ;
Packit Service 4a2782
            cur_length += increment ;
Packit Service 4a2782
            s->stream.next_out += cur_length ;
Packit Service 4a2782
            increment = bufinc ;
Packit Service 4a2782
            s->stream.avail_out = increment;
Packit Service 4a2782
            bufinc *= 2 ;
Packit Service 4a2782
        }
Packit Service 4a2782
        
Packit Service 4a2782
        availableout = s->stream.avail_out ;
Packit Service 4a2782
        
Packit Service 4a2782
        if (trace) {
Packit Service 4a2782
          printf("flush (%d) DEFLATE Avail In %d, Out %d\n", f, s->stream.avail_in, s->stream.avail_out); 
Packit Service 4a2782
          DispStream(s, "BEFORE");
Packit Service 4a2782
          /* Perl_sv_dump(output); */
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        RETVAL = deflate(&(s->stream), f);
Packit Service 4a2782
        /*
Packit Service 4a2782
        if (RETVAL != Z_STREAM_ERROR) {
Packit Service 4a2782
            int done = availableout -  s->stream.avail_out ;
Packit Service 4a2782
            printf("flush DEFLATEr returned %d '%s'  avail in %d, out %d wrote %d\n", RETVAL,
Packit Service 4a2782
            GetErrorString(RETVAL), s->stream.avail_in,
Packit Service 4a2782
s->stream.avail_out, done);
Packit Service 4a2782
        }
Packit Service 4a2782
        */
Packit Service 4a2782
    
Packit Service 4a2782
        if (trace) {
Packit Service 4a2782
            printf("flush DEFLATE returned %d '%s', avail in %d, out %d\n", RETVAL,
Packit Service 4a2782
            GetErrorString(RETVAL), s->stream.avail_in, s->stream.avail_out); 
Packit Service 4a2782
            DispStream(s, "AFTER");
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        /* Ignore the second of two consecutive flushes: */
Packit Service 4a2782
        if (availableout == s->stream.avail_out && RETVAL == Z_BUF_ERROR) 
Packit Service 4a2782
            RETVAL = Z_OK; 
Packit Service 4a2782
        
Packit Service 4a2782
        /* deflate has finished flushing only when it hasn't used up
Packit Service 4a2782
         * all the available space in the output buffer: 
Packit Service 4a2782
         */
Packit Service 4a2782
        if (s->stream.avail_out != 0 || RETVAL != Z_OK )
Packit Service 4a2782
            break;
Packit Service 4a2782
    }
Packit Service 4a2782
  
Packit Service 4a2782
    RETVAL =  (RETVAL == Z_STREAM_END ? Z_OK : RETVAL) ;
Packit Service 4a2782
    s->last_error = RETVAL ;
Packit Service 4a2782
Packit Service 4a2782
    s->compressedBytes    += cur_length + increment - prefix - s->stream.avail_out ;
Packit Service 4a2782
  
Packit Service 4a2782
    if (RETVAL == Z_OK) {
Packit Service 4a2782
        SvPOK_only(output);
Packit Service 4a2782
        SvCUR_set(output, cur_length + increment - s->stream.avail_out) ;
Packit Service 4a2782
        SvSETMAGIC(output);
Packit Service 4a2782
    }
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
DualType
Packit Service 4a2782
_deflateParams(s, flags, level, strategy, bufsize)
Packit Service 4a2782
  	Compress::Raw::Zlib::deflateStream	s
Packit Service 4a2782
	int 	flags
Packit Service 4a2782
	int	level
Packit Service 4a2782
	int	strategy
Packit Service 4a2782
    	uLong	bufsize
Packit Service 4a2782
	bool changed = FALSE;
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        /* printf("_deflateParams(Flags %d Level %d Strategy %d Bufsize %d)\n", flags, level, strategy, bufsize); 
Packit Service 4a2782
        printf("Before -- Level %d, Strategy %d, Bufsize %d\n", s->Level, s->Strategy, s->bufsize); */
Packit Service 4a2782
        if (flags & 1 && level != s->Level) {
Packit Service 4a2782
            s->Level = level ;
Packit Service 4a2782
            changed = TRUE;
Packit Service 4a2782
        }
Packit Service 4a2782
        if (flags & 2 && strategy != s->Strategy) {
Packit Service 4a2782
            s->Strategy = strategy ;
Packit Service 4a2782
            changed = TRUE;
Packit Service 4a2782
        }
Packit Service 4a2782
        if (flags & 4)
Packit Service 4a2782
            s->bufsize = bufsize; 
Packit Service 4a2782
        if (changed) {
Packit Service 4a2782
#ifdef SETP_BYTE
Packit Service 4a2782
            s->stream.avail_in = 0; 
Packit Service 4a2782
            s->stream.next_out = &(s->deflateParams_out_byte) ;
Packit Service 4a2782
            s->stream.avail_out = 1;
Packit Service 4a2782
            RETVAL = deflateParams(&(s->stream), s->Level, s->Strategy);
Packit Service 4a2782
            s->deflateParams_out_valid = 
Packit Service 4a2782
            (RETVAL == Z_OK && s->stream.avail_out == 0) ;
Packit Service 4a2782
#else
Packit Service 4a2782
            /* printf("Level %d Strategy %d, Prev Len %d\n", 
Packit Service 4a2782
                s->Level, s->Strategy, s->deflateParams_out_length); */
Packit Service 4a2782
            RETVAL = flushParams(s);
Packit Service 4a2782
#endif
Packit Service 4a2782
        }
Packit Service 4a2782
        else
Packit Service 4a2782
            RETVAL = Z_OK;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
        RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
int
Packit Service 4a2782
get_Level(s)
Packit Service 4a2782
        Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->Level ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
int
Packit Service 4a2782
get_Strategy(s)
Packit Service 4a2782
        Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->Strategy ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
get_Bufsize(s)
Packit Service 4a2782
        Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->bufsize ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
int
Packit Service 4a2782
status(s)
Packit Service 4a2782
        Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->last_error ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
crc32(s)
Packit Service 4a2782
        Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->crc32 ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
dict_adler(s)
Packit Service 4a2782
        Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->dict_adler ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
adler32(s)
Packit Service 4a2782
        Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->adler32 ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
compressedBytes(s)
Packit Service 4a2782
    Compress::Raw::Zlib::deflateStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->compressedBytes;
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
uncompressedBytes(s)
Packit Service 4a2782
    Compress::Raw::Zlib::deflateStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->uncompressedBytes;
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
total_in(s)
Packit Service 4a2782
        Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->stream.total_in ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
total_out(s)
Packit Service 4a2782
        Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->stream.total_out ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
char*
Packit Service 4a2782
msg(s)
Packit Service 4a2782
        Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->stream.msg;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
int 
Packit Service 4a2782
deflateTune(s, good_length, max_lazy, nice_length, max_chain)
Packit Service 4a2782
            Compress::Raw::Zlib::deflateStream   s
Packit Service 4a2782
            int good_length
Packit Service 4a2782
            int max_lazy
Packit Service 4a2782
            int nice_length
Packit Service 4a2782
            int max_chain
Packit Service 4a2782
    CODE:
Packit Service 4a2782
#ifndef AT_LEAST_ZLIB_1_2_2_3
Packit Service 4a2782
        good_length = good_length; max_lazy = max_lazy ; /* Silence -Wall */
Packit Service 4a2782
        nice_length = nice_length; max_chain = max_chain; /* Silence -Wall */
Packit Service 4a2782
        croak("deflateTune needs zlib 1.2.2.3 or better");
Packit Service 4a2782
#else
Packit Service 4a2782
	RETVAL = deflateTune(&(s->stream), good_length, max_lazy, nice_length, max_chain);
Packit Service 4a2782
#endif
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
    
Packit Service 4a2782
Packit Service 4a2782
MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib::inflateStream
Packit Service 4a2782
Packit Service 4a2782
void
Packit Service 4a2782
DispStream(s, message=NULL)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
    const char *  message
Packit Service 4a2782
Packit Service 4a2782
DualType
Packit Service 4a2782
inflateReset(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
  CODE:
Packit Service 4a2782
      RETVAL = inflateReset(&(s->stream)) ;
Packit Service 4a2782
      if (RETVAL == Z_OK) {
Packit Service 4a2782
	  PostInitStream(s, s->flags, s->bufsize, s->WindowBits) ;
Packit Service 4a2782
      }
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
      RETVAL
Packit Service 4a2782
Packit Service 4a2782
DualType 
Packit Service 4a2782
inflate (s, buf, output, eof=FALSE)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateStream	s
Packit Service 4a2782
    SV *	buf
Packit Service 4a2782
    SV * 	output 
Packit Service 4a2782
    bool 	eof 
Packit Service 4a2782
    uInt	cur_length = 0;
Packit Service 4a2782
    uInt	prefix_length = 0;
Packit Service 4a2782
    int	    increment = 0;
Packit Service 4a2782
    uLong   bufinc = NO_INIT
Packit Service 4a2782
    STRLEN  na = NO_INIT ;
Packit Service 4a2782
  PREINIT:
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
    bool	out_utf8  = FALSE;
Packit Service 4a2782
#endif    
Packit Service 4a2782
    STRLEN	origlen;
Packit Service 4a2782
  CODE: 
Packit Service 4a2782
    bufinc = s->bufsize;
Packit Service 4a2782
    /* If the buffer is a reference, dereference it */
Packit Service 4a2782
    buf = deRef(buf, "inflate") ;
Packit Service 4a2782
Packit Service 4a2782
    if (s->flags & FLAG_CONSUME_INPUT) {
Packit Service 4a2782
        if (SvREADONLY(buf))
Packit Service 4a2782
            croak("Compress::Raw::Zlib::Inflate::inflate input parameter cannot be read-only when ConsumeInput is specified");
Packit Service 4a2782
        SvPV_force(buf, na);
Packit Service 4a2782
    }
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
    if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1))
Packit Service 4a2782
         croak("Wide character in Compress::Raw::Zlib::Inflate::inflate input parameter");
Packit Service 4a2782
#endif         
Packit Service 4a2782
    
Packit Service 4a2782
    /* initialise the input buffer */
Packit Service 4a2782
    s->stream.next_in = (Bytef*)SvPV_nomg(buf, origlen) ;
Packit Service 4a2782
    s->stream.avail_in = origlen ;
Packit Service 4a2782
	
Packit Service 4a2782
    /* and retrieve the output buffer */
Packit Service 4a2782
    output = deRef_l(output, "inflate") ;
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
    if (DO_UTF8(output))
Packit Service 4a2782
         out_utf8 = TRUE ;
Packit Service 4a2782
    if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1))
Packit Service 4a2782
         croak("Wide character in Compress::Raw::Zlib::Inflate::inflate output parameter");
Packit Service 4a2782
#endif         
Packit Service 4a2782
    if((s->flags & FLAG_APPEND) != FLAG_APPEND) {
Packit Service 4a2782
        SvCUR_set(output, 0);
Packit Service 4a2782
    }
Packit Service 4a2782
   
Packit Service 4a2782
    /* Assume no output buffer - the code below will update if there is any available */
Packit Service 4a2782
    s->stream.avail_out = 0;
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
    if (SvLEN(output)) {
Packit Service 4a2782
        prefix_length = cur_length =  SvCUR(output) ;
Packit Service 4a2782
    
Packit Service 4a2782
        if (s->flags & FLAG_LIMIT_OUTPUT && SvLEN(output) - cur_length - 1 < bufinc)
Packit Service 4a2782
        {
Packit Service 4a2782
            Sv_Grow(output, bufinc + cur_length + 1) ;
Packit Service 4a2782
        }
Packit Service 4a2782
    
Packit Service 4a2782
        /* Only setup the stream output pointers if there is spare 
Packit Service 4a2782
           capacity in the outout SV
Packit Service 4a2782
        */
Packit Service 4a2782
        if (SvLEN(output) > cur_length + 1)
Packit Service 4a2782
        {
Packit Service 4a2782
            s->stream.next_out = (Bytef*) SvPV_nomg_nolen(output) + cur_length;
Packit Service 4a2782
            increment = SvLEN(output) -  cur_length - 1;
Packit Service 4a2782
            s->stream.avail_out = increment;
Packit Service 4a2782
        }
Packit Service 4a2782
    }
Packit Service 4a2782
    
Packit Service 4a2782
Packit Service 4a2782
    s->bytesInflated = 0;
Packit Service 4a2782
    
Packit Service 4a2782
    RETVAL = Z_OK;
Packit Service 4a2782
Packit Service 4a2782
    while (RETVAL == Z_OK) {
Packit Service 4a2782
        if (s->stream.avail_out == 0) {
Packit Service 4a2782
	    /* out of space in the output buffer so make it bigger */
Packit Service 4a2782
            s->stream.next_out = (Bytef*) Sv_Grow(output, SvLEN(output) + bufinc +1) ;
Packit Service 4a2782
            cur_length += increment ;
Packit Service 4a2782
            s->stream.next_out += cur_length ;
Packit Service 4a2782
            increment = bufinc ;
Packit Service 4a2782
            s->stream.avail_out = increment;
Packit Service 4a2782
            bufinc *= 2 ; 
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        /* printf("INFLATE Availl In %d, Out %d\n", s->stream.avail_in,
Packit Service 4a2782
 s->stream.avail_out); 
Packit Service 4a2782
DispStream(s, "BEFORE");
Packit Service 4a2782
Perl_sv_dump(output); */
Packit Service 4a2782
        RETVAL = inflate(&(s->stream), Z_SYNC_FLUSH);
Packit Service 4a2782
        /* printf("INFLATE returned %d %s, avail in %d, out %d\n", RETVAL,
Packit Service 4a2782
 GetErrorString(RETVAL), s->stream.avail_in, s->stream.avail_out); */
Packit Service 4a2782
Packit Service 4a2782
    
Packit Service 4a2782
        if (RETVAL == Z_NEED_DICT && s->dictionary) {
Packit Service 4a2782
            STRLEN dlen;
Packit Service 4a2782
            const Bytef* b = (const Bytef*)SvPV(s->dictionary, dlen) ;
Packit Service 4a2782
            s->dict_adler = s->stream.adler ;
Packit Service 4a2782
            RETVAL = inflateSetDictionary(&(s->stream), 
Packit Service 4a2782
                b, dlen);
Packit Service 4a2782
            if (RETVAL == Z_OK)
Packit Service 4a2782
                continue;
Packit Service 4a2782
        }
Packit Service 4a2782
        
Packit Service 4a2782
        if (s->flags & FLAG_LIMIT_OUTPUT && 
Packit Service 4a2782
                (RETVAL == Z_OK || RETVAL == Z_BUF_ERROR )) {
Packit Service 4a2782
            if (s->stream.avail_out == 0)
Packit Service 4a2782
                RETVAL = Z_BUF_ERROR;
Packit Service 4a2782
            break;
Packit Service 4a2782
        }
Packit Service 4a2782
        if (s->flags & FLAG_LIMIT_OUTPUT && 
Packit Service 4a2782
                (RETVAL == Z_OK || RETVAL == Z_BUF_ERROR ))
Packit Service 4a2782
            break;
Packit Service 4a2782
Packit Service 4a2782
        if (RETVAL == Z_STREAM_ERROR || RETVAL == Z_MEM_ERROR ||
Packit Service 4a2782
            RETVAL == Z_DATA_ERROR   || RETVAL == Z_STREAM_END )
Packit Service 4a2782
            break ;
Packit Service 4a2782
Packit Service 4a2782
        if (RETVAL == Z_BUF_ERROR) {
Packit Service 4a2782
            if (s->stream.avail_out == 0)
Packit Service 4a2782
                continue ;
Packit Service 4a2782
            if (s->stream.avail_in == 0) {
Packit Service 4a2782
                RETVAL = Z_OK ;
Packit Service 4a2782
                break ;
Packit Service 4a2782
            }
Packit Service 4a2782
        }
Packit Service 4a2782
    }
Packit Service 4a2782
#ifdef NEED_DUMMY_BYTE_AT_END 
Packit Service 4a2782
    if (eof && RETVAL == Z_OK && s->flags & FLAG_LIMIT_OUTPUT == 0) {
Packit Service 4a2782
        Bytef* nextIn =  s->stream.next_in;
Packit Service 4a2782
        uInt availIn =  s->stream.avail_in;
Packit Service 4a2782
        s->stream.next_in = (Bytef*) " ";
Packit Service 4a2782
        s->stream.avail_in = 1;
Packit Service 4a2782
        if (s->stream.avail_out == 0) {
Packit Service 4a2782
	    /* out of space in the output buffer so make it bigger */
Packit Service 4a2782
            s->stream.next_out = Sv_Grow(output, SvLEN(output) + bufinc) ;
Packit Service 4a2782
            cur_length += increment ;
Packit Service 4a2782
            s->stream.next_out += cur_length ;
Packit Service 4a2782
            increment = bufinc ;
Packit Service 4a2782
            s->stream.avail_out = increment;
Packit Service 4a2782
            bufinc *= 2 ;
Packit Service 4a2782
        }
Packit Service 4a2782
        RETVAL = inflate(&(s->stream), Z_SYNC_FLUSH);
Packit Service 4a2782
        s->stream.next_in = nextIn ;
Packit Service 4a2782
        s->stream.avail_in  = availIn ;
Packit Service 4a2782
    }
Packit Service 4a2782
#else
Packit Service 4a2782
    PERL_UNUSED_VAR(eof);
Packit Service 4a2782
#endif
Packit Service 4a2782
    
Packit Service 4a2782
    s->last_error = RETVAL ;
Packit Service 4a2782
    if (RETVAL == Z_OK || RETVAL == Z_STREAM_END || RETVAL == Z_BUF_ERROR || RETVAL == Z_DATA_ERROR) {
Packit Service 4a2782
	   unsigned in ;
Packit Service 4a2782
Packit Service 4a2782
        s->bytesInflated = cur_length + increment - s->stream.avail_out - prefix_length;
Packit Service 4a2782
        s->uncompressedBytes += s->bytesInflated ;
Packit Service 4a2782
        s->compressedBytes   += origlen - s->stream.avail_in  ;
Packit Service 4a2782
Packit Service 4a2782
        SvPOK_only(output);
Packit Service 4a2782
        SvCUR_set(output, prefix_length + s->bytesInflated) ;
Packit Service 4a2782
	*SvEND(output) = '\0';
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
        if (out_utf8)
Packit Service 4a2782
            sv_utf8_upgrade(output);
Packit Service 4a2782
#endif        
Packit Service 4a2782
        SvSETMAGIC(output);
Packit Service 4a2782
Packit Service 4a2782
        if (s->flags & FLAG_CRC32 )
Packit Service 4a2782
            s->crc32 = crc32(s->crc32, 
Packit Service 4a2782
				(const Bytef*)SvPVX(output)+prefix_length, 
Packit Service 4a2782
            			SvCUR(output)-prefix_length) ;
Packit Service 4a2782
Packit Service 4a2782
        if (s->flags & FLAG_ADLER32) 
Packit Service 4a2782
            s->adler32 = adler32(s->adler32, 
Packit Service 4a2782
				(const Bytef*)SvPVX(output)+prefix_length, 
Packit Service 4a2782
            			SvCUR(output)-prefix_length) ;
Packit Service 4a2782
Packit Service 4a2782
	/* fix the input buffer */
Packit Service 4a2782
	if (s->flags & FLAG_CONSUME_INPUT || s->flags & FLAG_LIMIT_OUTPUT) {
Packit Service 4a2782
	    in = s->stream.avail_in ;
Packit Service 4a2782
	    SvCUR_set(buf, in) ;
Packit Service 4a2782
	    if (in)
Packit Service 4a2782
	        Move(s->stream.next_in, SvPVX(buf), in, char) ;	
Packit Service 4a2782
            *SvEND(buf) = '\0';
Packit Service 4a2782
            SvSETMAGIC(buf);
Packit Service 4a2782
	}
Packit Service 4a2782
Packit Service 4a2782
    }
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
inflateCount(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->bytesInflated;
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
compressedBytes(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->compressedBytes;
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
uncompressedBytes(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->uncompressedBytes;
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
DualType 
Packit Service 4a2782
inflateSync (s, buf)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateStream	s
Packit Service 4a2782
    SV *	buf
Packit Service 4a2782
  CODE:
Packit Service 4a2782
  
Packit Service 4a2782
    /* If the buffer is a reference, dereference it */
Packit Service 4a2782
    buf = deRef(buf, "inflateSync") ;
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
    if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1))
Packit Service 4a2782
         croak("Wide character in Compress::Raw::Zlib::Inflate::inflateSync");
Packit Service 4a2782
#endif         
Packit Service 4a2782
    
Packit Service 4a2782
    /* initialise the input buffer */
Packit Service 4a2782
    s->stream.next_in = (Bytef*)SvPV_force_nomg_nolen(buf) ;
Packit Service 4a2782
    s->stream.avail_in = SvCUR(buf) ;
Packit Service 4a2782
	
Packit Service 4a2782
    /* inflateSync doesn't create any output */
Packit Service 4a2782
    s->stream.next_out = (Bytef*) NULL;
Packit Service 4a2782
    s->stream.avail_out = 0;
Packit Service 4a2782
Packit Service 4a2782
    RETVAL = inflateSync(&(s->stream));
Packit Service 4a2782
    s->last_error = RETVAL ;
Packit Service 4a2782
Packit Service 4a2782
    /* fix the input buffer */
Packit Service 4a2782
    {
Packit Service 4a2782
	unsigned in = s->stream.avail_in ;
Packit Service 4a2782
 	SvCUR_set(buf, in) ;
Packit Service 4a2782
 	if (in)
Packit Service 4a2782
     	    Move(s->stream.next_in, SvPVX(buf), in, char) ;	
Packit Service 4a2782
        *SvEND(buf) = '\0';
Packit Service 4a2782
        SvSETMAGIC(buf);
Packit Service 4a2782
    }
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
void
Packit Service 4a2782
DESTROY(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateStream	s
Packit Service 4a2782
  CODE:
Packit Service 4a2782
    inflateEnd(&s->stream) ;
Packit Service 4a2782
    if (s->dictionary)
Packit Service 4a2782
	SvREFCNT_dec(s->dictionary) ;
Packit Service 4a2782
#ifndef SETP_BYTE
Packit Service 4a2782
    if (s->deflateParams_out_buffer)
Packit Service 4a2782
        Safefree(s->deflateParams_out_buffer);
Packit Service 4a2782
#endif
Packit Service 4a2782
#ifdef MAGIC_APPEND
Packit Service 4a2782
    if (s->window)
Packit Service 4a2782
        Safefree(s->window);
Packit Service 4a2782
#endif
Packit Service 4a2782
    Safefree(s) ;
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
status(s)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->last_error ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
crc32(s)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->crc32 ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
dict_adler(s)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->dict_adler ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
total_in(s)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->stream.total_in ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
adler32(s)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->adler32 ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
total_out(s)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->stream.total_out ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
char*
Packit Service 4a2782
msg(s)
Packit Service 4a2782
	Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->stream.msg;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
get_Bufsize(s)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->bufsize ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
bool
Packit Service 4a2782
set_Append(s, mode)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateStream   s
Packit Service 4a2782
	bool	mode
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = ((s->flags & FLAG_APPEND) == FLAG_APPEND);
Packit Service 4a2782
	if (mode)
Packit Service 4a2782
	    s->flags |= FLAG_APPEND ;
Packit Service 4a2782
	else
Packit Service 4a2782
	    s->flags &= ~FLAG_APPEND ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
        RETVAL
Packit Service 4a2782
Packit Service 4a2782
MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib::inflateScanStream
Packit Service 4a2782
Packit Service 4a2782
void
Packit Service 4a2782
DESTROY(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream	s
Packit Service 4a2782
  CODE:
Packit Service 4a2782
    inflateEnd(&s->stream) ;
Packit Service 4a2782
    if (s->dictionary)
Packit Service 4a2782
	SvREFCNT_dec(s->dictionary) ;
Packit Service 4a2782
#ifndef SETP_BYTE
Packit Service 4a2782
    if (s->deflateParams_out_buffer)
Packit Service 4a2782
        Safefree(s->deflateParams_out_buffer);
Packit Service 4a2782
#endif
Packit Service 4a2782
#ifdef MAGIC_APPEND
Packit Service 4a2782
    if (s->window)
Packit Service 4a2782
        Safefree(s->window);
Packit Service 4a2782
#endif
Packit Service 4a2782
    Safefree(s) ;
Packit Service 4a2782
Packit Service 4a2782
void
Packit Service 4a2782
DispStream(s, message=NULL)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream   s
Packit Service 4a2782
    const char *  message
Packit Service 4a2782
Packit Service 4a2782
DualType
Packit Service 4a2782
inflateReset(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream   s
Packit Service 4a2782
  CODE:
Packit Service 4a2782
      RETVAL = inflateReset(&(s->stream)) ;
Packit Service 4a2782
      if (RETVAL == Z_OK) {
Packit Service 4a2782
	  PostInitStream(s, s->flags, s->bufsize, s->WindowBits) ;
Packit Service 4a2782
      }
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
      RETVAL
Packit Service 4a2782
Packit Service 4a2782
DualType 
Packit Service 4a2782
scan(s, buf, out=NULL, eof=FALSE)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream	s
Packit Service 4a2782
    SV *	buf
Packit Service 4a2782
    SV *	out
Packit Service 4a2782
    bool	eof
Packit Service 4a2782
    bool	eof_mode = FALSE;
Packit Service 4a2782
    int    start_len = NO_INIT
Packit Service 4a2782
  CODE:
Packit Service 4a2782
    PERL_UNUSED_VAR(out);
Packit Service 4a2782
    PERL_UNUSED_VAR(eof);
Packit Service 4a2782
    /* If the input buffer is a reference, dereference it */
Packit Service 4a2782
#ifndef MAGIC_APPEND
Packit Service 4a2782
        buf = buf;
Packit Service 4a2782
        croak("scan needs zlib 1.2.1 or better");
Packit Service 4a2782
#else
Packit Service 4a2782
    buf = deRef(buf, "inflateScan") ;
Packit Service 4a2782
#ifdef UTF8_AVAILABLE    
Packit Service 4a2782
    if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1))
Packit Service 4a2782
        croak("Wide character in Compress::Raw::Zlib::InflateScan::scan input parameter");
Packit Service 4a2782
#endif         
Packit Service 4a2782
    /* initialise the input buffer */
Packit Service 4a2782
    s->stream.next_in = (Bytef*)SvPV_force_nomg_nolen(buf) ;
Packit Service 4a2782
    s->stream.avail_in = SvCUR(buf) ;
Packit Service 4a2782
    start_len = s->stream.avail_in ;
Packit Service 4a2782
    s->bytesInflated = 0 ; 
Packit Service 4a2782
    do
Packit Service 4a2782
    {
Packit Service 4a2782
        if (s->stream.avail_in == 0) {
Packit Service 4a2782
            RETVAL = Z_OK ;
Packit Service 4a2782
            break ;
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        /* set up output to next available section of sliding window */
Packit Service 4a2782
        s->stream.avail_out = WINDOW_SIZE - s->window_have;
Packit Service 4a2782
        s->stream.next_out = s->window + s->window_have;
Packit Service 4a2782
Packit Service 4a2782
        /* DispStream(s, "before inflate\n"); */
Packit Service 4a2782
Packit Service 4a2782
        /* inflate and check for errors */
Packit Service 4a2782
        RETVAL = inflate(&(s->stream), Z_BLOCK);
Packit Service 4a2782
Packit Service 4a2782
        if (start_len > 1 && ! eof_mode)
Packit Service 4a2782
            s->window_lastByte = *(s->stream.next_in - 1 ) ;
Packit Service 4a2782
Packit Service 4a2782
        if (RETVAL == Z_STREAM_ERROR || RETVAL == Z_MEM_ERROR ||
Packit Service 4a2782
            RETVAL == Z_DATA_ERROR )
Packit Service 4a2782
            break ;
Packit Service 4a2782
Packit Service 4a2782
        if (s->flags & FLAG_CRC32 )
Packit Service 4a2782
            s->crc32 = crc32(s->crc32, s->window + s->window_have, 
Packit Service 4a2782
                             WINDOW_SIZE - s->window_have - s->stream.avail_out);
Packit Service 4a2782
Packit Service 4a2782
        if (s->flags & FLAG_ADLER32) 
Packit Service 4a2782
            s->adler32 = adler32(s->adler32, s->window + s->window_have, 
Packit Service 4a2782
                                 WINDOW_SIZE - s->window_have - s->stream.avail_out);
Packit Service 4a2782
Packit Service 4a2782
        s->uncompressedBytes =
Packit Service 4a2782
        s->bytesInflated += WINDOW_SIZE - s->window_have - s->stream.avail_out;
Packit Service 4a2782
Packit Service 4a2782
        if (s->stream.avail_out)
Packit Service 4a2782
            s->window_have = WINDOW_SIZE - s->stream.avail_out;
Packit Service 4a2782
        else {
Packit Service 4a2782
            s->window_have = 0;
Packit Service 4a2782
            s->window_full = 1;
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        /* process end of block */
Packit Service 4a2782
        if (s->stream.data_type & 128) {
Packit Service 4a2782
            if (s->stream.data_type & 64) {
Packit Service 4a2782
                s->window_left = s->stream.data_type & 0x1f;
Packit Service 4a2782
            }
Packit Service 4a2782
            else {
Packit Service 4a2782
                s->window_lastbit = s->stream.data_type & 0x1f;
Packit Service 4a2782
                s->lastBlockOffset = s->stream.total_in;
Packit Service 4a2782
            }
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
    } while (RETVAL != Z_STREAM_END);
Packit Service 4a2782
Packit Service 4a2782
    s->last_error = RETVAL ;
Packit Service 4a2782
    s->window_lastoff = s->stream.total_in ;
Packit Service 4a2782
    s->compressedBytes += SvCUR(buf) - s->stream.avail_in  ;
Packit Service 4a2782
Packit Service 4a2782
    if (RETVAL == Z_STREAM_END)
Packit Service 4a2782
    {
Packit Service 4a2782
        s->matchedEndBlock = 1 ;
Packit Service 4a2782
Packit Service 4a2782
        /* save the location of the end of the compressed data */
Packit Service 4a2782
        s->window_end = SvCUR(buf) - s->stream.avail_in - 1 ;
Packit Service 4a2782
        s->window_endOffset = s->stream.total_in ;
Packit Service 4a2782
        if (s->window_left)
Packit Service 4a2782
        {
Packit Service 4a2782
            -- s->window_endOffset ;
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        /* if window wrapped, build dictionary from window by rotating */
Packit Service 4a2782
        if (s->window_full) {
Packit Service 4a2782
            rotate(s->window, WINDOW_SIZE, s->window_have);
Packit Service 4a2782
            s->window_have = WINDOW_SIZE;
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        /* if (s->flags & FLAG_CONSUME_INPUT) { */
Packit Service 4a2782
        if (1) {
Packit Service 4a2782
            unsigned in = s->stream.avail_in ;
Packit Service 4a2782
            SvCUR_set(buf, in) ;
Packit Service 4a2782
            if (in)
Packit Service 4a2782
                Move(s->stream.next_in, SvPVX(buf), in, char) ;	
Packit Service 4a2782
            *SvEND(buf) = '\0';
Packit Service 4a2782
            SvSETMAGIC(buf);
Packit Service 4a2782
        }
Packit Service 4a2782
    }
Packit Service 4a2782
#endif
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
getEndOffset(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
#ifndef MAGIC_APPEND
Packit Service 4a2782
        croak("getEndOffset needs zlib 1.2.1 or better");
Packit Service 4a2782
#else
Packit Service 4a2782
        RETVAL = s->window_endOffset;
Packit Service 4a2782
#endif
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
inflateCount(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
#ifndef MAGIC_APPEND
Packit Service 4a2782
        croak("inflateCount needs zlib 1.2.1 or better");
Packit Service 4a2782
#else
Packit Service 4a2782
        RETVAL = s->bytesInflated;
Packit Service 4a2782
#endif
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
compressedBytes(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->compressedBytes;
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
uncompressedBytes(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
        RETVAL = s->uncompressedBytes;
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
getLastBlockOffset(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
#ifndef MAGIC_APPEND
Packit Service 4a2782
        croak("getLastBlockOffset needs zlib 1.2.1 or better");
Packit Service 4a2782
#else
Packit Service 4a2782
        RETVAL = s->lastBlockOffset - (s->window_lastbit != 0);
Packit Service 4a2782
#endif
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
getLastBufferOffset(s)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream	s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
#ifndef MAGIC_APPEND
Packit Service 4a2782
        croak("getLastBufferOffset needs zlib 1.2.1 or better");
Packit Service 4a2782
#else
Packit Service 4a2782
        RETVAL = s->window_lastoff;
Packit Service 4a2782
#endif
Packit Service 4a2782
  OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
void
Packit Service 4a2782
resetLastBlockByte(s, byte)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream	s
Packit Service 4a2782
    unsigned char*                      byte
Packit Service 4a2782
    CODE:
Packit Service 4a2782
#ifndef MAGIC_APPEND
Packit Service 4a2782
        croak("resetLastBlockByte needs zlib 1.2.1 or better");
Packit Service 4a2782
#else
Packit Service 4a2782
        if (byte != NULL)
Packit Service 4a2782
            *byte = *byte ^ (1 << ((8 - s->window_lastbit) & 7));
Packit Service 4a2782
#endif
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
void
Packit Service 4a2782
_createDeflateStream(inf_s, flags,level, method, windowBits, memLevel, strategy, bufsize)
Packit Service 4a2782
    Compress::Raw::Zlib::inflateScanStream	inf_s
Packit Service 4a2782
    int flags
Packit Service 4a2782
    int	level
Packit Service 4a2782
    int method
Packit Service 4a2782
    int windowBits
Packit Service 4a2782
    int memLevel
Packit Service 4a2782
    int strategy
Packit Service 4a2782
    uLong bufsize
Packit Service 4a2782
  PPCODE:
Packit Service 4a2782
  {
Packit Service 4a2782
#ifndef MAGIC_APPEND
Packit Service 4a2782
        flags = flags;
Packit Service 4a2782
        level = level ;
Packit Service 4a2782
        method = method;
Packit Service 4a2782
        windowBits = windowBits;
Packit Service 4a2782
        memLevel = memLevel;
Packit Service 4a2782
        strategy = strategy;
Packit Service 4a2782
        bufsize= bufsize;
Packit Service 4a2782
        croak("_createDeflateStream needs zlib 1.2.1 or better");
Packit Service 4a2782
#else
Packit Service 4a2782
    int err ;
Packit Service 4a2782
    deflateStream s ;
Packit Service 4a2782
Packit Service 4a2782
    if (trace)
Packit Service 4a2782
        warn("in _createDeflateStream(level=%d, method=%d, windowBits=%d, memLevel=%d, strategy=%d, bufsize=%lu\n",
Packit Service 4a2782
	level, method, windowBits, memLevel, strategy, bufsize) ;
Packit Service 4a2782
    if ((s = InitStream() )) {
Packit Service 4a2782
Packit Service 4a2782
        s->Level      = level;
Packit Service 4a2782
        s->Method     = method;
Packit Service 4a2782
        s->WindowBits = windowBits;
Packit Service 4a2782
        s->MemLevel   = memLevel;
Packit Service 4a2782
        s->Strategy   = strategy;
Packit Service 4a2782
Packit Service 4a2782
        err = deflateInit2(&(s->stream), level, 
Packit Service 4a2782
			   method, windowBits, memLevel, strategy);
Packit Service 4a2782
Packit Service 4a2782
	if (err == Z_OK) {
Packit Service 4a2782
	    err = deflateSetDictionary(&(s->stream), inf_s->window, inf_s->window_have);
Packit Service 4a2782
	    s->dict_adler = s->stream.adler ;
Packit Service 4a2782
	}
Packit Service 4a2782
Packit Service 4a2782
        if (err != Z_OK) {
Packit Service 4a2782
            Safefree(s) ;
Packit Service 4a2782
            s = NULL ;
Packit Service 4a2782
	}
Packit Service 4a2782
	else {
Packit Service 4a2782
	    PostInitStream(s, flags, bufsize, windowBits) ;
Packit Service 4a2782
            s->crc32            = inf_s->crc32;
Packit Service 4a2782
            s->adler32          = inf_s->adler32;
Packit Service 4a2782
            s->stream.adler     = inf_s->stream.adler ;
Packit Service 4a2782
            /* s->stream.total_out = inf_s->bytesInflated ; */
Packit Service 4a2782
            s->stream.total_in  = inf_s->stream.total_out ;
Packit Service 4a2782
            if (inf_s->window_left) {
Packit Service 4a2782
                /* printf("** window_left %d, window_lastByte %d\n", inf_s->window_left, inf_s->window_lastByte); */
Packit Service 4a2782
                deflatePrime(&(s->stream), 8 - inf_s->window_left, inf_s->window_lastByte);
Packit Service 4a2782
            }
Packit Service 4a2782
        }
Packit Service 4a2782
    }
Packit Service 4a2782
    else
Packit Service 4a2782
        err = Z_MEM_ERROR ;
Packit Service 4a2782
Packit Service 4a2782
    XPUSHs(sv_setref_pv(sv_newmortal(), 
Packit Service 4a2782
            "Compress::Raw::Zlib::deflateStream", (void*)s));
Packit Service 4a2782
    if (GIMME == G_ARRAY) {
Packit Service 4a2782
        SV * sv = sv_2mortal(newSViv(err)) ;
Packit Service 4a2782
        setDUALstatus(sv, err);
Packit Service 4a2782
        XPUSHs(sv) ;
Packit Service 4a2782
    }
Packit Service 4a2782
#endif
Packit Service 4a2782
  }
Packit Service 4a2782
Packit Service 4a2782
DualType
Packit Service 4a2782
status(s)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateScanStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->last_error ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
crc32(s)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateScanStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->crc32 ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
uLong
Packit Service 4a2782
adler32(s)
Packit Service 4a2782
        Compress::Raw::Zlib::inflateScanStream   s
Packit Service 4a2782
    CODE:
Packit Service 4a2782
	RETVAL = s->adler32 ;
Packit Service 4a2782
    OUTPUT:
Packit Service 4a2782
	RETVAL
Packit Service 4a2782