--- Compress-LZF/LZF.xs 2002/05/17 18:59:24 1.12 +++ Compress-LZF/LZF.xs 2002/09/05 04:44:55 1.14 @@ -30,6 +30,7 @@ #define IN_RANGE(v,l,h) ((unsigned int)((unsigned)(v) - (unsigned)(l)) <= (unsigned)(h) - (unsigned)(l)) +static SV *serializer_package, *serializer_mstore, *serializer_mretrieve; static CV *storable_mstore, *storable_mretrieve; static SV * @@ -164,14 +165,14 @@ usize = (usize << 6) | (*src++ & 0x3f); } else - croak ("compressed data corrupted"); + croak ("compressed data corrupted (invalid length)"); ret = NEWSV (0, usize); SvPOK_only (ret); dst = SvPVX (ret); if (lzf_decompress (src, csize, dst, usize) != usize) - croak ("compressed data corrupted", csize, skip, usize); + croak ("compressed data corrupted (size mismatch)", csize, skip, usize); } else { @@ -194,17 +195,37 @@ need_storable(void) { #if PATCHLEVEL < 6 - perl_eval_pv ("require Storable;", 1); + char req[8192]; + sprintf (req, "require %s;", SvPV_nolen (serializer_package)); + perl_eval_pv (req, 1); #else - load_module (PERL_LOADMOD_NOIMPORT, newSVpv ("Storable", 0), Nullsv); + load_module (PERL_LOADMOD_NOIMPORT, serializer_package, Nullsv); #endif - storable_mstore = GvCV (gv_fetchpv ("Storable::mstore" , TRUE, SVt_PVCV)); - storable_mretrieve = GvCV (gv_fetchpv ("Storable::mretrieve", TRUE, SVt_PVCV)); + storable_mstore = GvCV (gv_fetchpv (SvPV_nolen (serializer_mstore ), TRUE, SVt_PVCV)); + storable_mretrieve = GvCV (gv_fetchpv (SvPV_nolen (serializer_mretrieve), TRUE, SVt_PVCV)); } MODULE = Compress::LZF PACKAGE = Compress::LZF +BOOT: + serializer_package = newSVpv ("Storable", 0); + serializer_mstore = newSVpv ("Storable::mstore", 0); + serializer_mretrieve = newSVpv ("Storable::mretrieve", 0); + +void +set_serializer(package, mstore, mretrieve) + SV * package + SV * mstore + SV * mretrieve + PROTOTYPE: $$$ + PPCODE: + SvSetSV (serializer_package , package ); + SvSetSV (serializer_mstore , mstore ); + SvSetSV (serializer_mretrieve, mretrieve); + storable_mstore = + storable_mretrieve = 0; + void compress(data) SV * data @@ -268,7 +289,7 @@ XPUSHs (sv); } - else if (SvTYPE (sv) == SVt_PV && IN_RANGE (SvPVX (sv)[0], MAGIC_LO, MAGIC_HI)) + else if (SvPOKp (sv) && IN_RANGE (SvPVX (sv)[0], MAGIC_LO, MAGIC_HI)) XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, MAGIC_U))); /* need to prefix only */ else if (ix == 2) /* compress always */ XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, -1)));