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.30 by root, Mon Dec 29 08:46:40 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 {
249 SvREFCNT_dec (storable_mretrieve); 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 */
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: $

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines