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.31 by root, Sun Aug 25 18:13:26 2013 UTC vs.
Revision 1.32 by root, Sat Jun 27 19:52:44 2015 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#include "perlmulticore.h"
4 6
5#define LZF_STANDALONE 1 7#define LZF_STANDALONE 1
6#define LZF_STATE_ARG 1 8#define LZF_STATE_ARG 1
7 9
8#include "lzf_c.c" 10#include "lzf_c.c"
58 else if (usize <= 0x7ff) 60 else if (usize <= 0x7ff)
59 { 61 {
60 dst[skip++] = (( usize >> 6) | 0xc0); 62 dst[skip++] = (( usize >> 6) | 0xc0);
61 dst[skip++] = (( usize & 0x3f) | 0x80); 63 dst[skip++] = (( usize & 0x3f) | 0x80);
62 } 64 }
63 else if (usize <= 0xffff) 65 else if (usize <= 0xffff)
64 { 66 {
65 dst[skip++] = (( usize >> 12) | 0xe0); 67 dst[skip++] = (( usize >> 12) | 0xe0);
66 dst[skip++] = (((usize >> 6) & 0x3f) | 0x80); 68 dst[skip++] = (((usize >> 6) & 0x3f) | 0x80);
67 dst[skip++] = (( usize & 0x3f) | 0x80); 69 dst[skip++] = (( usize & 0x3f) | 0x80);
68 } 70 }
69 else if (usize <= 0x1fffff) 71 else if (usize <= 0x1fffff)
70 { 72 {
71 dst[skip++] = (( usize >> 18) | 0xf0); 73 dst[skip++] = (( usize >> 18) | 0xf0);
72 dst[skip++] = (((usize >> 12) & 0x3f) | 0x80); 74 dst[skip++] = (((usize >> 12) & 0x3f) | 0x80);
73 dst[skip++] = (((usize >> 6) & 0x3f) | 0x80); 75 dst[skip++] = (((usize >> 6) & 0x3f) | 0x80);
74 dst[skip++] = (( usize & 0x3f) | 0x80); 76 dst[skip++] = (( usize & 0x3f) | 0x80);
75 } 77 }
76 else if (usize <= 0x3ffffff) 78 else if (usize <= 0x3ffffff)
77 { 79 {
78 dst[skip++] = (( usize >> 24) | 0xf8); 80 dst[skip++] = (( usize >> 24) | 0xf8);
79 dst[skip++] = (((usize >> 18) & 0x3f) | 0x80); 81 dst[skip++] = (((usize >> 18) & 0x3f) | 0x80);
80 dst[skip++] = (((usize >> 12) & 0x3f) | 0x80); 82 dst[skip++] = (((usize >> 12) & 0x3f) | 0x80);
81 dst[skip++] = (((usize >> 6) & 0x3f) | 0x80); 83 dst[skip++] = (((usize >> 6) & 0x3f) | 0x80);
82 dst[skip++] = (( usize & 0x3f) | 0x80); 84 dst[skip++] = (( usize & 0x3f) | 0x80);
83 } 85 }
84 else if (usize <= 0x7fffffff) 86 else if (usize <= 0x7fffffff)
85 { 87 {
86 dst[skip++] = (( usize >> 30) | 0xfc); 88 dst[skip++] = (( usize >> 30) | 0xfc);
87 dst[skip++] = (((usize >> 24) & 0x3f) | 0x80); 89 dst[skip++] = (((usize >> 24) & 0x3f) | 0x80);
88 dst[skip++] = (((usize >> 18) & 0x3f) | 0x80); 90 dst[skip++] = (((usize >> 18) & 0x3f) | 0x80);
89 dst[skip++] = (((usize >> 12) & 0x3f) | 0x80); 91 dst[skip++] = (((usize >> 12) & 0x3f) | 0x80);
95 97
96 New (0, state, 1, LZF_STATE); 98 New (0, state, 1, LZF_STATE);
97 if (!state) 99 if (!state)
98 croak ("Compress::LZF unable to allocate memory for compression state"); 100 croak ("Compress::LZF unable to allocate memory for compression state");
99 101
102 if (usize > 1000) perlinterp_release ();
100 /* 11 bytes is the smallest compressible string */ 103 /* 11 bytes is the smallest compressible string */
101 csize = usize < 11 ? 0 : 104 csize = usize < 11 ? 0 :
102 (best ? lzf_compress_best (src, usize, dst + skip, usize - skip) 105 (best ? lzf_compress_best (src, usize, dst + skip, usize - skip)
103 : lzf_compress (src, usize, dst + skip, usize - skip, *state)); 106 : lzf_compress (src, usize, dst + skip, usize - skip, *state));
107 if (usize > 1000) perlinterp_acquire ();
104 108
105 Safefree (state); 109 Safefree (state);
106 110
107 if (csize) 111 if (csize)
108 { 112 {
136 140
137 if (csize) 141 if (csize)
138 { 142 {
139 void *dst; 143 void *dst;
140 SV *ret; 144 SV *ret;
145 int res;
141 146
142 csize -= skip; 147 csize -= skip;
143 148
144 if (src[0]) 149 if (src[0])
145 { 150 {
191 else 196 else
192 croak ("compressed data corrupted (invalid length)"); 197 croak ("compressed data corrupted (invalid length)");
193 198
194 if (!usize) 199 if (!usize)
195 croak ("compressed data corrupted (invalid length)"); 200 croak ("compressed data corrupted (invalid length)");
196 201
197 ret = NEWSV (0, usize); 202 ret = NEWSV (0, usize);
198 SvPOK_only (ret); 203 SvPOK_only (ret);
199 dst = SvPVX (ret); 204 dst = SvPVX (ret);
200 205
206 if (usize > 2000) perlinterp_release ();
201 if (lzf_decompress (src, csize, dst, usize) != usize) 207 res = lzf_decompress (src, csize, dst, usize) != usize;
208 if (usize > 2000) perlinterp_acquire ();
209
210 if (res)
202 { 211 {
203 SvREFCNT_dec (ret); 212 SvREFCNT_dec (ret);
204 croak ("compressed data corrupted (size mismatch)", csize, skip, usize); 213 croak ("compressed data corrupted (size mismatch)", csize, skip, usize);
205 } 214 }
206 } 215 }
454 SvPVX (sv)[0] = MAGIC_R_deref; 463 SvPVX (sv)[0] = MAGIC_R_deref;
455 } 464 }
456 else 465 else
457 SETs (sv_2mortal (newSVsv (TOPs))); 466 SETs (sv_2mortal (newSVsv (TOPs)));
458 467
459 break; 468 break;
460 469
461 default: 470 default:
462 croak ("Compress::LZF::sthaw(): invalid data, maybe you need a newer version of Compress::LZF?"); 471 croak ("Compress::LZF::sthaw(): invalid data, maybe you need a newer version of Compress::LZF?");
463 } 472 }
464 } 473 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines