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.25 by root, Wed Jan 9 20:41:18 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 */
283 && SvTYPE(sv) != SVt_PVIV 294 && SvTYPE(sv) != SVt_PVIV
284 && SvTYPE(sv) != SVt_PVNV 295 && SvTYPE(sv) != SVt_PVNV
285 && SvTYPE(sv) != SVt_PVMG)) /* mstore */ 296 && SvTYPE(sv) != SVt_PVMG)) /* mstore */
286 { 297 {
287 int deref = !SvROK (sv); 298 int deref = !SvROK (sv);
299 char *pv;
288 300
289 if (!storable_mstore) 301 if (!storable_mstore)
290 { 302 {
291 PUTBACK; 303 PUTBACK;
292 need_storable (); 304 need_storable ();
299 PUSHMARK (SP); 311 PUSHMARK (SP);
300 XPUSHs (sv); 312 XPUSHs (sv);
301 PUTBACK; 313 PUTBACK;
302 314
303 if (1 != call_sv ((SV *)storable_mstore, G_SCALAR)) 315 if (1 != call_sv ((SV *)storable_mstore, G_SCALAR))
304 croak ("Storable::mstore didn't return a single scalar"); 316 croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mstore));
305 317
306 SPAGAIN; 318 SPAGAIN;
307 319
308 sv = POPs; 320 sv = POPs;
321 pv = SvPV_nolen (sv);
309 322
310 if (SvPVX (sv)[0] == MAGIC_R) 323 if (*pv == MAGIC_R)
311 { 324 {
312 if (deref) 325 if (deref)
313 SvPVX (sv)[0] = MAGIC_R_deref; 326 *pv = MAGIC_R_deref;
314 } 327 }
315 else 328 else
316 { 329 {
317 char pfx[2]; 330 char pfx[2];
318 331
321 334
322 sv_insert (sv, 0, 0, pfx, 2); 335 sv_insert (sv, 0, 0, pfx, 2);
323 } 336 }
324 337
325 if (ix) /* compress */ 338 if (ix) /* compress */
326 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));
327 340
328 XPUSHs (sv); 341 XPUSHs (sv);
329 } 342 }
330 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))
331 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 */
332 else if (ix == 2) /* compress always */ 345 else if (ix == 2) /* compress always */
333 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, -1))); 346 XPUSHs (sv_2mortal (compress_sv (sv, MAGIC_C, -1, best)));
334 else if (SvNIOK (sv)) /* don't compress */ 347 else if (SvNIOK (sv)) /* don't compress */
335 { 348 {
336 STRLEN len; 349 STRLEN len;
337 char *s = SvPV (sv, len); 350 char *s = SvPV (sv, len);
338 XPUSHs (sv_2mortal (newSVpvn (s, len))); 351 XPUSHs (sv_2mortal (newSVpvn (s, len)));
339 } 352 }
340 else /* don't compress */ 353 else /* don't compress */
341 XPUSHs (sv_2mortal (newSVsv (sv))); 354 XPUSHs (sv_2mortal (newSVsv (sv)));
355}
342 356
343void 357void
344sthaw(sv) 358sthaw(sv)
345 SV * sv 359 SV * sv
346 PROTOTYPE: $ 360 PROTOTYPE: $
378 PUSHMARK (SP); 392 PUSHMARK (SP);
379 XPUSHs (sv); 393 XPUSHs (sv);
380 PUTBACK; 394 PUTBACK;
381 395
382 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) 396 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR))
383 croak ("Storable::mstore didn't return a single scalar"); 397 croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mretrieve));
384 398
385 SPAGAIN; 399 SPAGAIN;
386 400
387 if (deref) 401 if (deref)
388 SETs (sv_2mortal (SvREFCNT_inc (SvRV (TOPs)))); 402 SETs (sv_2mortal (SvREFCNT_inc (SvRV (TOPs))));
426 PUSHMARK (SP); 440 PUSHMARK (SP);
427 XPUSHs (sv); 441 XPUSHs (sv);
428 PUTBACK; 442 PUTBACK;
429 443
430 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) 444 if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR))
431 croak ("Storable::mstore didn't return a single scalar"); 445 croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mretrieve));
432 446
433 SPAGAIN; 447 SPAGAIN;
434 448
435 if (deref) 449 if (deref)
436 { 450 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines