Skip to content

Commit 36a70f9

Browse files
committed
Add enable long matching distance
1 parent 160d0a3 commit 36a70f9

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

c_src/zstd_nif.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ static ERL_NIF_TERM zstd_nif_new_decompression_stream(ErlNifEnv* env, int argc,
112112
static ERL_NIF_TERM zstd_nif_init_compression_stream(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
113113
int level = ZSTD_CLEVEL_DEFAULT;
114114
int window_log = 0;
115+
int enable_long_distance_matching = 0;
115116
size_t ret;
116117
ZSTD_CStream **pzcs;
117118

@@ -124,14 +125,20 @@ static ERL_NIF_TERM zstd_nif_init_compression_stream(ErlNifEnv* env, int argc, c
124125
return enif_make_badarg(env);
125126

126127
/* extract the window log if any */
127-
if ((argc == 3) && !(enif_get_int(env, argv[2], &window_log)))
128+
if ((argc >= 3) && !(enif_get_int(env, argv[2], &window_log)))
129+
return enif_make_badarg(env);
130+
131+
/* extract the enable long distance matching if any */
132+
if ((argc == 4) && !(enif_get_int(env, argv[3], &enable_long_distance_matching)))
128133
return enif_make_badarg(env);
129134

130135
/* initialize the stream */
131136
if (ZSTD_isError(ret = ZSTD_initCStream(*pzcs, level)))
132137
return enif_make_tuple2(env, zstd_atom_error, enif_make_string(env, ZSTD_getErrorName(ret), ERL_NIF_LATIN1));
133138
if (ZSTD_isError(ret = ZSTD_CCtx_setParameter(*pzcs, ZSTD_c_windowLog, window_log)))
134139
return enif_make_tuple2(env, zstd_atom_error, enif_make_string(env, ZSTD_getErrorName(ret), ERL_NIF_LATIN1));
140+
if (ZSTD_isError(ret = ZSTD_CCtx_setParameter(*pzcs, ZSTD_c_enableLongDistanceMatching, enable_long_distance_matching)))
141+
return enif_make_tuple2(env, zstd_atom_error, enif_make_string(env, ZSTD_getErrorName(ret), ERL_NIF_LATIN1));
135142
if (ZSTD_isError(ret = ZSTD_CCtx_setParameter(*pzcs, ZSTD_c_checksumFlag, 1)))
136143
return enif_make_tuple2(env, zstd_atom_error, enif_make_string(env, ZSTD_getErrorName(ret), ERL_NIF_LATIN1));
137144

@@ -423,6 +430,7 @@ static ErlNifFunc nif_funcs[] = {
423430
{ "compression_stream_init" , 1, zstd_nif_init_compression_stream , ERL_DIRTY_JOB_CPU_BOUND },
424431
{ "compression_stream_init" , 2, zstd_nif_init_compression_stream , ERL_DIRTY_JOB_CPU_BOUND },
425432
{ "compression_stream_init" , 3, zstd_nif_init_compression_stream , ERL_DIRTY_JOB_CPU_BOUND },
433+
{ "compression_stream_init" , 4, zstd_nif_init_compression_stream , ERL_DIRTY_JOB_CPU_BOUND },
426434
{ "decompression_stream_init" , 1, zstd_nif_init_decompression_stream , ERL_DIRTY_JOB_CPU_BOUND },
427435

428436
{ "compression_stream_reset" , 2, zstd_nif_reset_compression_stream },

src/zstd.erl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
-export([compress/1, compress/2]).
44
-export([decompress/1]).
55
-export([new_compression_stream/0, compression_stream_init/1, compression_stream_init/2,
6-
compression_stream_init/3, compression_stream_reset/1, compression_stream_reset/2,
7-
stream_compress/2, stream_flush/1, new_decompression_stream/0,
6+
compression_stream_init/3, compression_stream_init/4, compression_stream_reset/1,
7+
compression_stream_reset/2, stream_compress/2, stream_flush/1, new_decompression_stream/0,
88
decompression_stream_init/1, decompression_stream_reset/1, stream_decompress/2]).
99

1010
-on_load init/0.
@@ -46,6 +46,11 @@ compression_stream_init(_Ref, _Level) ->
4646
compression_stream_init(_Ref, _Level, _WindowLog) ->
4747
erlang:nif_error(?LINE).
4848

49+
-spec compression_stream_init(reference(), 0..22, integer(), integer()) ->
50+
ok | {error, invalid | string()}.
51+
compression_stream_init(_Ref, _Level, _WindowLog, _EnableLongDistanceMatching) ->
52+
erlang:nif_error(?LINE).
53+
4954
-spec decompression_stream_init(reference()) -> ok | {error, invalid | string()}.
5055
decompression_stream_init(_Ref) ->
5156
erlang:nif_error(?LINE).

test/zstd_tests.erl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
-module(zstd_tests).
22

3+
-define(COMPRESSION_LEVEL, 5).
4+
-define(WINDOW_LOG, 23).
5+
-define(ENABLE_LONG_DISTANCE_MATCHING, 1).
6+
37
-include_lib("eunit/include/eunit.hrl").
48

59
zstd_test() ->
@@ -11,7 +15,11 @@ zstd_test() ->
1115
zstd_stream_test() ->
1216
Bin = << <<"A">> || _ <- lists:seq(1, 1024 * 1024) >>,
1317
CStream = zstd:new_compression_stream(),
14-
ok = zstd:compression_stream_init(CStream, 5, 23),
18+
ok =
19+
zstd:compression_stream_init(CStream,
20+
?COMPRESSION_LEVEL,
21+
?WINDOW_LOG,
22+
?ENABLE_LONG_DISTANCE_MATCHING),
1523
{ok, CompressionBin} = zstd:stream_compress(CStream, Bin),
1624
{ok, FlushBin} = zstd:stream_flush(CStream),
1725

0 commit comments

Comments
 (0)