ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Compress-LZF/LZF.xs
(Generate patch)

Comparing Compress-LZF/LZF.xs (file contents):
Revision 1.1 by root, Thu Sep 27 18:36:34 2001 UTC vs.
Revision 1.8 by root, Wed Feb 27 20:51:21 2002 UTC

8#include "patchlevel.h" 8#include "patchlevel.h"
9#if (PATCHLEVEL == 4) || ((PATCHLEVEL == 5) && (SUBVERSION < 55)) 9#if (PATCHLEVEL == 4) || ((PATCHLEVEL == 5) && (SUBVERSION < 55))
10static STRLEN nolen_na; 10static STRLEN nolen_na;
11# define SvPV_nolen(sv) SvPV ((sv), nolen_na) 11# define SvPV_nolen(sv) SvPV ((sv), nolen_na)
12#endif 12#endif
13#if PATCHLEVEL < 6
14# define call_sv perl_call_sv
15#endif
13 16
14#include "lzf_c.c" 17#include "lzf_c.c"
15#include "lzf_d.c" 18#include "lzf_d.c"
16 19
17/* we re-use the storable header for our purposes */ 20/* we re-use the storable header for our purposes */
18#define MAGIC_LO 0 21#define MAGIC_LO 0
19#define MAGIC_U 0 /* uncompressed data follows */ 22#define MAGIC_U 0 /* uncompressed data follows */
20#define MAGIC_C 1 /* compressed data follows */ 23#define MAGIC_C 1 /* compressed data follows */
24#define MAGIC_undef 2 /* the special value undef */
25#define MAGIC_CR 3 /* storable (reference, freeze), compressed */
21#define MAGIC_R 4 /* storable (reference, freeze) */ 26#define MAGIC_R 4 /* storable (reference, freeze) */
22#define MAGIC_CR 3 /* storable (reference, freeze), compressed */
23#define MAGIC_HI 7 /* room for one higher storable major */ 27#define MAGIC_HI 7 /* room for one higher storable major */
24 28
25#define IN_RANGE(v,l,h) ((unsigned int)((unsigned)(v) - (unsigned)(l)) <= (unsigned)(h) - (unsigned)(l)) 29#define IN_RANGE(v,l,h) ((unsigned int)((unsigned)(v) - (unsigned)(l)) <= (unsigned)(h) - (unsigned)(l))
26 30
27static CV *storable_mstore, *storable_mretrieve; 31static CV *storable_mstore, *storable_mretrieve;
185} 189}
186 190
187static void 191static void
188need_storable(void) 192need_storable(void)
189{ 193{
194#if PATCHLEVEL < 6
195 perl_eval_pv ("require Storable;", 1);
196#else
190 load_module (PERL_LOADMOD_NOIMPORT, newSVpv ("Storable", 0), Nullsv); 197 load_module (PERL_LOADMOD_NOIMPORT, newSVpv ("Storable", 0), Nullsv);
198#endif
191 199
192 storable_mstore = GvCV (gv_fetchpv ("Storable::mstore" , TRUE, SVt_PVCV)); 200 storable_mstore = GvCV (gv_fetchpv ("Storable::mstore" , TRUE, SVt_PVCV));
193 storable_mretrieve = GvCV (gv_fetchpv ("Storable::mretrieve", TRUE, SVt_PVCV)); 201 storable_mretrieve = GvCV (gv_fetchpv ("Storable::mretrieve", TRUE, SVt_PVCV));
194} 202}
195 203
216 sfreeze_cr = 1 224 sfreeze_cr = 1
217 sfreeze_c = 2 225 sfreeze_c = 2
218 PROTOTYPE: $ 226 PROTOTYPE: $
219 PPCODE: 227 PPCODE:
220 228
221 if (SvROK (sv)) /* mstore */ 229 if (!SvOK (sv))
230 XPUSHs (sv_2mortal (newSVpvn ("\02", 1))); /* 02 == MAGIC_undef */
231 else if (SvTYPE(sv) != SVt_IV
232 && SvTYPE(sv) != SVt_NV
233 && SvTYPE(sv) != SVt_PV
234 && SvTYPE(sv) != SVt_PVMG) /* mstore */
222 { 235 {
223 if (!storable_mstore) 236 if (!storable_mstore)
224 need_storable (); 237 need_storable ();
225 238
226 PUSHMARK (SP); 239 PUSHMARK (SP);
240 if (ix) /* compress */ 253 if (ix) /* compress */
241 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_CR, 0))); 254 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_CR, 0)));
242 else 255 else
243 XPUSHs (sv); 256 XPUSHs (sv);
244 } 257 }
245 else if (IN_RANGE (SvPVX (sv)[0], MAGIC_LO, MAGIC_HI)) 258 else if (sv && IN_RANGE (SvPVX (sv)[0], MAGIC_LO, MAGIC_HI))
246 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, 1))); /* need to prefix only */ 259 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, 1))); /* need to prefix only */
247 else if (ix == 2) /* compress always */ 260 else if (ix == 2) /* compress always */
248 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, 0))); 261 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, 0)));
249 else /* don't compress */ 262 else /* don't compress */
250 XPUSHs (sv_2mortal (SvREFCNT_inc (sv))); 263 XPUSHs (sv_2mortal (SvREFCNT_inc (sv)));
252void 265void
253sthaw(sv) 266sthaw(sv)
254 SV * sv 267 SV * sv
255 PROTOTYPE: $ 268 PROTOTYPE: $
256 PPCODE: 269 PPCODE:
257 char hdr = SvPVX (sv)[0];
258 270
259 if (IN_RANGE (hdr, MAGIC_LO, MAGIC_HI)) 271 SvGETMAGIC (sv);
272 if (SvPOK (sv) && IN_RANGE (SvPV_nolen (sv)[0], MAGIC_LO, MAGIC_HI))
260 { 273 {
261 switch (SvPVX (sv)[0]) 274 switch (SvPVX (sv)[0])
262 { 275 {
276 case MAGIC_undef:
277 XPUSHs (sv_2mortal (NEWSV (0, 0)));
278 break;
279
263 case MAGIC_U: 280 case MAGIC_U:
264 XPUSHs (sv_2mortal (decompress_sv (sv, 0))); 281 XPUSHs (sv_2mortal (decompress_sv (sv, 0)));
265 break; 282 break;
266 283
267 case MAGIC_C: 284 case MAGIC_C:
281 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) 298 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR))
282 croak ("Storable::mstore didn't return a single scalar"); 299 croak ("Storable::mstore didn't return a single scalar");
283 300
284 SPAGAIN; 301 SPAGAIN;
285 302
286 /*XPUSHs (POPs);*/ 303 /*XPUSHs (POPs); this is a nop, hopefully */
287 304
288 break; 305 break;
289 306
290 default: 307 default:
291 croak ("Compress::LZF::sthaw(): invalid data, maybe you need a newer version of Compress::LZF?"); 308 croak ("Compress::LZF::sthaw(): invalid data, maybe you need a newer version of Compress::LZF?");

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines