--- Compress-LZF/LZF.xs 2002/03/03 04:45:18 1.9 +++ Compress-LZF/LZF.xs 2002/03/26 17:49:24 1.10 @@ -25,7 +25,7 @@ #define MAGIC_CR 3 /* storable (reference, freeze), compressed */ #define MAGIC_R 4 /* storable (reference, freeze) */ #define MAGIC_CR_deref 5 /* storable (NO reference, freeze), compressed */ -#define MAGIC_R_deref 6 /* storable NO (reference, freeze) */ +#define MAGIC_R_deref 6 /* storable (NO reference, freeze) */ #define MAGIC_HI 7 /* room for one higher storable major */ #define IN_RANGE(v,l,h) ((unsigned int)((unsigned)(v) - (unsigned)(l)) <= (unsigned)(h) - (unsigned)(l)) @@ -33,7 +33,7 @@ static CV *storable_mstore, *storable_mretrieve; static SV * -compress_sv (SV *data, char cprepend, char uprepend) +compress_sv (SV *data, char cprepend, int uprepend) { STRLEN usize, csize; char *src = (char *)SvPV (data, usize); @@ -93,14 +93,14 @@ { SvCUR_set (ret, csize + skip); } - else if (!uprepend) + else if (uprepend < 0) { SvREFCNT_dec (ret); ret = SvREFCNT_inc (data); } else { - *dst++ = 0; + *dst++ = uprepend; Move ((void *)src, (void *)dst, usize, unsigned char); @@ -210,7 +210,7 @@ SV * data PROTOTYPE: $ PPCODE: - XPUSHs (sv_2mortal (compress_sv (data, 0, 1))); + XPUSHs (sv_2mortal (compress_sv (data, 0, MAGIC_U))); void decompress(data) @@ -228,11 +228,14 @@ PROTOTYPE: $ PPCODE: + SvGETMAGIC (sv); + if (!SvOK (sv)) XPUSHs (sv_2mortal (newSVpvn ("\02", 1))); /* 02 == MAGIC_undef */ else if (SvTYPE(sv) != SVt_IV - && SvTYPE(sv) != SVt_NV - && SvTYPE(sv) != SVt_PV) /* mstore */ + && SvTYPE(sv) != SVt_NV + && SvTYPE(sv) != SVt_PV + && SvTYPE(sv) != SVt_PVMG+99999) /* mstore */ { int deref = !SvROK (sv); @@ -256,20 +259,18 @@ if (SvPVX (sv)[0] != MAGIC_R) croak ("Storable format changed, need newer version of Compress::LZF"); + if (deref) + SvPVX (sv)[0] = MAGIC_R_deref; + if (ix) /* compress */ - XPUSHs (sv_2mortal (compress_sv (sv, deref ? MAGIC_CR_deref : MAGIC_CR, 0))); - else - { - if (deref) - SvPVX (sv)[0] = MAGIC_R_deref; + sv = sv_2mortal (compress_sv (sv, deref ? MAGIC_CR_deref : MAGIC_CR, -1)); - XPUSHs (sv); - } + XPUSHs (sv); } - else if (sv && IN_RANGE (SvPVX (sv)[0], MAGIC_LO, MAGIC_HI)) - XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, 1))); /* need to prefix only */ + else if (SvTYPE (sv) == SVt_PV && 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, 0))); + XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, -1))); else /* don't compress */ XPUSHs (sv_2mortal (SvREFCNT_inc (sv))); @@ -298,17 +299,23 @@ XPUSHs (sv_2mortal (decompress_sv (sv, 1))); break; + case MAGIC_R_deref: + deref = 1; + SvPVX (sv)[0] = MAGIC_R; + goto handle_MAGIC_R; + case MAGIC_CR_deref: deref = 1; case MAGIC_CR: sv = sv_2mortal (decompress_sv (sv, 1)); /* mortal could be optimized */ - case MAGIC_R_deref: - if (SvPVX (sv)[0] == MAGIC_R_deref) - { - deref = 1; + if (deref) + if (SvPVX (sv)[0] == MAGIC_R_deref) SvPVX (sv)[0] = MAGIC_R; - } + else + croak ("Compress::LZF::sthaw(): invalid data, maybe you need a newer version of Compress::LZF?"); + case MAGIC_R: + handle_MAGIC_R: if (!storable_mstore) need_storable (); @@ -323,16 +330,13 @@ if (deref) { - SV *ref = SvREFCNT_inc (SvRV (TOPs)); - - SvREFCNT_dec (TOPs); /* destroy superfluous ref */ - SETs (ref); + SETs (sv_2mortal (SvREFCNT_inc (SvRV (TOPs)))); if (SvPVX (sv)[0] == MAGIC_R) - SvPVX (sv)[0] = MAGIC_R; + SvPVX (sv)[0] = MAGIC_R_deref; } - - XPUSHs (POPs); /* this is a nop, hopefully */ + else + XPUSHs (POPs); /* this is a nop, hopefully */ break;