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.26 by root, Mon Sep 22 02:15:43 2008 UTC vs.
Revision 1.31 by root, Sun Aug 25 18:13:26 2013 UTC

5#define LZF_STANDALONE 1 5#define LZF_STANDALONE 1
6#define LZF_STATE_ARG 1 6#define LZF_STATE_ARG 1
7 7
8#include "lzf_c.c" 8#include "lzf_c.c"
9#include "lzf_d.c" 9#include "lzf_d.c"
10#include "lzf_c_best.c"
10 11
11/* we re-use the storable header for our purposes */ 12/* we re-use the storable header for our purposes */
12#define MAGIC_LO 0 13#define MAGIC_LO 0
13#define MAGIC_U 0 /* uncompressed data follows */ 14#define MAGIC_U 0 /* uncompressed data follows */
14#define MAGIC_C 1 /* compressed data follows */ 15#define MAGIC_C 1 /* compressed data follows */
30#else 31#else
31# define MAX_LENGTH ((Size_t) 0x8000000L) 32# define MAX_LENGTH ((Size_t) 0x8000000L)
32#endif 33#endif
33 34
34static SV * 35static SV *
35compress_sv (SV *data, char cprepend, int uprepend) 36compress_sv (SV *data, char cprepend, int uprepend, int best)
36{ 37{
37 LZF_STATE *state; 38 LZF_STATE *state;
38 STRLEN usize, csize; 39 STRLEN usize, csize;
39 char *src = (char *)SvPVbyte (data, usize); 40 char *src = (char *)SvPVbyte (data, usize);
40 41
52 53
53 if (usize <= 0x7f) 54 if (usize <= 0x7f)
54 { 55 {
55 dst[skip++] = usize; 56 dst[skip++] = usize;
56 } 57 }
57 else if (usize <= 0x7ff) 58 else if (usize <= 0x7ff)
58 { 59 {
59 dst[skip++] = (( usize >> 6) | 0xc0); 60 dst[skip++] = (( usize >> 6) | 0xc0);
60 dst[skip++] = (( usize & 0x3f) | 0x80); 61 dst[skip++] = (( usize & 0x3f) | 0x80);
61 } 62 }
62 else if (usize <= 0xffff) 63 else if (usize <= 0xffff)
96 if (!state) 97 if (!state)
97 croak ("Compress::LZF unable to allocate memory for compression state"); 98 croak ("Compress::LZF unable to allocate memory for compression state");
98 99
99 /* 11 bytes is the smallest compressible string */ 100 /* 11 bytes is the smallest compressible string */
100 csize = usize < 11 ? 0 : 101 csize = usize < 11 ? 0 :
102 (best ? lzf_compress_best (src, usize, dst + skip, usize - skip)
101 lzf_compress (src, usize, dst + skip, usize - skip, *state); 103 : lzf_compress (src, usize, dst + skip, usize - skip, *state));
102 104
103 Safefree (state); 105 Safefree (state);
104 106
105 if (csize) 107 if (csize)
106 { 108 {
218 else 220 else
219 return newSVpvn ("", 0); 221 return newSVpvn ("", 0);
220} 222}
221 223
222static void 224static void
223need_storable(void) 225need_storable (void)
224{ 226{
225 load_module (PERL_LOADMOD_NOIMPORT, serializer_package, Nullsv); 227 eval_sv (sv_2mortal (newSVpvf ("require %s", SvPVbyte_nolen (serializer_package))), G_VOID | G_DISCARD);
226 228
227 storable_mstore = GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mstore ), TRUE, SVt_PVCV)); 229 storable_mstore = (CV *)SvREFCNT_inc (GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mstore ), TRUE, SVt_PVCV)));
228 storable_mretrieve = GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mretrieve), TRUE, SVt_PVCV)); 230 storable_mretrieve = (CV *)SvREFCNT_inc (GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mretrieve), TRUE, SVt_PVCV)));
229} 231}
230 232
231MODULE = Compress::LZF PACKAGE = Compress::LZF 233MODULE = Compress::LZF PACKAGE = Compress::LZF
232 234
233BOOT: 235BOOT:
243 PROTOTYPE: $$$ 245 PROTOTYPE: $$$
244 PPCODE: 246 PPCODE:
245 SvSetSV (serializer_package , package ); 247 SvSetSV (serializer_package , package );
246 SvSetSV (serializer_mstore , mstore ); 248 SvSetSV (serializer_mstore , mstore );
247 SvSetSV (serializer_mretrieve, mretrieve); 249 SvSetSV (serializer_mretrieve, mretrieve);
248 storable_mstore = 250 SvREFCNT_dec (storable_mstore ); storable_mstore = 0;
249 storable_mretrieve = 0; 251 SvREFCNT_dec (storable_mretrieve); storable_mretrieve = 0;
250 252
251void 253void
252compress(data) 254compress(data)
253 SV * data 255 SV * data
256 ALIAS:
257 compress_best = 1
254 PROTOTYPE: $ 258 PROTOTYPE: $
255 PPCODE: 259 PPCODE:
256 XPUSHs (sv_2mortal (compress_sv (data, 0, MAGIC_U))); 260 XPUSHs (sv_2mortal (compress_sv (data, 0, MAGIC_U, ix)));
257 261
258void 262void
259decompress(data) 263decompress(data)
260 SV * data 264 SV * data
261 PROTOTYPE: $ 265 PROTOTYPE: $
264 268
265void 269void
266sfreeze(sv) 270sfreeze(sv)
267 SV * sv 271 SV * sv
268 ALIAS: 272 ALIAS:
273 sfreeze = 0
269 sfreeze_cr = 1 274 sfreeze_cr = 1
270 sfreeze_c = 2 275 sfreeze_c = 2
276 sfreeze_best = 4
277 sfreeze_cr_best = 5
278 sfreeze_c_best = 6
271 PROTOTYPE: $ 279 PROTOTYPE: $
272 PPCODE: 280 PPCODE:
281{
282 int best = ix & 4;
283 ix &= 3;
273 284
274 SvGETMAGIC (sv); 285 SvGETMAGIC (sv);
275 286
276 if (!SvOK (sv)) 287 if (!SvOK (sv))
277 XPUSHs (sv_2mortal (newSVpvn ("\02", 1))); /* 02 == MAGIC_undef */ 288 XPUSHs (sv_2mortal (newSVpvn ("\02", 1))); /* 02 == MAGIC_undef */
300 PUSHMARK (SP); 311 PUSHMARK (SP);
301 XPUSHs (sv); 312 XPUSHs (sv);
302 PUTBACK; 313 PUTBACK;
303 314
304 if (1 != call_sv ((SV *)storable_mstore, G_SCALAR)) 315 if (1 != call_sv ((SV *)storable_mstore, G_SCALAR))
305 croak ("Storable::mstore didn't return a single scalar"); 316 croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mstore));
306 317
307 SPAGAIN; 318 SPAGAIN;
308 319
309 sv = POPs; 320 sv = POPs;
310 pv = SvPV_nolen (sv); 321 pv = SvPV_nolen (sv);
323 334
324 sv_insert (sv, 0, 0, pfx, 2); 335 sv_insert (sv, 0, 0, pfx, 2);
325 } 336 }
326 337
327 if (ix) /* compress */ 338 if (ix) /* compress */
328 sv = sv_2mortal (compress_sv (sv, deref ? MAGIC_CR_deref : MAGIC_CR, -1)); 339 sv = sv_2mortal (compress_sv (sv, deref ? MAGIC_CR_deref : MAGIC_CR, -1, best));
329 340
330 XPUSHs (sv); 341 XPUSHs (sv);
331 } 342 }
332 else if (SvPOKp (sv) && IN_RANGE (SvPVX (sv)[0], MAGIC_LO, MAGIC_HI)) 343 else if (SvPOKp (sv) && IN_RANGE (SvPVX (sv)[0], MAGIC_LO, MAGIC_HI))
333 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, MAGIC_U))); /* need to prefix only */ 344 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, MAGIC_U, best))); /* need to prefix only */
334 else if (ix == 2) /* compress always */ 345 else if (ix == 2) /* compress always */
335 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, -1))); 346 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, -1, best)));
336 else if (SvNIOK (sv)) /* don't compress */ 347 else if (SvNIOK (sv)) /* don't compress */
337 { 348 {
338 STRLEN len; 349 STRLEN len;
339 char *s = SvPV (sv, len); 350 char *s = SvPV (sv, len);
340 XPUSHs (sv_2mortal (newSVpvn (s, len))); 351 XPUSHs (sv_2mortal (newSVpvn (s, len)));
341 } 352 }
342 else /* don't compress */ 353 else /* don't compress */
343 XPUSHs (sv_2mortal (newSVsv (sv))); 354 XPUSHs (sv_2mortal (newSVsv (sv)));
355}
344 356
345void 357void
346sthaw(sv) 358sthaw(sv)
347 SV * sv 359 SV * sv
348 PROTOTYPE: $ 360 PROTOTYPE: $
380 PUSHMARK (SP); 392 PUSHMARK (SP);
381 XPUSHs (sv); 393 XPUSHs (sv);
382 PUTBACK; 394 PUTBACK;
383 395
384 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) 396 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR))
385 croak ("Storable::mstore didn't return a single scalar"); 397 croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mretrieve));
386 398
387 SPAGAIN; 399 SPAGAIN;
388 400
389 if (deref) 401 if (deref)
390 SETs (sv_2mortal (SvREFCNT_inc (SvRV (TOPs)))); 402 SETs (sv_2mortal (SvREFCNT_inc (SvRV (TOPs))));
428 PUSHMARK (SP); 440 PUSHMARK (SP);
429 XPUSHs (sv); 441 XPUSHs (sv);
430 PUTBACK; 442 PUTBACK;
431 443
432 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) 444 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR))
433 croak ("Storable::mstore didn't return a single scalar"); 445 croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mretrieve));
434 446
435 SPAGAIN; 447 SPAGAIN;
436 448
437 if (deref) 449 if (deref)
438 { 450 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines