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.28 by root, Wed Dec 17 00:04:56 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;
230 else 218 else
231 return newSVpvn ("", 0); 219 return newSVpvn ("", 0);
232} 220}
233 221
234static void 222static void
235need_storable(void) 223need_storable (void)
236{ 224{
237#if PATCHLEVEL < 6 225 require_pv (SvPVbyte_nolen (serializer_package));
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);
243#endif
244 226
245 storable_mstore = GvCV (gv_fetchpv (SvPV_nolen (serializer_mstore ), TRUE, SVt_PVCV)); 227 storable_mstore = (CV *)SvREFCNT_inc (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 = (CV *)SvREFCNT_inc (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:
261 PROTOTYPE: $$$ 243 PROTOTYPE: $$$
262 PPCODE: 244 PPCODE:
263 SvSetSV (serializer_package , package ); 245 SvSetSV (serializer_package , package );
264 SvSetSV (serializer_mstore , mstore ); 246 SvSetSV (serializer_mstore , mstore );
265 SvSetSV (serializer_mretrieve, mretrieve); 247 SvSetSV (serializer_mretrieve, mretrieve);
266 storable_mstore = 248 SvREFCNT_dec (storable_mstore ); storable_mstore = 0;
267 storable_mretrieve = 0; 249 SvREFCNT_dec (storable_mretrieve); storable_mretrieve = 0;
268 250
269void 251void
270compress(data) 252compress(data)
271 SV * data 253 SV * data
272 PROTOTYPE: $ 254 PROTOTYPE: $
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);
313 XPUSHs (sv); 301 XPUSHs (sv);
314 PUTBACK; 302 PUTBACK;
315 303
316 if (1 != call_sv ((SV *)storable_mstore, G_SCALAR)) 304 if (1 != call_sv ((SV *)storable_mstore, G_SCALAR))
317 croak ("Storable::mstore didn't return a single scalar"); 305 croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mstore));
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
391 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) 384 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR))
392 croak ("Storable::mstore didn't return a single scalar"); 385 croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mretrieve));
393 386
394 SPAGAIN; 387 SPAGAIN;
395 388
396 if (deref) 389 if (deref)
397 SETs (sv_2mortal (SvREFCNT_inc (SvRV (TOPs)))); 390 SETs (sv_2mortal (SvREFCNT_inc (SvRV (TOPs))));
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
435 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) 432 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR))
436 croak ("Storable::mstore didn't return a single scalar"); 433 croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mretrieve));
437 434
438 SPAGAIN; 435 SPAGAIN;
439 436
440 if (deref) 437 if (deref)
441 { 438 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines