|
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 |
|