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 | } |