… | |
… | |
162 | usize = (usize << 6) | (*src++ & 0x3f); |
162 | usize = (usize << 6) | (*src++ & 0x3f); |
163 | usize = (usize << 6) | (*src++ & 0x3f); |
163 | usize = (usize << 6) | (*src++ & 0x3f); |
164 | usize = (usize << 6) | (*src++ & 0x3f); |
164 | usize = (usize << 6) | (*src++ & 0x3f); |
165 | } |
165 | } |
166 | else |
166 | else |
167 | croak ("compressed data corrupted"); |
167 | croak ("compressed data corrupted (invalid length)"); |
168 | |
168 | |
169 | ret = NEWSV (0, usize); |
169 | ret = NEWSV (0, usize); |
170 | SvPOK_only (ret); |
170 | SvPOK_only (ret); |
171 | dst = SvPVX (ret); |
171 | dst = SvPVX (ret); |
172 | |
172 | |
173 | if (lzf_decompress (src, csize, dst, usize) != usize) |
173 | if (lzf_decompress (src, csize, dst, usize) != usize) |
174 | croak ("compressed data corrupted", csize, skip, usize); |
174 | croak ("compressed data corrupted (size mismatch)", csize, skip, usize); |
175 | } |
175 | } |
176 | else |
176 | else |
177 | { |
177 | { |
178 | usize = csize - 1; |
178 | usize = csize - 1; |
179 | ret = NEWSV (0, usize); |
179 | ret = NEWSV (0, usize); |
… | |
… | |
230 | |
230 | |
231 | SvGETMAGIC (sv); |
231 | SvGETMAGIC (sv); |
232 | |
232 | |
233 | if (!SvOK (sv)) |
233 | if (!SvOK (sv)) |
234 | XPUSHs (sv_2mortal (newSVpvn ("\02", 1))); /* 02 == MAGIC_undef */ |
234 | XPUSHs (sv_2mortal (newSVpvn ("\02", 1))); /* 02 == MAGIC_undef */ |
|
|
235 | else if (SvROK (sv) |
235 | else if (SvTYPE(sv) != SVt_IV |
236 | || (SvTYPE(sv) != SVt_IV |
236 | && SvTYPE(sv) != SVt_NV |
237 | && SvTYPE(sv) != SVt_NV |
237 | && SvTYPE(sv) != SVt_PV |
238 | && SvTYPE(sv) != SVt_PV |
238 | && SvTYPE(sv) != SVt_PVMG+99999) /* mstore */ |
239 | && SvTYPE(sv) != SVt_PVMG)) /* mstore */ |
239 | { |
240 | { |
240 | int deref = !SvROK (sv); |
241 | int deref = !SvROK (sv); |
241 | |
242 | |
242 | if (!storable_mstore) |
243 | if (!storable_mstore) |
243 | need_storable (); |
244 | need_storable (); |
… | |
… | |
265 | if (ix) /* compress */ |
266 | if (ix) /* compress */ |
266 | sv = sv_2mortal (compress_sv (sv, deref ? MAGIC_CR_deref : MAGIC_CR, -1)); |
267 | sv = sv_2mortal (compress_sv (sv, deref ? MAGIC_CR_deref : MAGIC_CR, -1)); |
267 | |
268 | |
268 | XPUSHs (sv); |
269 | XPUSHs (sv); |
269 | } |
270 | } |
270 | else if (SvTYPE (sv) == SVt_PV && IN_RANGE (SvPVX (sv)[0], MAGIC_LO, MAGIC_HI)) |
271 | else if (SvPOKp (sv) && IN_RANGE (SvPVX (sv)[0], MAGIC_LO, MAGIC_HI)) |
271 | XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, MAGIC_U))); /* need to prefix only */ |
272 | XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, MAGIC_U))); /* need to prefix only */ |
272 | else if (ix == 2) /* compress always */ |
273 | else if (ix == 2) /* compress always */ |
273 | XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, -1))); |
274 | XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, -1))); |
274 | else /* don't compress */ |
275 | else /* don't compress */ |
275 | XPUSHs (sv_2mortal (SvREFCNT_inc (sv))); |
276 | XPUSHs (sv_2mortal (SvREFCNT_inc (sv))); |
… | |
… | |
343 | default: |
344 | default: |
344 | croak ("Compress::LZF::sthaw(): invalid data, maybe you need a newer version of Compress::LZF?"); |
345 | croak ("Compress::LZF::sthaw(): invalid data, maybe you need a newer version of Compress::LZF?"); |
345 | } |
346 | } |
346 | } |
347 | } |
347 | else |
348 | else |
348 | XPUSHs (sv_2mortal (SvREFCNT_inc (sv))); |
349 | XPUSHs (sv_2mortal (newSVsv (sv))); |