Skip to content

Commit 9d9d2c6

Browse files
committed
Merge branch 'feature/incremental' of github.com:thekid/php-ext-zstd into thekid-feature/incremental
2 parents ac2cef8 + 6020f3d commit 9d9d2c6

File tree

7 files changed

+495
-32
lines changed

7 files changed

+495
-32
lines changed

README.md

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@ LIBZSTD\_VERSION\_STRING | libzstd version string
104104
* zstd\_uncompress — Zstandard decompression
105105
* zstd\_compress\_dict — Zstandard compression using a digested dictionary
106106
* zstd\_uncompress\_dict — Zstandard decompression using a digested dictionary
107+
* zstd\_compress_\init — Initialize an incremental compress context
108+
* zstd\_compress\_add — Incrementally compress data
109+
* zstd\_uncompress_\init — Initialize an incremental uncompress context
110+
* zstd\_uncompress\_add — Incrementally uncompress data
111+
107112

108113
### zstd\_compress — Zstandard compression
109114

@@ -209,6 +214,88 @@ Zstandard decompression using a digested dictionary.
209214
Returns the decompressed data or FALSE if an error occurred.
210215

211216

217+
### zstd\_compress\_init — Initialize an incremental compress context
218+
219+
#### Description
220+
221+
resource **zstd\_compress\_init** ( [ int _$level_ = ZSTD_COMPRESS_LEVEL_DEFAULT ] )
222+
223+
Initialize an incremental compress context
224+
225+
#### Parameters
226+
227+
* _level_
228+
229+
The higher the level, the slower the compression. (Defaults to `ZSTD_COMPRESS_LEVEL_DEFAULT`)
230+
231+
#### Return Values
232+
233+
Returns a zstd context resource (zstd.state) on success, or FALSE on failure
234+
235+
236+
### zstd\_compress\_add — Incrementally compress data
237+
238+
#### Description
239+
240+
string **zstd\_compress\_add** ( resource _$context_, string _$data_ [, bool _$end_ = false ] )
241+
242+
Incrementally compress data
243+
244+
#### Parameters
245+
246+
* _context_
247+
248+
A context created with `zstd_compress_init()`.
249+
250+
* _data_
251+
252+
A chunk of data to compress.
253+
254+
* _end_
255+
256+
Set to true to terminate with the last chunk of data.
257+
258+
#### Return Values
259+
260+
Returns a chunk of compressed data, or FALSE on failure.
261+
262+
263+
### zstd\_uncompress\_init — Initialize an incremental uncompress context
264+
265+
#### Description
266+
267+
resource **zstd\_uncompress\_init** ( void )
268+
269+
Initialize an incremental uncompress context
270+
271+
#### Return Values
272+
273+
Returns a zstd context resource (zstd.state) on success, or FALSE on failure
274+
275+
276+
### zstd\_uncompress\_add — Incrementally uncompress data
277+
278+
#### Description
279+
280+
string **zstd\_uncompress\_add** ( resource _$context_, string _$data_ )
281+
282+
Incrementally uncompress data
283+
284+
#### Parameters
285+
286+
* _context_
287+
288+
A context created with `zstd_uncompress_init()`.
289+
290+
* _data_
291+
292+
A chunk of compressed data.
293+
294+
#### Return Values
295+
296+
Returns a chunk of uncompressed data, or FALSE on failure.
297+
298+
212299
## Namespace
213300

214301
```
@@ -218,10 +305,16 @@ function compress( $data [, $level = 3 ] )
218305
function uncompress( $data )
219306
function compress_dict ( $data, $dict )
220307
function uncompress_dict ( $data, $dict )
308+
function compress_init ( [ $level = 3 ] )
309+
function compress_add ( $context, $data [, $end = false ] )
310+
function uncompress_init ()
311+
function uncompress_add ( $context, $data )
312+
221313
```
222314

223-
`zstd_compress`, `zstd_uncompress`, `zstd_compress_dict` and
224-
`zstd_uncompress_dict` function alias.
315+
`zstd_compress`, `zstd_uncompress`, `zstd_compress_dict`,
316+
`zstd_uncompress_dict`, `zstd_compress_init`, `zstd_compress_add`,
317+
`zstd_uncompress_init` and `zstd_uncompress_add` function alias.
225318

226319
## Streams
227320

tests/inc.phpt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Incremental compression and decompression
3+
--FILE--
4+
<?php
5+
6+
// compression
7+
$resource = zstd_compress_init();
8+
$compressed = '';
9+
$compressed .= zstd_compress_add($resource, 'Hello, ', false);
10+
$compressed .= zstd_compress_add($resource, 'World!', false);
11+
$compressed .= zstd_compress_add($resource, '', true);
12+
13+
echo zstd_uncompress($compressed), PHP_EOL;
14+
15+
// uncompression
16+
$resource = zstd_uncompress_init();
17+
$uncompressed = '';
18+
$uncompressed .= zstd_uncompress_add($resource, substr($compressed, 0, 5));
19+
$uncompressed .= zstd_uncompress_add($resource, substr($compressed, 5));
20+
21+
echo $uncompressed, PHP_EOL;
22+
?>
23+
===Done===
24+
--EXPECTF--
25+
Hello, World!
26+
Hello, World!
27+
===Done===

tests/inc_comp.phpt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
--TEST--
2+
Incremental compression
3+
--FILE--
4+
<?php
5+
include(dirname(__FILE__) . '/data.inc');
6+
7+
foreach ([128, 512, 1024] as $size) {
8+
var_dump($size);
9+
$handle = zstd_compress_init();
10+
var_dump($handle);
11+
12+
$pos= 0;
13+
$compressed = '';
14+
while ($pos < strlen($data)) {
15+
$chunk = substr($data, $pos, $size);
16+
$compressed .= zstd_compress_add($handle, $chunk, false);
17+
$pos += strlen($chunk);
18+
}
19+
$compressed .= zstd_compress_add($handle, '', true);
20+
var_dump(strlen($compressed), strlen($compressed) < strlen($data));
21+
22+
var_dump($data === zstd_uncompress($compressed));
23+
}
24+
?>
25+
===Done===
26+
--EXPECTF--
27+
int(128)
28+
resource(%d) of type (zstd.state)
29+
int(%d)
30+
bool(true)
31+
bool(true)
32+
int(512)
33+
resource(%d) of type (zstd.state)
34+
int(%d)
35+
bool(true)
36+
bool(true)
37+
int(1024)
38+
resource(%d) of type (zstd.state)
39+
int(%d)
40+
bool(true)
41+
bool(true)
42+
===Done===

tests/inc_decomp.phpt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
--TEST--
2+
Incremental decompression
3+
--FILE--
4+
<?php
5+
include(dirname(__FILE__) . '/data.inc');
6+
7+
$compressed = zstd_compress($data);
8+
9+
foreach ([128, 512, 1024] as $size) {
10+
var_dump($size);
11+
$handle = zstd_uncompress_init();
12+
var_dump($handle);
13+
14+
$pos= 0;
15+
$uncompressed = '';
16+
while ($pos < strlen($compressed)) {
17+
$chunk = substr($compressed, $pos, $size);
18+
$uncompressed .= zstd_uncompress_add($handle, $chunk);
19+
$pos += strlen($chunk);
20+
}
21+
22+
var_dump($data === $uncompressed);
23+
}
24+
?>
25+
===Done===
26+
--EXPECTF--
27+
int(128)
28+
resource(%d) of type (zstd.state)
29+
bool(true)
30+
int(512)
31+
resource(%d) of type (zstd.state)
32+
bool(true)
33+
int(1024)
34+
resource(%d) of type (zstd.state)
35+
bool(true)
36+
===Done===

tests/inc_ns.phpt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Incremental compression and decompression (namespaces)
3+
--FILE--
4+
<?php
5+
6+
// compression
7+
$resource = \Zstd\compress_init();
8+
$compressed = '';
9+
$compressed .= \Zstd\compress_add($resource, 'Hello, ', false);
10+
$compressed .= \Zstd\compress_add($resource, 'World!', false);
11+
$compressed .= \Zstd\compress_add($resource, '', true);
12+
13+
echo \Zstd\uncompress($compressed), PHP_EOL;
14+
15+
// uncompression
16+
$resource = \Zstd\uncompress_init();
17+
$uncompressed = '';
18+
$uncompressed .= \Zstd\uncompress_add($resource, substr($compressed, 0, 5));
19+
$uncompressed .= \Zstd\uncompress_add($resource, substr($compressed, 5));
20+
21+
echo $uncompressed, PHP_EOL;
22+
?>
23+
===Done===
24+
--EXPECTF--
25+
Hello, World!
26+
Hello, World!
27+
===Done===

0 commit comments

Comments
 (0)