--- Compress-LZF/LZF.xs 2006/09/27 19:01:48 1.22 +++ Compress-LZF/LZF.xs 2008/09/22 02:15:43 1.26 @@ -2,17 +2,8 @@ #include "perl.h" #include "XSUB.h" -/* try to be compatible with older perls */ -/* SvPV_nolen() macro first defined in 5.005_55 */ -/* this is slow, not threadsafe, but works */ -#include "patchlevel.h" -#if (PATCHLEVEL == 4) || ((PATCHLEVEL == 5) && (SUBVERSION < 55)) -static STRLEN nolen_na; -# define SvPV_nolen(sv) SvPV ((sv), nolen_na) -#endif -#if PATCHLEVEL < 6 -# define call_sv perl_call_sv -#endif +#define LZF_STANDALONE 1 +#define LZF_STATE_ARG 1 #include "lzf_c.c" #include "lzf_d.c" @@ -43,8 +34,9 @@ static SV * compress_sv (SV *data, char cprepend, int uprepend) { + LZF_STATE *state; STRLEN usize, csize; - char *src = (char *)SvPV (data, usize); + char *src = (char *)SvPVbyte (data, usize); if (usize) { @@ -100,11 +92,15 @@ else croak ("compress can only compress up to %ld bytes", 0x7fffffffL); + New (0, state, 1, LZF_STATE); + if (!state) + croak ("Compress::LZF unable to allocate memory for compression state"); + /* 11 bytes is the smallest compressible string */ csize = usize < 11 ? 0 : - lzf_compress (src, usize, - dst + skip, - usize - skip); + lzf_compress (src, usize, dst + skip, usize - skip, *state); + + Safefree (state); if (csize) { @@ -134,7 +130,7 @@ decompress_sv (SV *data, int skip) { STRLEN usize, csize; - unsigned char *src = (unsigned char *)SvPV (data, csize) + skip; + unsigned char *src = (unsigned char *)SvPVbyte (data, csize) + skip; if (csize) { @@ -226,16 +222,10 @@ static void need_storable(void) { -#if PATCHLEVEL < 6 - char req[8192]; - sprintf (req, "require %s;", SvPV_nolen (serializer_package)); - perl_eval_pv (req, 1); -#else load_module (PERL_LOADMOD_NOIMPORT, serializer_package, Nullsv); -#endif - storable_mstore = GvCV (gv_fetchpv (SvPV_nolen (serializer_mstore ), TRUE, SVt_PVCV)); - storable_mretrieve = GvCV (gv_fetchpv (SvPV_nolen (serializer_mretrieve), TRUE, SVt_PVCV)); + storable_mstore = GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mstore ), TRUE, SVt_PVCV)); + storable_mretrieve = GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mretrieve), TRUE, SVt_PVCV)); } MODULE = Compress::LZF PACKAGE = Compress::LZF @@ -286,17 +276,23 @@ if (!SvOK (sv)) XPUSHs (sv_2mortal (newSVpvn ("\02", 1))); /* 02 == MAGIC_undef */ else if (SvROK (sv) - || (SvTYPE(sv) != SVt_IV - && SvTYPE(sv) != SVt_NV - && SvTYPE(sv) != SVt_PV - && SvTYPE(sv) != SVt_PVIV - && SvTYPE(sv) != SVt_PVNV - && SvTYPE(sv) != SVt_PVMG)) /* mstore */ + || SvUTF8 (sv) + || (SvTYPE(sv) != SVt_IV + && SvTYPE(sv) != SVt_NV + && SvTYPE(sv) != SVt_PV + && SvTYPE(sv) != SVt_PVIV + && SvTYPE(sv) != SVt_PVNV + && SvTYPE(sv) != SVt_PVMG)) /* mstore */ { int deref = !SvROK (sv); + char *pv; if (!storable_mstore) - need_storable (); + { + PUTBACK; + need_storable (); + SPAGAIN; + } if (deref) sv = newRV_noinc (sv); @@ -311,11 +307,12 @@ SPAGAIN; sv = POPs; + pv = SvPV_nolen (sv); - if (SvPVX (sv)[0] == MAGIC_R) + if (*pv == MAGIC_R) { if (deref) - SvPVX (sv)[0] = MAGIC_R_deref; + *pv = MAGIC_R_deref; } else { @@ -355,7 +352,7 @@ int deref = 0; SvGETMAGIC (sv); - if (SvPOK (sv) && IN_RANGE (SvPV (sv, svlen)[0], MAGIC_LO, MAGIC_HI)) + if (SvPOK (sv) && IN_RANGE (SvPVbyte (sv, svlen)[0], MAGIC_LO, MAGIC_HI)) { redo: @@ -374,7 +371,11 @@ sv_chop (sv, SvPVX (sv) + 2); if (!storable_mstore) - need_storable (); + { + PUTBACK; + need_storable (); + SPAGAIN; + } PUSHMARK (SP); XPUSHs (sv); @@ -418,7 +419,11 @@ case MAGIC_R: handle_MAGIC_R: if (!storable_mstore) - need_storable (); + { + PUTBACK; + need_storable (); + SPAGAIN; + } PUSHMARK (SP); XPUSHs (sv);