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

📄 zlib.xs

📁 perl中编译使用zlib
💻 XS
📖 第 1 页 / 共 2 页
字号:
	char *	path	char *	mode	CODE:	gzFile	gz = gzopen(path, mode) ;	SetGzErrorNo(errno ? Z_ERRNO : Z_MEM_ERROR) ;	if (gz) {	    RETVAL = (gzType*)safemalloc(sizeof(gzType)) ;	    /* RETVAL->buffer = newSVpv("", SIZE) ; */    	    RETVAL->buffer = newSV(SIZE) ;    	    SvPOK_only(RETVAL->buffer) ;    	    SvCUR_set(RETVAL->buffer, 0) ; 	    RETVAL->offset = 0 ;	    RETVAL->gz = gz ;	    RETVAL->closed = FALSE ;	}	else	    RETVAL = NULL ;	OUTPUT:	  RETVALCompress::Zlib::gzFilegzdopen_(fh, mode, offset)        int     fh        char *  mode        long    offset	CODE:        gzFile  gz ;        lseek(fh, offset, 0) ;         gz = gzdopen(fh, mode) ;        SetGzErrorNo(errno ? Z_ERRNO : Z_MEM_ERROR) ;        if (gz) {            RETVAL = (gzType*)safemalloc(sizeof(gzType)) ;            /* RETVAL->buffer = newSVpv("", SIZE) ; */            RETVAL->buffer = newSV(SIZE) ;            SvPOK_only(RETVAL->buffer) ;            SvCUR_set(RETVAL->buffer, 0) ;            RETVAL->offset = 0 ;            RETVAL->gz = gz ;        }        else            RETVAL = NULL ;        OUTPUT:          RETVALMODULE = Compress::Zlib	PACKAGE = Compress::Zlib::gzFile PREFIX = Zip_#define Zip_gzread(file, buf, len) gzread(file->gz, bufp, len)intZip_gzread(file, buf, len=4096)	Compress::Zlib::gzFile	file	unsigned	len	SV *		buf	voidp		bufp = NO_INIT	int		bufsize = 0 ;	CODE:	if (SvREADONLY(buf) && PL_curcop != &PL_compiling)            croak("gzread: buffer parameter is read-only");        if (!SvUPGRADE(buf, SVt_PV))            croak("cannot use buf argument as lvalue");        SvPOK_only(buf);        SvCUR_set(buf, 0);	/* any left over from gzreadline ? */	if ((bufsize = SvCUR(file->buffer)) > 0) {	    int movesize ;	    RETVAL = bufsize ;		    if (bufsize < len) {		movesize = bufsize ;	        len -= movesize ;	    }	    else {	        movesize = len ;	        len = 0 ;	    }       	    sv_catpvn(buf, SvPVX(file->buffer) + file->offset, movesize);	    file->offset += movesize ;	    SvCUR_set(file->buffer, bufsize - movesize) ;	}	if (len) {	    bufp = (Byte*)SvGROW(buf, bufsize+len+1);	    RETVAL = gzread(file->gz, ((Bytef*)bufp)+bufsize, len) ;	    SetGzError(file->gz) ;             if (RETVAL >= 0) {		RETVAL += bufsize ;                SvCUR_set(buf, RETVAL) ;                SvTAINT(buf) ;                *SvEND(buf) = '\0';            }	}	OUTPUT:	   RETVALintgzreadline(file, buf)	Compress::Zlib::gzFile	file	SV *		buf	CODE:	if (SvREADONLY(buf) && PL_curcop != &PL_compiling)             croak("gzreadline: buffer parameter is read-only");         if (!SvUPGRADE(buf, SVt_PV))            croak("cannot use buf argument as lvalue");        SvPOK_only(buf);	/* sv_setpvn(buf, "", SIZE) ; */        SvGROW(buf, SIZE) ;        SvCUR_set(buf, 0);	RETVAL = gzreadline(file, buf) ;	SetGzError(file->gz) ; 	OUTPUT:	  RETVAL	CLEANUP:        if (RETVAL >= 0) {            /* SvCUR(buf) = RETVAL; */            SvTAINT(buf) ;            /* *SvEND(buf) = '\0'; */        }#define Zip_gzwrite(file, buf) gzwrite(file->gz, buf, len)intZip_gzwrite(file, buf)	Compress::Zlib::gzFile	file	unsigned	len = NO_INIT	voidp 		buf = (voidp)SvPV(ST(1), len) ;	CLEANUP:	  SetGzError(file->gz) ;intZip_gzflush(file, flush)	Compress::Zlib::gzFile	file	int		flush	CLEANUP:	  SetGzError(file->gz) ;intZip_gzclose(file)	Compress::Zlib::gzFile		file	CLEANUP:	  file->closed = TRUE ;	  SetGzErrorNo(RETVAL) ;voidDESTROY(file)	Compress::Zlib::gzFile		file	CODE:	    if (! file->closed)	        Zip_gzclose(file) ;	    SvREFCNT_dec(file->buffer) ;	    safefree((char*)file) ;#define Zip_gzerror(file) (char*)gzerror(file->gz, &errnum)char *Zip_gzerror(file)	Compress::Zlib::gzFile	file	int		errnum = NO_INIT	CLEANUP:	    sv_setiv(ST(0), errnum) ;            SvPOK_on(ST(0)) ;MODULE = Compress::Zlib	PACKAGE = Compress::Zlib	PREFIX = Zip_BOOT:    adlerInitial = adler32(0L, Z_NULL, 0);    crcInitial   = crc32(0L, Z_NULL, 0);#define Zip_adler32(buf, adler) adler32(adler, buf, (uInt)len)uLongZip_adler32(buf, adler=adlerInitial)        uLong    adler = NO_INIT        STRLEN   len = NO_INIT        Bytef *  buf = NO_INIT	SV *	 sv = ST(0) ;	INIT:    	/* If the buffer is a reference, dereference it */	sv = deRef(sv, "adler32") ;	buf = (Byte*)SvPV(sv, len) ;	if (items < 2)	  adler = adlerInitial ;	else if (SvOK(ST(1)))	  adler = SvUV(ST(1)) ;	else	  adler = crcInitial ;  #define Zip_crc32(buf, crc) crc32(crc, buf, (uInt)len)uLongZip_crc32(buf, crc=crcInitial)        uLong    crc = NO_INIT        STRLEN   len = NO_INIT        Bytef *  buf = NO_INIT	SV *	 sv = ST(0) ;	INIT:    	/* If the buffer is a reference, dereference it */	sv = deRef(sv, "crc32") ;	buf = (Byte*)SvPV(sv, len) ;	if (items < 2)	  crc = crcInitial ;	else if (SvOK(ST(1)))	  crc = SvUV(ST(1)) ;	else	  crc = crcInitial ; MODULE = Compress::Zlib PACKAGE = Compress::Zlibvoid_deflateInit(level, method, windowBits, memLevel, strategy, bufsize, dictionary)    int	level    int method    int windowBits    int memLevel    int strategy    int bufsize    SV * dictionary  PPCODE:    int err ;    deflateStream s ;    if (trace)        warn("in _deflateInit(level=%d, method=%d, windowBits=%d, memLevel=%d, strategy=%d, bufsize=%d\n",	level, method, windowBits, memLevel, strategy, bufsize) ;    if (s = InitStream(bufsize) ) {        err = deflateInit2(&(s->stream), level, 			   method, windowBits, memLevel, strategy);	/* Check if a dictionary has been specified */	if (err == Z_OK && SvCUR(dictionary)) {	    err = deflateSetDictionary(&(s->stream), (const Bytef*) SvPVX(dictionary), 					SvCUR(dictionary)) ;	    s->dict_adler = s->stream.adler ;	}        if (err != Z_OK) {            Safefree(s) ;            s = NULL ;	}            }    else        err = Z_MEM_ERROR ;    XPUSHs(sv_setref_pv(sv_newmortal(), 	"Compress::Zlib::deflateStream", (void*)s));    if (GIMME == G_ARRAY)         XPUSHs(sv_2mortal(newSViv(err))) ;void_inflateInit(windowBits, bufsize, dictionary)    int windowBits    int bufsize    SV * dictionary  PPCODE:     int err = Z_OK ;    inflateStream s ;     if (trace)        warn("in _inflateInit(windowBits=%d, bufsize=%d, dictionary=%d\n",                windowBits, bufsize, SvCUR(dictionary)) ;    if (s = InitStream(bufsize) ) {        err = inflateInit2(&(s->stream), windowBits);         if (err != Z_OK) {            Safefree(s) ;            s = NULL ;	}	else if (SvCUR(dictionary)) {            /* Dictionary specified - take a copy for use in inflate */	    s->dictionary = newSVsv(dictionary) ;	}    }    else	err = Z_MEM_ERROR ;    XPUSHs(sv_setref_pv(sv_newmortal(),                    "Compress::Zlib::inflateStream", (void*)s));    if (GIMME == G_ARRAY)         XPUSHs(sv_2mortal(newSViv(err))) ; MODULE = Compress::Zlib PACKAGE = Compress::Zlib::deflateStreamint deflate (s, buf)    Compress::Zlib::deflateStream	s    SV *	buf    int		outsize = NO_INIT     SV * 	output = NO_INIT    int		err = NO_INIT  PPCODE:      /* If the buffer is a reference, dereference it */    buf = deRef(buf, "deflate") ;     /* initialise the input buffer */    s->stream.next_in = (Bytef*)SvPV(buf, s->stream.avail_in) ;    /* s->stream.avail_in = SvCUR(buf) ; */    /* and the output buffer */    /* output = sv_2mortal(newSVpv("", s->bufsize)) ; */    output = sv_2mortal(newSV(s->bufsize)) ;    SvPOK_only(output) ;    SvCUR_set(output, 0) ;     outsize = s->bufsize ;    s->stream.next_out = (Bytef*) SvPVX(output) ;    s->stream.avail_out = outsize;        while (s->stream.avail_in != 0) {        if (s->stream.avail_out == 0) {            SvGROW(output, outsize + s->bufsize) ;            s->stream.next_out = (Bytef*) SvPVX(output) + outsize ;            outsize += s->bufsize ;            s->stream.avail_out = s->bufsize ;        }        err = deflate(&(s->stream), Z_NO_FLUSH);        if (err != Z_OK)             break;    }    if (err == Z_OK) {        SvPOK_only(output);        SvCUR_set(output, outsize - s->stream.avail_out) ;    }    else        output = &PL_sv_undef ;    XPUSHs(output) ;    if (GIMME == G_ARRAY)         XPUSHs(sv_2mortal(newSViv(err))) ;  voidDESTROY(s)    Compress::Zlib::deflateStream	s  CODE:    deflateEnd(&s->stream) ;    if (s->dictionary)	SvREFCNT_dec(s->dictionary) ;    Safefree(s) ;voidflush(s)    Compress::Zlib::deflateStream	s    int	outsize = NO_INIT    SV * output = NO_INIT    int err = Z_OK ;  PPCODE:      s->stream.avail_in = 0; /* should be zero already anyway */      /* output = sv_2mortal(newSVpv("", s->bufsize)) ; */    output = sv_2mortal(newSV(s->bufsize)) ;    SvPOK_only(output) ;    SvCUR_set(output, 0) ;     outsize = s->bufsize ;    s->stream.next_out = (Bytef*) SvPVX(output) ;    s->stream.avail_out = outsize;          for (;;) {        if (s->stream.avail_out == 0) {	    /* consumed all the available output, so extend it */	    SvGROW(output, outsize + s->bufsize) ;            s->stream.next_out = (Bytef*)SvPVX(output) + outsize ;	    outsize += s->bufsize ;            s->stream.avail_out = s->bufsize ;        }        err = deflate(&(s->stream), Z_FINISH);            /* deflate has finished flushing only when it hasn't used up         * all the available space in the output buffer:          */        if (s->stream.avail_out != 0 || err != Z_OK )            break;    }      err =  (err == Z_STREAM_END ? Z_OK : err) ;      if (err == Z_OK) {        SvPOK_only(output);        SvCUR_set(output, outsize - s->stream.avail_out) ;    }    else        output = &PL_sv_undef ;    XPUSHs(output) ;    if (GIMME == G_ARRAY)         XPUSHs(sv_2mortal(newSViv(err))) ;uLongdict_adler(s)        Compress::Zlib::deflateStream   s    CODE:	RETVAL = s->dict_adler ;    OUTPUT:	RETVALchar *msg(s)        Compress::Zlib::deflateStream   s    CODE:	RETVAL = s->stream.msg ;    OUTPUT:	RETVALMODULE = Compress::Zlib PACKAGE = Compress::Zlib::inflateStreamint inflate (s, buf)    Compress::Zlib::inflateStream	s    SV *	buf    int		outsize = NO_INIT     SV * 	output = NO_INIT    int		err = Z_OK ;  ALIAS:    __unc_inflate = 1  PPCODE:      /* If the buffer is a reference, dereference it */    buf = deRef(buf, "inflate") ;        /* initialise the input buffer */    s->stream.next_in = (Bytef*)SvPVX(buf) ;    s->stream.avail_in = SvCUR(buf) ;	    /* and the output buffer */    output = sv_2mortal(newSV(s->bufsize+1)) ;    SvPOK_only(output) ;    SvCUR_set(output, 0) ;     outsize = s->bufsize ;    s->stream.next_out = (Bytef*) SvPVX(output)  ;    s->stream.avail_out = outsize;    while (1) {        if (s->stream.avail_out == 0) {            SvGROW(output, outsize + s->bufsize) ;            s->stream.next_out = (Bytef*) SvPVX(output) + outsize ;            outsize += s->bufsize ;            s->stream.avail_out = s->bufsize ;        }        err = inflate(&(s->stream), Z_PARTIAL_FLUSH);	/* printf("err %d  avail_out %d avail_in %d\n", err, 		s->stream.avail_out, s->stream.avail_in) ; */	if (err == Z_BUF_ERROR) {	    if (s->stream.avail_out == 0)	        continue ;	    if (s->stream.avail_in == 0) {		err = Z_OK ;	        break ;	    }	}	if (err == Z_NEED_DICT && s->dictionary) {	    s->dict_adler = s->stream.adler ;            err = inflateSetDictionary(&(s->stream), 	    				(const Bytef*)SvPVX(s->dictionary),					SvCUR(s->dictionary));	}               if (err != Z_OK)             break;    }    if (err == Z_OK || err == Z_STREAM_END) {	unsigned in ;	        SvPOK_only(output);        SvCUR_set(output, outsize - s->stream.avail_out) ;        *SvEND(output) = '\0';    	 	/* fix the input buffer */	if (ix == 0) { 	    in = s->stream.avail_in ; 	    SvCUR_set(buf, in) ; 	    if (in)     	        Move(s->stream.next_in, SvPVX(buf), in, char) ;	            *SvEND(buf) = '\0';	}    }    else        output = &PL_sv_undef ;    XPUSHs(output) ;    if (GIMME == G_ARRAY)         XPUSHs(sv_2mortal(newSViv(err))) ;voidDESTROY(s)    Compress::Zlib::inflateStream	s  CODE:    inflateEnd(&s->stream) ;    if (s->dictionary)	SvREFCNT_dec(s->dictionary) ;    Safefree(s) ;uLongdict_adler(s)        Compress::Zlib::inflateStream   s    CODE:	RETVAL = s->dict_adler ;    OUTPUT:	RETVALchar *msg(s)	Compress::Zlib::inflateStream   s    CODE:	RETVAL = s->stream.msg ;    OUTPUT:	RETVAL

⌨️ 快捷键说明

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