Skip to content

Commit 044cc55

Browse files
committed
Merge branch 'thekid-feature/incremental-obj'
2 parents ac2cef8 + 527741c commit 044cc55

File tree

8 files changed

+696
-33
lines changed

8 files changed

+696
-33
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+
Zstd\\Compress\\Context **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 instance on success, or FALSE on failure
234+
235+
236+
### zstd\_compress\_add — Incrementally compress data
237+
238+
#### Description
239+
240+
string **zstd\_compress\_add** ( Zstd\\Compress\\Context _$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+
Zstd\\UnCompress\\Context **zstd\_uncompress\_init** ( void )
268+
269+
Initialize an incremental uncompress context
270+
271+
#### Return Values
272+
273+
Returns a zstd context instance on success, or FALSE on failure
274+
275+
276+
### zstd\_uncompress\_add — Incrementally uncompress data
277+
278+
#### Description
279+
280+
string **zstd\_uncompress\_add** ( Zstd\\UnCompress\\Context _$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 aliases.
225318

226319
## Streams
227320

php_zstd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ extern zend_module_entry zstd_module_entry;
4242
#include "TSRM.h"
4343
#endif
4444

45-
#if PHP_VERSION_ID >= 80000
4645
typedef struct _php_zstd_context php_zstd_context;
4746

47+
#if PHP_VERSION_ID >= 80000
4848
ZEND_BEGIN_MODULE_GLOBALS(zstd)
4949
zend_long output_compression;
5050
zend_long output_compression_default;

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: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
object(Zstd\Compress\Context)#%d (0) {
29+
}
30+
int(%d)
31+
bool(true)
32+
bool(true)
33+
int(512)
34+
object(Zstd\Compress\Context)#%d (0) {
35+
}
36+
int(%d)
37+
bool(true)
38+
bool(true)
39+
int(1024)
40+
object(Zstd\Compress\Context)#%d (0) {
41+
}
42+
int(%d)
43+
bool(true)
44+
bool(true)
45+
===Done===

tests/inc_decomp.phpt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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+
object(Zstd\UnCompress\Context)#%d (0) {
29+
}
30+
bool(true)
31+
int(512)
32+
object(Zstd\UnCompress\Context)#%d (0) {
33+
}
34+
bool(true)
35+
int(1024)
36+
object(Zstd\UnCompress\Context)#%d (0) {
37+
}
38+
bool(true)
39+
===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)