📄 zlib.xs
字号:
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 + -