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.23 by root, Fri Feb 16 22:11:17 2007 UTC vs.
Revision 1.26 by root, Mon Sep 22 02:15:43 2008 UTC

1#include "EXTERN.h" 1#include "EXTERN.h"
2#include "perl.h" 2#include "perl.h"
3#include "XSUB.h" 3#include "XSUB.h"
4
5/* try to be compatible with older perls */
6/* SvPV_nolen() macro first defined in 5.005_55 */
7/* this is slow, not threadsafe, but works */
8#include "patchlevel.h"
9#if (PATCHLEVEL == 4) || ((PATCHLEVEL == 5) && (SUBVERSION < 55))
10static STRLEN nolen_na;
11# define SvPV_nolen(sv) SvPV ((sv), nolen_na)
12#endif
13#if PATCHLEVEL < 6
14# define call_sv perl_call_sv
15#endif
16 4
17#define LZF_STANDALONE 1 5#define LZF_STANDALONE 1
18#define LZF_STATE_ARG 1 6#define LZF_STATE_ARG 1
19 7
20#include "lzf_c.c" 8#include "lzf_c.c"
46static SV * 34static SV *
47compress_sv (SV *data, char cprepend, int uprepend) 35compress_sv (SV *data, char cprepend, int uprepend)
48{ 36{
49 LZF_STATE *state; 37 LZF_STATE *state;
50 STRLEN usize, csize; 38 STRLEN usize, csize;
51 char *src = (char *)SvPV (data, usize); 39 char *src = (char *)SvPVbyte (data, usize);
52 40
53 if (usize) 41 if (usize)
54 { 42 {
55 SV *ret = NEWSV (0, usize + 1); 43 SV *ret = NEWSV (0, usize + 1);
56 unsigned char *dst; 44 unsigned char *dst;
140 128
141static SV * 129static SV *
142decompress_sv (SV *data, int skip) 130decompress_sv (SV *data, int skip)
143{ 131{
144 STRLEN usize, csize; 132 STRLEN usize, csize;
145 unsigned char *src = (unsigned char *)SvPV (data, csize) + skip; 133 unsigned char *src = (unsigned char *)SvPVbyte (data, csize) + skip;
146 134
147 if (csize) 135 if (csize)
148 { 136 {
149 void *dst; 137 void *dst;
150 SV *ret; 138 SV *ret;
232} 220}
233 221
234static void 222static void
235need_storable(void) 223need_storable(void)
236{ 224{
237#if PATCHLEVEL < 6
238 char req[8192];
239 sprintf (req, "require %s;", SvPV_nolen (serializer_package));
240 perl_eval_pv (req, 1);
241#else
242 load_module (PERL_LOADMOD_NOIMPORT, serializer_package, Nullsv); 225 load_module (PERL_LOADMOD_NOIMPORT, serializer_package, Nullsv);
243#endif
244 226
245 storable_mstore = GvCV (gv_fetchpv (SvPV_nolen (serializer_mstore ), TRUE, SVt_PVCV)); 227 storable_mstore = GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mstore ), TRUE, SVt_PVCV));
246 storable_mretrieve = GvCV (gv_fetchpv (SvPV_nolen (serializer_mretrieve), TRUE, SVt_PVCV)); 228 storable_mretrieve = GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mretrieve), TRUE, SVt_PVCV));
247} 229}
248 230
249MODULE = Compress::LZF PACKAGE = Compress::LZF 231MODULE = Compress::LZF PACKAGE = Compress::LZF
250 232
251BOOT: 233BOOT:
292 SvGETMAGIC (sv); 274 SvGETMAGIC (sv);
293 275
294 if (!SvOK (sv)) 276 if (!SvOK (sv))
295 XPUSHs (sv_2mortal (newSVpvn ("\02", 1))); /* 02 == MAGIC_undef */ 277 XPUSHs (sv_2mortal (newSVpvn ("\02", 1))); /* 02 == MAGIC_undef */
296 else if (SvROK (sv) 278 else if (SvROK (sv)
279 || SvUTF8 (sv)
297 || (SvTYPE(sv) != SVt_IV 280 || (SvTYPE(sv) != SVt_IV
298 && SvTYPE(sv) != SVt_NV 281 && SvTYPE(sv) != SVt_NV
299 && SvTYPE(sv) != SVt_PV 282 && SvTYPE(sv) != SVt_PV
300 && SvTYPE(sv) != SVt_PVIV 283 && SvTYPE(sv) != SVt_PVIV
301 && SvTYPE(sv) != SVt_PVNV 284 && SvTYPE(sv) != SVt_PVNV
302 && SvTYPE(sv) != SVt_PVMG)) /* mstore */ 285 && SvTYPE(sv) != SVt_PVMG)) /* mstore */
303 { 286 {
304 int deref = !SvROK (sv); 287 int deref = !SvROK (sv);
288 char *pv;
305 289
306 if (!storable_mstore) 290 if (!storable_mstore)
291 {
292 PUTBACK;
307 need_storable (); 293 need_storable ();
294 SPAGAIN;
295 }
308 296
309 if (deref) 297 if (deref)
310 sv = newRV_noinc (sv); 298 sv = newRV_noinc (sv);
311 299
312 PUSHMARK (SP); 300 PUSHMARK (SP);
317 croak ("Storable::mstore didn't return a single scalar"); 305 croak ("Storable::mstore didn't return a single scalar");
318 306
319 SPAGAIN; 307 SPAGAIN;
320 308
321 sv = POPs; 309 sv = POPs;
310 pv = SvPV_nolen (sv);
322 311
323 if (SvPVX (sv)[0] == MAGIC_R) 312 if (*pv == MAGIC_R)
324 { 313 {
325 if (deref) 314 if (deref)
326 SvPVX (sv)[0] = MAGIC_R_deref; 315 *pv = MAGIC_R_deref;
327 } 316 }
328 else 317 else
329 { 318 {
330 char pfx[2]; 319 char pfx[2];
331 320
361{ 350{
362 STRLEN svlen; 351 STRLEN svlen;
363 int deref = 0; 352 int deref = 0;
364 353
365 SvGETMAGIC (sv); 354 SvGETMAGIC (sv);
366 if (SvPOK (sv) && IN_RANGE (SvPV (sv, svlen)[0], MAGIC_LO, MAGIC_HI)) 355 if (SvPOK (sv) && IN_RANGE (SvPVbyte (sv, svlen)[0], MAGIC_LO, MAGIC_HI))
367 { 356 {
368 redo: 357 redo:
369 358
370 switch (SvPVX (sv)[0]) 359 switch (SvPVX (sv)[0])
371 { 360 {
380 croak ("Compress::LZF::sthaw(): invalid data, maybe you need a newer version of Compress::LZF?"); 369 croak ("Compress::LZF::sthaw(): invalid data, maybe you need a newer version of Compress::LZF?");
381 370
382 sv_chop (sv, SvPVX (sv) + 2); 371 sv_chop (sv, SvPVX (sv) + 2);
383 372
384 if (!storable_mstore) 373 if (!storable_mstore)
374 {
375 PUTBACK;
385 need_storable (); 376 need_storable ();
377 SPAGAIN;
378 }
386 379
387 PUSHMARK (SP); 380 PUSHMARK (SP);
388 XPUSHs (sv); 381 XPUSHs (sv);
389 PUTBACK; 382 PUTBACK;
390 383
424 goto redo; 417 goto redo;
425 418
426 case MAGIC_R: 419 case MAGIC_R:
427 handle_MAGIC_R: 420 handle_MAGIC_R:
428 if (!storable_mstore) 421 if (!storable_mstore)
422 {
423 PUTBACK;
429 need_storable (); 424 need_storable ();
425 SPAGAIN;
426 }
430 427
431 PUSHMARK (SP); 428 PUSHMARK (SP);
432 XPUSHs (sv); 429 XPUSHs (sv);
433 PUTBACK; 430 PUTBACK;
434 431

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines