18e4f1a1aSRoy Oursler /**********************************************************************
28e4f1a1aSRoy Oursler Copyright(c) 2011-2018 Intel Corporation All rights reserved.
38e4f1a1aSRoy Oursler
48e4f1a1aSRoy Oursler Redistribution and use in source and binary forms, with or without
58e4f1a1aSRoy Oursler modification, are permitted provided that the following conditions
68e4f1a1aSRoy Oursler are met:
78e4f1a1aSRoy Oursler * Redistributions of source code must retain the above copyright
88e4f1a1aSRoy Oursler notice, this list of conditions and the following disclaimer.
98e4f1a1aSRoy Oursler * Redistributions in binary form must reproduce the above copyright
108e4f1a1aSRoy Oursler notice, this list of conditions and the following disclaimer in
118e4f1a1aSRoy Oursler the documentation and/or other materials provided with the
128e4f1a1aSRoy Oursler distribution.
138e4f1a1aSRoy Oursler * Neither the name of Intel Corporation nor the names of its
148e4f1a1aSRoy Oursler contributors may be used to endorse or promote products derived
158e4f1a1aSRoy Oursler from this software without specific prior written permission.
168e4f1a1aSRoy Oursler
178e4f1a1aSRoy Oursler THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
188e4f1a1aSRoy Oursler "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
198e4f1a1aSRoy Oursler LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
208e4f1a1aSRoy Oursler A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
218e4f1a1aSRoy Oursler OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
228e4f1a1aSRoy Oursler SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
238e4f1a1aSRoy Oursler LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
248e4f1a1aSRoy Oursler DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
258e4f1a1aSRoy Oursler THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
268e4f1a1aSRoy Oursler (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
278e4f1a1aSRoy Oursler OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
288e4f1a1aSRoy Oursler **********************************************************************/
298e4f1a1aSRoy Oursler
308e4f1a1aSRoy Oursler #define _FILE_OFFSET_BITS 64
318e4f1a1aSRoy Oursler #include <stdio.h>
3257eed2f0SYibo Cai #include <stdlib.h>
338e4f1a1aSRoy Oursler #include <assert.h>
348e4f1a1aSRoy Oursler #include <getopt.h>
358e4f1a1aSRoy Oursler #include "huff_codes.h"
368e4f1a1aSRoy Oursler #include "igzip_lib.h"
378e4f1a1aSRoy Oursler #include "test.h"
388e4f1a1aSRoy Oursler
398e4f1a1aSRoy Oursler #include <zlib.h>
408e4f1a1aSRoy Oursler
418e4f1a1aSRoy Oursler #define BUF_SIZE 1024
428e4f1a1aSRoy Oursler
431db0363cSGreg Tucker #define OPTARGS "hl:f:z:i:d:stub:y:w:o:D:"
448e4f1a1aSRoy Oursler
458e4f1a1aSRoy Oursler #define COMPRESSION_QUEUE_LIMIT 32
465793a851SRoy Oursler #define UNSET -1
478e4f1a1aSRoy Oursler
48fc9f7493SGreg Tucker #define xstr(a) str(a)
49fc9f7493SGreg Tucker #define str(a) #a
50fc9f7493SGreg Tucker
512458a651SRoy Oursler /* Limit output buffer size to 2 Gigabytes. Since stream->avail_out is a
522458a651SRoy Oursler * uint32_t and there is no logic for handling an overflowed output buffer in
532458a651SRoy Oursler * the perf test, this define must be less then 4 Gigabytes */
54f430953fSZhiyuan Zhu #define MAX_COMPRESS_BUF_SIZE (1U << 31)
552458a651SRoy Oursler
568e4f1a1aSRoy Oursler int level_size_buf[10] = {
578e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL0_DEFAULT
588e4f1a1aSRoy Oursler ISAL_DEF_LVL0_DEFAULT,
598e4f1a1aSRoy Oursler #else
608e4f1a1aSRoy Oursler 0,
618e4f1a1aSRoy Oursler #endif
628e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL1_DEFAULT
638e4f1a1aSRoy Oursler ISAL_DEF_LVL1_DEFAULT,
648e4f1a1aSRoy Oursler #else
658e4f1a1aSRoy Oursler 0,
668e4f1a1aSRoy Oursler #endif
678e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL2_DEFAULT
688e4f1a1aSRoy Oursler ISAL_DEF_LVL2_DEFAULT,
698e4f1a1aSRoy Oursler #else
708e4f1a1aSRoy Oursler 0,
718e4f1a1aSRoy Oursler #endif
728e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL3_DEFAULT
738e4f1a1aSRoy Oursler ISAL_DEF_LVL3_DEFAULT,
748e4f1a1aSRoy Oursler #else
758e4f1a1aSRoy Oursler 0,
768e4f1a1aSRoy Oursler #endif
778e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL4_DEFAULT
788e4f1a1aSRoy Oursler ISAL_DEF_LVL4_DEFAULT,
798e4f1a1aSRoy Oursler #else
808e4f1a1aSRoy Oursler 0,
818e4f1a1aSRoy Oursler #endif
828e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL5_DEFAULT
838e4f1a1aSRoy Oursler ISAL_DEF_LVL5_DEFAULT,
848e4f1a1aSRoy Oursler #else
858e4f1a1aSRoy Oursler 0,
868e4f1a1aSRoy Oursler #endif
878e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL6_DEFAULT
888e4f1a1aSRoy Oursler ISAL_DEF_LVL6_DEFAULT,
898e4f1a1aSRoy Oursler #else
908e4f1a1aSRoy Oursler 0,
918e4f1a1aSRoy Oursler #endif
928e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL7_DEFAULT
938e4f1a1aSRoy Oursler ISAL_DEF_LVL7_DEFAULT,
948e4f1a1aSRoy Oursler #else
958e4f1a1aSRoy Oursler 0,
968e4f1a1aSRoy Oursler #endif
978e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL8_DEFAULT
988e4f1a1aSRoy Oursler ISAL_DEF_LVL8_DEFAULT,
998e4f1a1aSRoy Oursler #else
1008e4f1a1aSRoy Oursler 0,
1018e4f1a1aSRoy Oursler #endif
1028e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL9_DEFAULT
1038e4f1a1aSRoy Oursler ISAL_DEF_LVL9_DEFAULT,
1048e4f1a1aSRoy Oursler #else
1058e4f1a1aSRoy Oursler 0,
1068e4f1a1aSRoy Oursler #endif
1078e4f1a1aSRoy Oursler };
1088e4f1a1aSRoy Oursler
109*55fbfabfSMarcel Cornu enum { ISAL_STATELESS, ISAL_STATEFUL, ISAL_WITH_DICTIONARY, ZLIB };
1108e4f1a1aSRoy Oursler
1118e4f1a1aSRoy Oursler struct compress_strategy {
1128e4f1a1aSRoy Oursler int32_t mode;
1138e4f1a1aSRoy Oursler int32_t level;
1148e4f1a1aSRoy Oursler };
1158e4f1a1aSRoy Oursler
1168e4f1a1aSRoy Oursler struct inflate_modes {
1178e4f1a1aSRoy Oursler int32_t stateless;
1188e4f1a1aSRoy Oursler int32_t stateful;
1198e4f1a1aSRoy Oursler int32_t zlib;
1208e4f1a1aSRoy Oursler };
1218e4f1a1aSRoy Oursler
1228e4f1a1aSRoy Oursler struct perf_info {
1238e4f1a1aSRoy Oursler char *file_name;
1248e4f1a1aSRoy Oursler size_t file_size;
1258e4f1a1aSRoy Oursler size_t deflate_size;
1268e4f1a1aSRoy Oursler uint32_t inblock_size;
12718fd9965SRoy Oursler uint32_t flush_type;
128d90220d9SRoy Oursler int32_t hist_bits;
129699bb5bdSRoy Oursler int32_t deflate_time;
130699bb5bdSRoy Oursler int32_t inflate_time;
1318e4f1a1aSRoy Oursler struct compress_strategy strategy;
1328e4f1a1aSRoy Oursler uint32_t inflate_mode;
1338e4f1a1aSRoy Oursler struct perf start;
1348e4f1a1aSRoy Oursler };
1358e4f1a1aSRoy Oursler
136*55fbfabfSMarcel Cornu void
init_perf_info(struct perf_info * info)137*55fbfabfSMarcel Cornu init_perf_info(struct perf_info *info)
1385793a851SRoy Oursler {
1395793a851SRoy Oursler memset(info, 0, sizeof(*info));
140699bb5bdSRoy Oursler info->deflate_time = BENCHMARK_TIME;
141699bb5bdSRoy Oursler info->inflate_time = BENCHMARK_TIME;
1425793a851SRoy Oursler }
1435793a851SRoy Oursler
144*55fbfabfSMarcel Cornu int
usage(void)145*55fbfabfSMarcel Cornu usage(void)
1468e4f1a1aSRoy Oursler {
1478e4f1a1aSRoy Oursler fprintf(stderr,
148fc9f7493SGreg Tucker "Usage: igzip_perf [options] <infile>\n"
1498e4f1a1aSRoy Oursler " -h help, print this message\n"
150*55fbfabfSMarcel Cornu " The options -l, -f, -z may be used up to " xstr(
151*55fbfabfSMarcel Cornu COMPRESSION_QUEUE_LIMIT) " times\n"
152*55fbfabfSMarcel Cornu " -l <level> isa-l stateless deflate level to "
153*55fbfabfSMarcel Cornu "test (" xstr(ISAL_DEF_MIN_LEVEL) "-" xstr(
154*55fbfabfSMarcel Cornu ISAL_DEF_MAX_LEVEL) ")\n"
155*55fbfabfSMarcel Cornu " -f <level> isa-l "
156*55fbfabfSMarcel Cornu "stateful deflate "
157*55fbfabfSMarcel Cornu "level to test (" xstr(ISAL_DEF_MIN_LEVEL) "-" xstr(
158*55fbfabfSMarcel Cornu ISAL_DEF_MAX_LEVEL) ")\n"
1598e4f1a1aSRoy Oursler " -z <level> zlib deflate level to test\n"
160699bb5bdSRoy Oursler " -d <time> approx time in seconds for deflate (at least 0)\n"
161699bb5bdSRoy Oursler " -i <time> approx time in seconds for inflate (at least 0)\n"
1628e4f1a1aSRoy Oursler " -s performance test isa-l stateful inflate\n"
1638e4f1a1aSRoy Oursler " -t performance test isa-l stateless inflate\n"
1648e4f1a1aSRoy Oursler " -u performance test zlib inflate\n"
1651db0363cSGreg Tucker " -D <file> use dictionary file\n"
16635e90e73SRoy Oursler " -o <file> output file to store compressed data (last one if multiple)\n"
167cb176252SRoy Oursler " -b <size> input buffer size, applies to stateful options (-f,-z,-s)\n"
168d90220d9SRoy Oursler " -y <type> flush type: 0 (default: no flush), 1 (sync flush), 2 (full flush)\n"
169fc9f7493SGreg Tucker " -w <size> log base 2 size of history window, between 9 and 15\n");
1708e4f1a1aSRoy Oursler exit(0);
1718e4f1a1aSRoy Oursler }
1728e4f1a1aSRoy Oursler
173*55fbfabfSMarcel Cornu void
print_perf_info_line(struct perf_info * info)174*55fbfabfSMarcel Cornu print_perf_info_line(struct perf_info *info)
1758e4f1a1aSRoy Oursler {
176699bb5bdSRoy Oursler printf("igzip_perf-> compress level: %d flush_type: %d block_size: %d\n",
177699bb5bdSRoy Oursler info->strategy.level, info->flush_type, info->inblock_size);
1788e4f1a1aSRoy Oursler }
1798e4f1a1aSRoy Oursler
180*55fbfabfSMarcel Cornu void
print_file_line(struct perf_info * info)181*55fbfabfSMarcel Cornu print_file_line(struct perf_info *info)
1828e4f1a1aSRoy Oursler {
1838e4f1a1aSRoy Oursler printf(" file info-> name: %s file_size: %lu compress_size: %lu ratio: %2.02f%%\n",
1848e4f1a1aSRoy Oursler info->file_name, info->file_size, info->deflate_size,
1858e4f1a1aSRoy Oursler 100.0 * info->deflate_size / info->file_size);
1868e4f1a1aSRoy Oursler }
1878e4f1a1aSRoy Oursler
188*55fbfabfSMarcel Cornu void
print_deflate_perf_line(struct perf_info * info)189*55fbfabfSMarcel Cornu print_deflate_perf_line(struct perf_info *info)
1908e4f1a1aSRoy Oursler {
1918e4f1a1aSRoy Oursler if (info->strategy.mode == ISAL_STATELESS)
1928e4f1a1aSRoy Oursler printf(" isal_stateless_deflate-> ");
1938e4f1a1aSRoy Oursler else if (info->strategy.mode == ISAL_STATEFUL)
1948e4f1a1aSRoy Oursler printf(" isal_stateful_deflate-> ");
1951db0363cSGreg Tucker else if (info->strategy.mode == ISAL_WITH_DICTIONARY)
1961db0363cSGreg Tucker printf(" isal_dictionary_deflate-> ");
1978e4f1a1aSRoy Oursler else if (info->strategy.mode == ZLIB)
1988e4f1a1aSRoy Oursler printf(" zlib_deflate-> ");
1998e4f1a1aSRoy Oursler
200699bb5bdSRoy Oursler perf_print(info->start, info->file_size);
2018e4f1a1aSRoy Oursler }
2028e4f1a1aSRoy Oursler
203*55fbfabfSMarcel Cornu void
print_inflate_perf_line(struct perf_info * info)204*55fbfabfSMarcel Cornu print_inflate_perf_line(struct perf_info *info)
2058e4f1a1aSRoy Oursler {
2068e4f1a1aSRoy Oursler if (info->inflate_mode == ISAL_STATELESS)
2078e4f1a1aSRoy Oursler printf(" isal_stateless_inflate-> ");
2088e4f1a1aSRoy Oursler else if (info->inflate_mode == ISAL_STATEFUL)
2098e4f1a1aSRoy Oursler printf(" isal_stateful_inflate-> ");
2101db0363cSGreg Tucker else if (info->inflate_mode == ISAL_WITH_DICTIONARY)
2111db0363cSGreg Tucker printf(" isal_dictionary_inflate-> ");
2128e4f1a1aSRoy Oursler else if (info->inflate_mode == ZLIB)
2138e4f1a1aSRoy Oursler printf(" zlib_inflate-> ");
2148e4f1a1aSRoy Oursler
215699bb5bdSRoy Oursler perf_print(info->start, info->file_size);
2168e4f1a1aSRoy Oursler }
2178e4f1a1aSRoy Oursler
218*55fbfabfSMarcel Cornu int
isal_deflate_round(struct isal_zstream * stream,uint8_t * outbuf,uint32_t outbuf_size,uint8_t * inbuf,uint32_t inbuf_size,uint32_t level,uint8_t * level_buf,uint32_t level_buf_size,int flush_type,int hist_bits)219*55fbfabfSMarcel Cornu isal_deflate_round(struct isal_zstream *stream, uint8_t *outbuf, uint32_t outbuf_size,
220*55fbfabfSMarcel Cornu uint8_t *inbuf, uint32_t inbuf_size, uint32_t level, uint8_t *level_buf,
221*55fbfabfSMarcel Cornu uint32_t level_buf_size, int flush_type, int hist_bits)
222412abd81SRoy Oursler {
223412abd81SRoy Oursler int check;
224412abd81SRoy Oursler
225412abd81SRoy Oursler /* Setup stream for stateless compression */
226412abd81SRoy Oursler isal_deflate_init(stream);
227412abd81SRoy Oursler stream->end_of_stream = 1; /* Do the entire file at once */
228412abd81SRoy Oursler stream->flush = flush_type;
229412abd81SRoy Oursler stream->next_in = inbuf;
230412abd81SRoy Oursler stream->avail_in = inbuf_size;
231412abd81SRoy Oursler stream->next_out = outbuf;
232412abd81SRoy Oursler stream->avail_out = outbuf_size;
233412abd81SRoy Oursler stream->level = level;
234412abd81SRoy Oursler stream->level_buf = level_buf;
235412abd81SRoy Oursler stream->level_buf_size = level_buf_size;
236d90220d9SRoy Oursler stream->hist_bits = hist_bits;
237412abd81SRoy Oursler
238412abd81SRoy Oursler /* Compress stream */
239412abd81SRoy Oursler check = isal_deflate_stateless(stream);
240412abd81SRoy Oursler
241412abd81SRoy Oursler /* Verify compression success */
242412abd81SRoy Oursler if (check || stream->avail_in)
243412abd81SRoy Oursler return 1;
244412abd81SRoy Oursler
245412abd81SRoy Oursler return 0;
246412abd81SRoy Oursler }
247412abd81SRoy Oursler
248*55fbfabfSMarcel Cornu int
isal_deflate_dict_round(struct isal_zstream * stream,uint8_t * outbuf,uint32_t outbuf_size,uint8_t * inbuf,uint32_t inbuf_size,uint32_t level,uint8_t * level_buf,uint32_t level_buf_size,int flush_type,int hist_bits,struct isal_dict * dict_str)249*55fbfabfSMarcel Cornu isal_deflate_dict_round(struct isal_zstream *stream, uint8_t *outbuf, uint32_t outbuf_size,
250*55fbfabfSMarcel Cornu uint8_t *inbuf, uint32_t inbuf_size, uint32_t level, uint8_t *level_buf,
251*55fbfabfSMarcel Cornu uint32_t level_buf_size, int flush_type, int hist_bits,
252*55fbfabfSMarcel Cornu struct isal_dict *dict_str)
2531db0363cSGreg Tucker {
2541db0363cSGreg Tucker int check;
2551db0363cSGreg Tucker
2561db0363cSGreg Tucker /* Setup stream for compression with dictionary */
2571db0363cSGreg Tucker isal_deflate_init(stream);
2581db0363cSGreg Tucker stream->level = level;
2591db0363cSGreg Tucker stream->level_buf = level_buf;
2601db0363cSGreg Tucker stream->level_buf_size = level_buf_size;
2611db0363cSGreg Tucker
2621db0363cSGreg Tucker if (COMP_OK != isal_deflate_reset_dict(stream, dict_str))
2631db0363cSGreg Tucker return 1;
2641db0363cSGreg Tucker
2651db0363cSGreg Tucker stream->end_of_stream = 1;
2661db0363cSGreg Tucker stream->flush = flush_type;
2671db0363cSGreg Tucker stream->next_in = inbuf;
2681db0363cSGreg Tucker stream->avail_in = inbuf_size;
2691db0363cSGreg Tucker stream->next_out = outbuf;
2701db0363cSGreg Tucker stream->avail_out = outbuf_size;
2711db0363cSGreg Tucker stream->hist_bits = hist_bits;
2721db0363cSGreg Tucker
2731db0363cSGreg Tucker check = isal_deflate(stream);
2741db0363cSGreg Tucker
2751db0363cSGreg Tucker /* Verify Compression Success */
2761db0363cSGreg Tucker if (COMP_OK != check || stream->avail_in > 0)
2771db0363cSGreg Tucker return 1;
2781db0363cSGreg Tucker
2791db0363cSGreg Tucker return 0;
2801db0363cSGreg Tucker }
2811db0363cSGreg Tucker
282*55fbfabfSMarcel Cornu int
isal_inflate_round(struct inflate_state * state,uint8_t * inbuf,uint32_t inbuf_size,uint8_t * outbuf,uint32_t outbuf_size,int hist_bits)283*55fbfabfSMarcel Cornu isal_inflate_round(struct inflate_state *state, uint8_t *inbuf, uint32_t inbuf_size,
284d90220d9SRoy Oursler uint8_t *outbuf, uint32_t outbuf_size, int hist_bits)
285412abd81SRoy Oursler {
286412abd81SRoy Oursler int check = 0;
287412abd81SRoy Oursler
288412abd81SRoy Oursler /* Setup for stateless inflate */
289412abd81SRoy Oursler state->next_in = inbuf;
290412abd81SRoy Oursler state->avail_in = inbuf_size;
291412abd81SRoy Oursler state->next_out = outbuf;
292412abd81SRoy Oursler state->avail_out = outbuf_size;
293412abd81SRoy Oursler state->crc_flag = ISAL_DEFLATE;
294d90220d9SRoy Oursler state->hist_bits = hist_bits;
295412abd81SRoy Oursler
296412abd81SRoy Oursler /* Inflate data */
297412abd81SRoy Oursler check = isal_inflate_stateless(state);
298412abd81SRoy Oursler
299412abd81SRoy Oursler /* Verify inflate was successful */
300412abd81SRoy Oursler if (check)
301412abd81SRoy Oursler return 1;
302412abd81SRoy Oursler
303412abd81SRoy Oursler return 0;
304412abd81SRoy Oursler }
305412abd81SRoy Oursler
306*55fbfabfSMarcel Cornu int
isal_deflate_stateful_round(struct isal_zstream * stream,uint8_t * outbuf,uint32_t outbuf_size,uint8_t * inbuf,uint32_t inbuf_size,uint32_t in_block_size,uint32_t level,uint8_t * level_buf,uint32_t level_buf_size,int flush_type,int hist_bits)307*55fbfabfSMarcel Cornu isal_deflate_stateful_round(struct isal_zstream *stream, uint8_t *outbuf, uint32_t outbuf_size,
308*55fbfabfSMarcel Cornu uint8_t *inbuf, uint32_t inbuf_size, uint32_t in_block_size,
309*55fbfabfSMarcel Cornu uint32_t level, uint8_t *level_buf, uint32_t level_buf_size,
310*55fbfabfSMarcel Cornu int flush_type, int hist_bits)
311412abd81SRoy Oursler {
312412abd81SRoy Oursler uint64_t inbuf_remaining;
313940515d5SGreg Tucker int check = COMP_OK;
314412abd81SRoy Oursler
315412abd81SRoy Oursler /* Setup stream for stateful compression */
316412abd81SRoy Oursler inbuf_remaining = inbuf_size;
317412abd81SRoy Oursler isal_deflate_init(stream);
318412abd81SRoy Oursler stream->flush = flush_type;
319412abd81SRoy Oursler stream->next_in = inbuf;
320412abd81SRoy Oursler stream->next_out = outbuf;
321412abd81SRoy Oursler stream->avail_out = outbuf_size;
322412abd81SRoy Oursler stream->level = level;
323412abd81SRoy Oursler stream->level_buf = level_buf;
324412abd81SRoy Oursler stream->level_buf_size = level_buf_size;
325d90220d9SRoy Oursler stream->hist_bits = hist_bits;
326412abd81SRoy Oursler
327412abd81SRoy Oursler /* Keep compressing so long as more data is available and no error has
328412abd81SRoy Oursler * been hit */
329940515d5SGreg Tucker while (COMP_OK == check && inbuf_remaining > in_block_size) {
330412abd81SRoy Oursler /* Setup next in buffer, assumes out buffer is sufficiently
331412abd81SRoy Oursler * large */
332412abd81SRoy Oursler stream->avail_in = in_block_size;
333412abd81SRoy Oursler inbuf_remaining -= in_block_size;
334412abd81SRoy Oursler
335412abd81SRoy Oursler /* Compress stream */
336412abd81SRoy Oursler check = isal_deflate(stream);
337412abd81SRoy Oursler }
338412abd81SRoy Oursler
339412abd81SRoy Oursler /* Finish compressing all remaining input */
340940515d5SGreg Tucker if (COMP_OK == check) {
341412abd81SRoy Oursler stream->avail_in = inbuf_remaining;
342412abd81SRoy Oursler stream->end_of_stream = 1;
343412abd81SRoy Oursler check = isal_deflate(stream);
344412abd81SRoy Oursler }
345412abd81SRoy Oursler
346412abd81SRoy Oursler /* Verify Compression Success */
347940515d5SGreg Tucker if (COMP_OK != check || stream->avail_in > 0)
348412abd81SRoy Oursler return 1;
349412abd81SRoy Oursler
350412abd81SRoy Oursler return 0;
351412abd81SRoy Oursler }
352412abd81SRoy Oursler
353*55fbfabfSMarcel Cornu int
isal_inflate_stateful_round(struct inflate_state * state,uint8_t * inbuf,uint32_t inbuf_size,uint32_t in_block_size,uint8_t * outbuf,uint32_t outbuf_size,int hist_bits,uint8_t * dict_buf,int dict_file_size)354*55fbfabfSMarcel Cornu isal_inflate_stateful_round(struct inflate_state *state, uint8_t *inbuf, uint32_t inbuf_size,
355*55fbfabfSMarcel Cornu uint32_t in_block_size, uint8_t *outbuf, uint32_t outbuf_size,
356*55fbfabfSMarcel Cornu int hist_bits, uint8_t *dict_buf, int dict_file_size)
357412abd81SRoy Oursler {
358940515d5SGreg Tucker int check = ISAL_DECOMP_OK;
359412abd81SRoy Oursler uint64_t inbuf_remaining;
360412abd81SRoy Oursler
361412abd81SRoy Oursler isal_inflate_init(state);
362412abd81SRoy Oursler state->next_in = inbuf;
363412abd81SRoy Oursler state->next_out = outbuf;
364412abd81SRoy Oursler state->avail_out = outbuf_size;
365d90220d9SRoy Oursler state->hist_bits = hist_bits;
3661db0363cSGreg Tucker if (dict_file_size != 0)
3671db0363cSGreg Tucker isal_inflate_set_dict(state, dict_buf, dict_file_size);
3681db0363cSGreg Tucker
369412abd81SRoy Oursler inbuf_remaining = inbuf_size;
370412abd81SRoy Oursler
371412abd81SRoy Oursler while (ISAL_DECOMP_OK == check && inbuf_remaining >= in_block_size) {
372412abd81SRoy Oursler state->avail_in = in_block_size;
373412abd81SRoy Oursler inbuf_remaining -= in_block_size;
374412abd81SRoy Oursler check = isal_inflate(state);
375412abd81SRoy Oursler }
376412abd81SRoy Oursler if (ISAL_DECOMP_OK == check && inbuf_remaining > 0) {
377412abd81SRoy Oursler state->avail_in = inbuf_remaining;
378412abd81SRoy Oursler check = isal_inflate(state);
379412abd81SRoy Oursler }
380412abd81SRoy Oursler
381412abd81SRoy Oursler if (ISAL_DECOMP_OK != check || state->avail_in > 0)
382412abd81SRoy Oursler return 1;
383412abd81SRoy Oursler
384412abd81SRoy Oursler return 0;
385412abd81SRoy Oursler }
386412abd81SRoy Oursler
387*55fbfabfSMarcel Cornu int
zlib_deflate_round(z_stream * gstream,uint8_t * outbuf,uInt outbuf_size,uint8_t * inbuf,uLong inbuf_size,uLong in_block_size,int level,int flush_type)388*55fbfabfSMarcel Cornu zlib_deflate_round(z_stream *gstream, uint8_t *outbuf, uInt outbuf_size, uint8_t *inbuf,
389*55fbfabfSMarcel Cornu uLong inbuf_size, uLong in_block_size, int level, int flush_type)
390412abd81SRoy Oursler {
391412abd81SRoy Oursler uLong inbuf_remaining;
392412abd81SRoy Oursler int check = Z_OK;
393412abd81SRoy Oursler
394412abd81SRoy Oursler inbuf_remaining = inbuf_size;
395412abd81SRoy Oursler
396412abd81SRoy Oursler /* Setup stream for stateful compression */
397412abd81SRoy Oursler if (0 != deflateReset(gstream))
398412abd81SRoy Oursler return 1;
399412abd81SRoy Oursler
400412abd81SRoy Oursler gstream->next_in = inbuf;
401412abd81SRoy Oursler gstream->next_out = outbuf;
402412abd81SRoy Oursler gstream->avail_out = outbuf_size;
403412abd81SRoy Oursler
404412abd81SRoy Oursler /* Keep compressing so long as more data is available and no error has
405412abd81SRoy Oursler * been hit */
406412abd81SRoy Oursler while (Z_OK == check && inbuf_remaining > in_block_size) {
407412abd81SRoy Oursler gstream->avail_in = in_block_size;
408412abd81SRoy Oursler inbuf_remaining -= in_block_size;
409412abd81SRoy Oursler check = deflate(gstream, flush_type);
410412abd81SRoy Oursler }
411412abd81SRoy Oursler
412412abd81SRoy Oursler /* Finish compressing all remaining input */
413412abd81SRoy Oursler if (Z_OK == check) {
414412abd81SRoy Oursler gstream->avail_in = inbuf_remaining;
415412abd81SRoy Oursler check = deflate(gstream, Z_FINISH);
416412abd81SRoy Oursler }
417412abd81SRoy Oursler
418412abd81SRoy Oursler /* Verify Compression Success */
419412abd81SRoy Oursler if (Z_STREAM_END != check)
420412abd81SRoy Oursler return 1;
421412abd81SRoy Oursler
422412abd81SRoy Oursler return 0;
423412abd81SRoy Oursler }
424412abd81SRoy Oursler
425*55fbfabfSMarcel Cornu int
zlib_inflate_round(z_stream * gstream,uint8_t * inbuf,uLong inbuf_size,uint8_t * outbuf,uInt outbuf_size)426*55fbfabfSMarcel Cornu zlib_inflate_round(z_stream *gstream, uint8_t *inbuf, uLong inbuf_size, uint8_t *outbuf,
427*55fbfabfSMarcel Cornu uInt outbuf_size)
428412abd81SRoy Oursler {
429412abd81SRoy Oursler int check = 0;
430412abd81SRoy Oursler
431412abd81SRoy Oursler if (0 != inflateReset(gstream))
432412abd81SRoy Oursler return 1;
433412abd81SRoy Oursler
434412abd81SRoy Oursler gstream->next_in = inbuf;
435412abd81SRoy Oursler gstream->avail_in = inbuf_size;
436412abd81SRoy Oursler gstream->next_out = outbuf;
437412abd81SRoy Oursler gstream->avail_out = outbuf_size;
438412abd81SRoy Oursler check = inflate(gstream, Z_FINISH);
439412abd81SRoy Oursler if (check != Z_STREAM_END)
440412abd81SRoy Oursler return 1;
441412abd81SRoy Oursler
442412abd81SRoy Oursler return 0;
443412abd81SRoy Oursler }
444412abd81SRoy Oursler
445*55fbfabfSMarcel Cornu int
isal_deflate_perf(uint8_t * outbuf,uint64_t * outbuf_size,uint8_t * inbuf,uint64_t inbuf_size,int level,int flush_type,int hist_bits,int time,struct perf * start)446*55fbfabfSMarcel Cornu isal_deflate_perf(uint8_t *outbuf, uint64_t *outbuf_size, uint8_t *inbuf, uint64_t inbuf_size,
447*55fbfabfSMarcel Cornu int level, int flush_type, int hist_bits, int time, struct perf *start)
4488e4f1a1aSRoy Oursler {
4498e4f1a1aSRoy Oursler struct isal_zstream stream;
4508e4f1a1aSRoy Oursler uint8_t *level_buf = NULL;
451699bb5bdSRoy Oursler int check;
4528e4f1a1aSRoy Oursler
4538e4f1a1aSRoy Oursler if (level_size_buf[level] > 0) {
4548e4f1a1aSRoy Oursler level_buf = malloc(level_size_buf[level]);
4558e4f1a1aSRoy Oursler if (level_buf == NULL)
4568e4f1a1aSRoy Oursler return 1;
4578e4f1a1aSRoy Oursler }
4588e4f1a1aSRoy Oursler
459*55fbfabfSMarcel Cornu BENCHMARK(start, time,
460*55fbfabfSMarcel Cornu check = isal_deflate_round(&stream, outbuf, *outbuf_size, inbuf, inbuf_size,
461*55fbfabfSMarcel Cornu level, level_buf, level_size_buf[level], flush_type,
462*55fbfabfSMarcel Cornu hist_bits));
4638e4f1a1aSRoy Oursler *outbuf_size = stream.total_out;
464412abd81SRoy Oursler return check;
4658e4f1a1aSRoy Oursler }
4668e4f1a1aSRoy Oursler
467*55fbfabfSMarcel Cornu int
isal_deflate_dict_perf(uint8_t * outbuf,uint64_t * outbuf_size,uint8_t * inbuf,uint64_t inbuf_size,int level,int flush_type,int hist_bits,int time,struct perf * start,uint8_t * dict_buf,int dict_file_size)468*55fbfabfSMarcel Cornu isal_deflate_dict_perf(uint8_t *outbuf, uint64_t *outbuf_size, uint8_t *inbuf, uint64_t inbuf_size,
469*55fbfabfSMarcel Cornu int level, int flush_type, int hist_bits, int time, struct perf *start,
470*55fbfabfSMarcel Cornu uint8_t *dict_buf, int dict_file_size)
4711db0363cSGreg Tucker {
4721db0363cSGreg Tucker struct isal_zstream stream;
4731db0363cSGreg Tucker struct isal_dict dict_str;
4741db0363cSGreg Tucker uint8_t *level_buf = NULL;
4751db0363cSGreg Tucker int check;
4761db0363cSGreg Tucker
4771db0363cSGreg Tucker if (level_size_buf[level] > 0) {
4781db0363cSGreg Tucker level_buf = malloc(level_size_buf[level]);
4791db0363cSGreg Tucker if (level_buf == NULL)
4801db0363cSGreg Tucker return 1;
4811db0363cSGreg Tucker }
4821db0363cSGreg Tucker
4831db0363cSGreg Tucker stream.level = level;
4845a00eaecSTomasz Kantecki if (isal_deflate_process_dict(&stream, &dict_str, dict_buf, dict_file_size) != COMP_OK) {
4855a00eaecSTomasz Kantecki if (level_buf != NULL)
4865a00eaecSTomasz Kantecki free(level_buf);
4875a00eaecSTomasz Kantecki return 1;
4885a00eaecSTomasz Kantecki }
4891db0363cSGreg Tucker
490*55fbfabfSMarcel Cornu BENCHMARK(start, time,
491*55fbfabfSMarcel Cornu check = isal_deflate_dict_round(&stream, outbuf, *outbuf_size, inbuf, inbuf_size,
492*55fbfabfSMarcel Cornu level, level_buf, level_size_buf[level],
493*55fbfabfSMarcel Cornu flush_type, hist_bits, &dict_str));
4945a00eaecSTomasz Kantecki if (level_buf != NULL)
4955a00eaecSTomasz Kantecki free(level_buf);
4961db0363cSGreg Tucker *outbuf_size = stream.total_out;
4971db0363cSGreg Tucker return check;
4981db0363cSGreg Tucker }
4991db0363cSGreg Tucker
500*55fbfabfSMarcel Cornu int
isal_deflate_stateful_perf(uint8_t * outbuf,uint64_t * outbuf_size,uint8_t * inbuf,uint64_t inbuf_size,int level,int flush_type,uint64_t in_block_size,int hist_bits,int time,struct perf * start)501*55fbfabfSMarcel Cornu isal_deflate_stateful_perf(uint8_t *outbuf, uint64_t *outbuf_size, uint8_t *inbuf,
502*55fbfabfSMarcel Cornu uint64_t inbuf_size, int level, int flush_type, uint64_t in_block_size,
503*55fbfabfSMarcel Cornu int hist_bits, int time, struct perf *start)
5048e4f1a1aSRoy Oursler {
5058e4f1a1aSRoy Oursler struct isal_zstream stream;
5068e4f1a1aSRoy Oursler uint8_t *level_buf = NULL;
507699bb5bdSRoy Oursler int check;
5088e4f1a1aSRoy Oursler
5098e4f1a1aSRoy Oursler if (in_block_size == 0)
5108e4f1a1aSRoy Oursler in_block_size = inbuf_size;
5118e4f1a1aSRoy Oursler
5128e4f1a1aSRoy Oursler if (level_size_buf[level] > 0) {
5138e4f1a1aSRoy Oursler level_buf = malloc(level_size_buf[level]);
5148e4f1a1aSRoy Oursler if (level_buf == NULL)
5158e4f1a1aSRoy Oursler return 1;
5168e4f1a1aSRoy Oursler }
5178e4f1a1aSRoy Oursler
518*55fbfabfSMarcel Cornu BENCHMARK(start, time,
519*55fbfabfSMarcel Cornu check = isal_deflate_stateful_round(
520*55fbfabfSMarcel Cornu &stream, outbuf, *outbuf_size, inbuf, inbuf_size, in_block_size, level,
521*55fbfabfSMarcel Cornu level_buf, level_size_buf[level], flush_type, hist_bits));
5228e4f1a1aSRoy Oursler *outbuf_size = stream.total_out;
523699bb5bdSRoy Oursler return check;
5248e4f1a1aSRoy Oursler }
5258e4f1a1aSRoy Oursler
526*55fbfabfSMarcel Cornu int
zlib_deflate_perf(uint8_t * outbuf,uint64_t * outbuf_size,uint8_t * inbuf,uint64_t inbuf_size,int level,int flush_type,uint64_t in_block_size,int hist_bits,int time,struct perf * start)527*55fbfabfSMarcel Cornu zlib_deflate_perf(uint8_t *outbuf, uint64_t *outbuf_size, uint8_t *inbuf, uint64_t inbuf_size,
528*55fbfabfSMarcel Cornu int level, int flush_type, uint64_t in_block_size, int hist_bits, int time,
529*55fbfabfSMarcel Cornu struct perf *start)
5308e4f1a1aSRoy Oursler {
531699bb5bdSRoy Oursler int check;
5328e4f1a1aSRoy Oursler z_stream gstream;
533cb176252SRoy Oursler int flush_translator[] = { Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH };
534cb176252SRoy Oursler
535cb176252SRoy Oursler if (in_block_size == 0)
536cb176252SRoy Oursler in_block_size = inbuf_size;
537cb176252SRoy Oursler
538cb176252SRoy Oursler flush_type = flush_translator[flush_type];
5398e4f1a1aSRoy Oursler
540412abd81SRoy Oursler /* Initialize the gstream buffer */
5418e4f1a1aSRoy Oursler gstream.next_in = inbuf;
5428e4f1a1aSRoy Oursler gstream.avail_in = inbuf_size;
5438e4f1a1aSRoy Oursler gstream.zalloc = Z_NULL;
5448e4f1a1aSRoy Oursler gstream.zfree = Z_NULL;
5458e4f1a1aSRoy Oursler gstream.opaque = Z_NULL;
546d90220d9SRoy Oursler
547d90220d9SRoy Oursler if (hist_bits == 0)
548d90220d9SRoy Oursler hist_bits = -15;
549d90220d9SRoy Oursler else
550d90220d9SRoy Oursler hist_bits = -hist_bits;
551d90220d9SRoy Oursler
552d90220d9SRoy Oursler if (0 != deflateInit2(&gstream, level, Z_DEFLATED, hist_bits, 9, Z_DEFAULT_STRATEGY))
5538e4f1a1aSRoy Oursler return 1;
5548e4f1a1aSRoy Oursler
555*55fbfabfSMarcel Cornu BENCHMARK(start, time,
556*55fbfabfSMarcel Cornu check = zlib_deflate_round(&gstream, outbuf, *outbuf_size, inbuf, inbuf_size,
557699bb5bdSRoy Oursler in_block_size, level, flush_type));
5588e4f1a1aSRoy Oursler
5598e4f1a1aSRoy Oursler *outbuf_size = gstream.total_out;
560412abd81SRoy Oursler deflateEnd(&gstream);
561412abd81SRoy Oursler
562412abd81SRoy Oursler return check;
5638e4f1a1aSRoy Oursler }
5648e4f1a1aSRoy Oursler
565*55fbfabfSMarcel Cornu int
isal_inflate_perf(uint8_t * inbuf,uint64_t inbuf_size,uint8_t * outbuf,uint64_t outbuf_size,uint8_t * filebuf,uint64_t file_size,int hist_bits,int time,struct perf * start)566*55fbfabfSMarcel Cornu isal_inflate_perf(uint8_t *inbuf, uint64_t inbuf_size, uint8_t *outbuf, uint64_t outbuf_size,
567*55fbfabfSMarcel Cornu uint8_t *filebuf, uint64_t file_size, int hist_bits, int time, struct perf *start)
5688e4f1a1aSRoy Oursler {
5698e4f1a1aSRoy Oursler struct inflate_state state;
570699bb5bdSRoy Oursler int check;
5718e4f1a1aSRoy Oursler
5728e4f1a1aSRoy Oursler /* Check that data decompresses */
573d90220d9SRoy Oursler check = isal_inflate_round(&state, inbuf, inbuf_size, outbuf, outbuf_size, hist_bits);
5748e4f1a1aSRoy Oursler if (check || state.total_out != file_size || memcmp(outbuf, filebuf, file_size))
5758e4f1a1aSRoy Oursler return 1;
5768e4f1a1aSRoy Oursler
577*55fbfabfSMarcel Cornu BENCHMARK(start, time,
578*55fbfabfSMarcel Cornu isal_inflate_round(&state, inbuf, inbuf_size, outbuf, outbuf_size, hist_bits));
5798e4f1a1aSRoy Oursler
580412abd81SRoy Oursler return check;
5818e4f1a1aSRoy Oursler }
5828e4f1a1aSRoy Oursler
583*55fbfabfSMarcel Cornu int
isal_inflate_stateful_perf(uint8_t * inbuf,uint64_t inbuf_size,uint8_t * outbuf,uint64_t outbuf_size,uint8_t * filebuf,uint64_t file_size,uint64_t in_block_size,int hist_bits,int time,struct perf * start,uint8_t * dict_buf,int dict_file_size)584*55fbfabfSMarcel Cornu isal_inflate_stateful_perf(uint8_t *inbuf, uint64_t inbuf_size, uint8_t *outbuf,
5858e4f1a1aSRoy Oursler uint64_t outbuf_size, uint8_t *filebuf, uint64_t file_size,
586*55fbfabfSMarcel Cornu uint64_t in_block_size, int hist_bits, int time, struct perf *start,
587*55fbfabfSMarcel Cornu uint8_t *dict_buf, int dict_file_size)
5888e4f1a1aSRoy Oursler {
5898e4f1a1aSRoy Oursler struct inflate_state state;
590699bb5bdSRoy Oursler int check;
5918e4f1a1aSRoy Oursler
5928e4f1a1aSRoy Oursler if (in_block_size == 0)
5938e4f1a1aSRoy Oursler in_block_size = inbuf_size;
5948e4f1a1aSRoy Oursler
5951db0363cSGreg Tucker check = isal_inflate_stateful_round(&state, inbuf, inbuf_size, in_block_size, outbuf,
5961db0363cSGreg Tucker outbuf_size, hist_bits, dict_buf, dict_file_size);
5978e4f1a1aSRoy Oursler if (check || state.total_out != file_size || memcmp(outbuf, filebuf, file_size))
5988e4f1a1aSRoy Oursler return 1;
5998e4f1a1aSRoy Oursler
600699bb5bdSRoy Oursler BENCHMARK(start, time,
601699bb5bdSRoy Oursler isal_inflate_stateful_round(&state, inbuf, inbuf_size, in_block_size, outbuf,
602*55fbfabfSMarcel Cornu outbuf_size, hist_bits, dict_buf, dict_file_size));
6038e4f1a1aSRoy Oursler
6048e4f1a1aSRoy Oursler return 0;
6058e4f1a1aSRoy Oursler }
6068e4f1a1aSRoy Oursler
607*55fbfabfSMarcel Cornu int
zlib_inflate_perf(uint8_t * inbuf,uint64_t inbuf_size,uint8_t * outbuf,uint64_t outbuf_size,uint8_t * filebuf,uint64_t file_size,int hist_bits,int time,struct perf * start)608*55fbfabfSMarcel Cornu zlib_inflate_perf(uint8_t *inbuf, uint64_t inbuf_size, uint8_t *outbuf, uint64_t outbuf_size,
609*55fbfabfSMarcel Cornu uint8_t *filebuf, uint64_t file_size, int hist_bits, int time, struct perf *start)
6108e4f1a1aSRoy Oursler {
611699bb5bdSRoy Oursler int check;
6128e4f1a1aSRoy Oursler z_stream gstream;
6138e4f1a1aSRoy Oursler
6148e4f1a1aSRoy Oursler gstream.next_in = inbuf;
6158e4f1a1aSRoy Oursler gstream.avail_in = inbuf_size;
6168e4f1a1aSRoy Oursler gstream.zalloc = Z_NULL;
6178e4f1a1aSRoy Oursler gstream.zfree = Z_NULL;
6188e4f1a1aSRoy Oursler gstream.opaque = Z_NULL;
619d90220d9SRoy Oursler
620d90220d9SRoy Oursler if (hist_bits == 0)
621d90220d9SRoy Oursler hist_bits = -15;
622d90220d9SRoy Oursler else
623d90220d9SRoy Oursler hist_bits = -hist_bits;
624d90220d9SRoy Oursler
625d90220d9SRoy Oursler if (0 != inflateInit2(&gstream, hist_bits))
6268e4f1a1aSRoy Oursler return 1;
6278e4f1a1aSRoy Oursler
628412abd81SRoy Oursler check = zlib_inflate_round(&gstream, inbuf, inbuf_size, outbuf, outbuf_size);
629412abd81SRoy Oursler if (check || gstream.total_out != file_size || memcmp(outbuf, filebuf, file_size))
6308e4f1a1aSRoy Oursler return 1;
6318e4f1a1aSRoy Oursler
632699bb5bdSRoy Oursler BENCHMARK(start, time,
633699bb5bdSRoy Oursler zlib_inflate_round(&gstream, inbuf, inbuf_size, outbuf, outbuf_size));
6348e4f1a1aSRoy Oursler
6358e4f1a1aSRoy Oursler inflateEnd(&gstream);
6368e4f1a1aSRoy Oursler return 0;
6378e4f1a1aSRoy Oursler }
6388e4f1a1aSRoy Oursler
639*55fbfabfSMarcel Cornu int
main(int argc,char * argv[])640*55fbfabfSMarcel Cornu main(int argc, char *argv[])
6418e4f1a1aSRoy Oursler {
6428e4f1a1aSRoy Oursler FILE *in = NULL;
6431db0363cSGreg Tucker FILE *dict_fn = NULL;
6448e4f1a1aSRoy Oursler unsigned char *compressbuf, *decompbuf, *filebuf;
64535e90e73SRoy Oursler char *outfile = NULL;
6468e4f1a1aSRoy Oursler int i, c, ret = 0;
6471db0363cSGreg Tucker int dict_file_size = 0;
6481db0363cSGreg Tucker uint8_t *dict_buf = NULL;
6498e4f1a1aSRoy Oursler uint64_t decompbuf_size, compressbuf_size;
6502458a651SRoy Oursler uint64_t block_count;
6518e4f1a1aSRoy Oursler
6528e4f1a1aSRoy Oursler struct compress_strategy compression_queue[COMPRESSION_QUEUE_LIMIT];
6538e4f1a1aSRoy Oursler
6548e4f1a1aSRoy Oursler int compression_queue_size = 0;
6558e4f1a1aSRoy Oursler struct compress_strategy compress_strat;
6568e4f1a1aSRoy Oursler struct inflate_modes inflate_strat = { 0 };
6578e4f1a1aSRoy Oursler struct perf_info info;
6585793a851SRoy Oursler init_perf_info(&info);
6598e4f1a1aSRoy Oursler
6608e4f1a1aSRoy Oursler while ((c = getopt(argc, argv, OPTARGS)) != -1) {
6618e4f1a1aSRoy Oursler switch (c) {
6628e4f1a1aSRoy Oursler case 'l':
6638e4f1a1aSRoy Oursler if (compression_queue_size >= COMPRESSION_QUEUE_LIMIT) {
6648e4f1a1aSRoy Oursler printf("Too many levels specified");
6658e4f1a1aSRoy Oursler exit(0);
6668e4f1a1aSRoy Oursler }
6678e4f1a1aSRoy Oursler
6688e4f1a1aSRoy Oursler compress_strat.mode = ISAL_STATELESS;
6698e4f1a1aSRoy Oursler compress_strat.level = atoi(optarg);
6708e4f1a1aSRoy Oursler if (compress_strat.level > ISAL_DEF_MAX_LEVEL) {
6718e4f1a1aSRoy Oursler printf("Unsupported isa-l compression level\n");
6728e4f1a1aSRoy Oursler exit(0);
6738e4f1a1aSRoy Oursler }
6748e4f1a1aSRoy Oursler
6758e4f1a1aSRoy Oursler compression_queue[compression_queue_size] = compress_strat;
6768e4f1a1aSRoy Oursler compression_queue_size++;
6778e4f1a1aSRoy Oursler break;
6788e4f1a1aSRoy Oursler case 'f':
6798e4f1a1aSRoy Oursler if (compression_queue_size >= COMPRESSION_QUEUE_LIMIT) {
6808e4f1a1aSRoy Oursler printf("Too many levels specified");
6818e4f1a1aSRoy Oursler exit(0);
6828e4f1a1aSRoy Oursler }
6838e4f1a1aSRoy Oursler
6848e4f1a1aSRoy Oursler compress_strat.mode = ISAL_STATEFUL;
6858e4f1a1aSRoy Oursler compress_strat.level = atoi(optarg);
6868e4f1a1aSRoy Oursler if (compress_strat.level > ISAL_DEF_MAX_LEVEL) {
6878e4f1a1aSRoy Oursler printf("Unsupported isa-l compression level\n");
6888e4f1a1aSRoy Oursler exit(0);
6898e4f1a1aSRoy Oursler }
6908e4f1a1aSRoy Oursler
6918e4f1a1aSRoy Oursler compression_queue[compression_queue_size] = compress_strat;
6928e4f1a1aSRoy Oursler compression_queue_size++;
6938e4f1a1aSRoy Oursler break;
6948e4f1a1aSRoy Oursler case 'z':
6958e4f1a1aSRoy Oursler if (compression_queue_size >= COMPRESSION_QUEUE_LIMIT) {
6968e4f1a1aSRoy Oursler printf("Too many levels specified");
6978e4f1a1aSRoy Oursler exit(0);
6988e4f1a1aSRoy Oursler }
6998e4f1a1aSRoy Oursler
7008e4f1a1aSRoy Oursler compress_strat.mode = ZLIB;
7018e4f1a1aSRoy Oursler compress_strat.level = atoi(optarg);
7028e4f1a1aSRoy Oursler if (compress_strat.level > Z_BEST_COMPRESSION) {
7038e4f1a1aSRoy Oursler printf("Unsupported zlib compression level\n");
7048e4f1a1aSRoy Oursler exit(0);
7058e4f1a1aSRoy Oursler }
7068e4f1a1aSRoy Oursler compression_queue[compression_queue_size] = compress_strat;
7078e4f1a1aSRoy Oursler compression_queue_size++;
7088e4f1a1aSRoy Oursler break;
7098e4f1a1aSRoy Oursler case 'i':
710699bb5bdSRoy Oursler info.inflate_time = atoi(optarg);
711699bb5bdSRoy Oursler if (info.inflate_time < 0)
7128e4f1a1aSRoy Oursler usage();
7138e4f1a1aSRoy Oursler break;
7148e4f1a1aSRoy Oursler case 'd':
715699bb5bdSRoy Oursler info.deflate_time = atoi(optarg);
716699bb5bdSRoy Oursler if (info.deflate_time < 0)
7178e4f1a1aSRoy Oursler usage();
7188e4f1a1aSRoy Oursler break;
7191db0363cSGreg Tucker case 'D':
7201db0363cSGreg Tucker dict_fn = fopen(optarg, "rb");
7211db0363cSGreg Tucker if (!dict_fn) {
7221db0363cSGreg Tucker printf("Can't open dictionary for reading\n");
7231db0363cSGreg Tucker exit(0);
7241db0363cSGreg Tucker }
7251db0363cSGreg Tucker dict_file_size = get_filesize(dict_fn);
7261db0363cSGreg Tucker dict_buf = malloc(dict_file_size);
7271db0363cSGreg Tucker if (dict_buf == NULL || dict_file_size == 0) {
7281db0363cSGreg Tucker printf("Can't allocate mem for dictionary buffer\n");
7291db0363cSGreg Tucker exit(0);
7301db0363cSGreg Tucker }
7311db0363cSGreg Tucker if (dict_file_size != fread(dict_buf, 1, dict_file_size, dict_fn)) {
7321db0363cSGreg Tucker printf("Couldn't read all of dictionary file\n");
7331db0363cSGreg Tucker exit(0);
7341db0363cSGreg Tucker }
7351db0363cSGreg Tucker fclose(dict_fn);
7361db0363cSGreg Tucker break;
7378e4f1a1aSRoy Oursler case 's':
7388e4f1a1aSRoy Oursler inflate_strat.stateful = 1;
7398e4f1a1aSRoy Oursler break;
7408e4f1a1aSRoy Oursler case 't':
7418e4f1a1aSRoy Oursler inflate_strat.stateless = 1;
7428e4f1a1aSRoy Oursler break;
7438e4f1a1aSRoy Oursler case 'u':
7448e4f1a1aSRoy Oursler inflate_strat.zlib = 1;
7458e4f1a1aSRoy Oursler break;
7468e4f1a1aSRoy Oursler case 'b':
7478e4f1a1aSRoy Oursler inflate_strat.stateful = 1;
7488e4f1a1aSRoy Oursler info.inblock_size = atoi(optarg);
7498e4f1a1aSRoy Oursler break;
75018fd9965SRoy Oursler case 'y':
75118fd9965SRoy Oursler info.flush_type = atoi(optarg);
752*55fbfabfSMarcel Cornu if (info.flush_type != NO_FLUSH && info.flush_type != SYNC_FLUSH &&
753*55fbfabfSMarcel Cornu info.flush_type != FULL_FLUSH) {
75418fd9965SRoy Oursler printf("Unsupported flush type\n");
75518fd9965SRoy Oursler exit(0);
75618fd9965SRoy Oursler }
75718fd9965SRoy Oursler break;
758d90220d9SRoy Oursler
759d90220d9SRoy Oursler case 'w':
760d90220d9SRoy Oursler info.hist_bits = atoi(optarg);
761d90220d9SRoy Oursler if (info.hist_bits > 15 || info.hist_bits < 9)
762d90220d9SRoy Oursler usage();
763d90220d9SRoy Oursler break;
76435e90e73SRoy Oursler case 'o':
76535e90e73SRoy Oursler outfile = optarg;
76635e90e73SRoy Oursler break;
7678e4f1a1aSRoy Oursler case 'h':
7688e4f1a1aSRoy Oursler default:
7698e4f1a1aSRoy Oursler usage();
7708e4f1a1aSRoy Oursler break;
7718e4f1a1aSRoy Oursler }
7728e4f1a1aSRoy Oursler }
7738e4f1a1aSRoy Oursler
7748e4f1a1aSRoy Oursler if (optind >= argc)
7758e4f1a1aSRoy Oursler usage();
7768e4f1a1aSRoy Oursler
7778e4f1a1aSRoy Oursler if (!inflate_strat.stateless && !inflate_strat.stateful && !inflate_strat.zlib) {
7788e4f1a1aSRoy Oursler if (info.inblock_size == 0)
7798e4f1a1aSRoy Oursler inflate_strat.stateless = 1;
7808e4f1a1aSRoy Oursler else
7818e4f1a1aSRoy Oursler inflate_strat.stateful = 1;
7828e4f1a1aSRoy Oursler }
7838e4f1a1aSRoy Oursler
7848e4f1a1aSRoy Oursler /* Allocate space for entire input file and output
7858e4f1a1aSRoy Oursler * (assuming some possible expansion on output size)
7868e4f1a1aSRoy Oursler */
7878e4f1a1aSRoy Oursler info.file_name = argv[optind];
7888e4f1a1aSRoy Oursler in = fopen(info.file_name, "rb");
7898e4f1a1aSRoy Oursler if (NULL == in) {
7908e4f1a1aSRoy Oursler printf("Error: Can not find file %s\n", info.file_name);
7918e4f1a1aSRoy Oursler exit(0);
7928e4f1a1aSRoy Oursler }
7938e4f1a1aSRoy Oursler
7948e4f1a1aSRoy Oursler info.file_size = get_filesize(in);
7958e4f1a1aSRoy Oursler if (info.file_size == 0) {
7968e4f1a1aSRoy Oursler printf("Error: input file has 0 size\n");
7978e4f1a1aSRoy Oursler exit(0);
7988e4f1a1aSRoy Oursler }
7998e4f1a1aSRoy Oursler
8008e4f1a1aSRoy Oursler decompbuf_size = info.file_size;
8018e4f1a1aSRoy Oursler
8028e4f1a1aSRoy Oursler if (compression_queue_size == 0) {
8038e4f1a1aSRoy Oursler if (info.inblock_size == 0)
8048e4f1a1aSRoy Oursler compression_queue[0].mode = ISAL_STATELESS;
8058e4f1a1aSRoy Oursler else
8068e4f1a1aSRoy Oursler compression_queue[0].mode = ISAL_STATEFUL;
8078e4f1a1aSRoy Oursler compression_queue[0].level = 1;
8088e4f1a1aSRoy Oursler compression_queue_size = 1;
8098e4f1a1aSRoy Oursler }
8108e4f1a1aSRoy Oursler
8118e4f1a1aSRoy Oursler filebuf = malloc(info.file_size);
8128e4f1a1aSRoy Oursler if (filebuf == NULL) {
8138e4f1a1aSRoy Oursler fprintf(stderr, "Can't allocate temp buffer memory\n");
8148e4f1a1aSRoy Oursler exit(0);
8158e4f1a1aSRoy Oursler }
8168e4f1a1aSRoy Oursler
8172458a651SRoy Oursler block_count = 1;
8182458a651SRoy Oursler if (info.flush_type > 0)
8192458a651SRoy Oursler block_count = (info.file_size + info.inblock_size - 1) / info.inblock_size;
8202458a651SRoy Oursler
8212458a651SRoy Oursler /* Way overestimate likely compressed size to handle bad type 0 and
8222458a651SRoy Oursler * small block_size case */
8232458a651SRoy Oursler compressbuf_size = block_count * ISAL_DEF_MAX_HDR_SIZE + 2 * info.file_size;
8242458a651SRoy Oursler if (compressbuf_size >= MAX_COMPRESS_BUF_SIZE)
8252458a651SRoy Oursler compressbuf_size = MAX_COMPRESS_BUF_SIZE;
8262458a651SRoy Oursler
8278e4f1a1aSRoy Oursler compressbuf = malloc(compressbuf_size);
8288e4f1a1aSRoy Oursler if (compressbuf == NULL) {
8298e4f1a1aSRoy Oursler fprintf(stderr, "Can't allocate input buffer memory\n");
8308e4f1a1aSRoy Oursler exit(0);
8318e4f1a1aSRoy Oursler }
8322458a651SRoy Oursler
8338e4f1a1aSRoy Oursler decompbuf = malloc(decompbuf_size);
8348e4f1a1aSRoy Oursler if (decompbuf == NULL) {
8358e4f1a1aSRoy Oursler fprintf(stderr, "Can't allocate output buffer memory\n");
8368e4f1a1aSRoy Oursler exit(0);
8378e4f1a1aSRoy Oursler }
8388e4f1a1aSRoy Oursler
8398e4f1a1aSRoy Oursler if (info.file_size != fread(filebuf, 1, info.file_size, in)) {
8408e4f1a1aSRoy Oursler fprintf(stderr, "Could not read in all input\n");
8418e4f1a1aSRoy Oursler exit(0);
8428e4f1a1aSRoy Oursler }
8438e4f1a1aSRoy Oursler fclose(in);
8448e4f1a1aSRoy Oursler
8458e4f1a1aSRoy Oursler for (i = 0; i < compression_queue_size; i++) {
8468e4f1a1aSRoy Oursler if (i > 0)
8478e4f1a1aSRoy Oursler printf("\n\n");
8488e4f1a1aSRoy Oursler
8498e4f1a1aSRoy Oursler info.strategy = compression_queue[i];
8508e4f1a1aSRoy Oursler print_perf_info_line(&info);
8518e4f1a1aSRoy Oursler
8528e4f1a1aSRoy Oursler info.deflate_size = compressbuf_size;
8538e4f1a1aSRoy Oursler
8541db0363cSGreg Tucker if (dict_file_size != 0) {
8551db0363cSGreg Tucker info.strategy.mode = ISAL_WITH_DICTIONARY;
856*55fbfabfSMarcel Cornu ret = isal_deflate_dict_perf(
857*55fbfabfSMarcel Cornu compressbuf, &info.deflate_size, filebuf, info.file_size,
858*55fbfabfSMarcel Cornu compression_queue[i].level, info.flush_type, info.hist_bits,
859*55fbfabfSMarcel Cornu info.deflate_time, &info.start, dict_buf, dict_file_size);
8601db0363cSGreg Tucker } else if (info.strategy.mode == ISAL_STATELESS)
8618e4f1a1aSRoy Oursler ret = isal_deflate_perf(compressbuf, &info.deflate_size, filebuf,
862*55fbfabfSMarcel Cornu info.file_size, compression_queue[i].level,
863*55fbfabfSMarcel Cornu info.flush_type, info.hist_bits, info.deflate_time,
864*55fbfabfSMarcel Cornu &info.start);
8651db0363cSGreg Tucker
8668e4f1a1aSRoy Oursler else if (info.strategy.mode == ISAL_STATEFUL)
867*55fbfabfSMarcel Cornu ret = isal_deflate_stateful_perf(
868*55fbfabfSMarcel Cornu compressbuf, &info.deflate_size, filebuf, info.file_size,
869*55fbfabfSMarcel Cornu compression_queue[i].level, info.flush_type, info.inblock_size,
870*55fbfabfSMarcel Cornu info.hist_bits, info.deflate_time, &info.start);
8718e4f1a1aSRoy Oursler else if (info.strategy.mode == ZLIB)
8728e4f1a1aSRoy Oursler ret = zlib_deflate_perf(compressbuf, &info.deflate_size, filebuf,
8738e4f1a1aSRoy Oursler info.file_size, compression_queue[i].level,
874*55fbfabfSMarcel Cornu info.flush_type, info.inblock_size, info.hist_bits,
875*55fbfabfSMarcel Cornu info.deflate_time, &info.start);
8768e4f1a1aSRoy Oursler if (ret) {
8778e4f1a1aSRoy Oursler printf(" Error in compression\n");
8788e4f1a1aSRoy Oursler continue;
8798e4f1a1aSRoy Oursler }
8808e4f1a1aSRoy Oursler
8818e4f1a1aSRoy Oursler print_file_line(&info);
8828e4f1a1aSRoy Oursler printf("\n");
8838e4f1a1aSRoy Oursler print_deflate_perf_line(&info);
8848e4f1a1aSRoy Oursler printf("\n");
8858e4f1a1aSRoy Oursler
88635e90e73SRoy Oursler if (outfile != NULL && i + 1 == compression_queue_size) {
8875a00eaecSTomasz Kantecki FILE *out = fopen(outfile, "wb");
8885a00eaecSTomasz Kantecki
8895a00eaecSTomasz Kantecki if (out == NULL) {
8905a00eaecSTomasz Kantecki fprintf(stderr, "Could not write to the output file \"%s\"\n",
8915a00eaecSTomasz Kantecki outfile);
8925a00eaecSTomasz Kantecki exit(0);
8935a00eaecSTomasz Kantecki }
89435e90e73SRoy Oursler fwrite(compressbuf, 1, info.deflate_size, out);
89535e90e73SRoy Oursler fclose(out);
89635e90e73SRoy Oursler }
89735e90e73SRoy Oursler
898699bb5bdSRoy Oursler if (info.inflate_time == 0)
8995793a851SRoy Oursler continue;
9005793a851SRoy Oursler
9018e4f1a1aSRoy Oursler if (inflate_strat.stateless) {
9021db0363cSGreg Tucker if (dict_file_size != 0)
9031db0363cSGreg Tucker continue;
9041db0363cSGreg Tucker
9058e4f1a1aSRoy Oursler info.inflate_mode = ISAL_STATELESS;
9068e4f1a1aSRoy Oursler ret = isal_inflate_perf(compressbuf, info.deflate_size, decompbuf,
9078e4f1a1aSRoy Oursler decompbuf_size, filebuf, info.file_size,
908*55fbfabfSMarcel Cornu info.hist_bits, info.inflate_time, &info.start);
9098e4f1a1aSRoy Oursler if (ret)
9108e4f1a1aSRoy Oursler printf(" Error in isal stateless inflate\n");
9118e4f1a1aSRoy Oursler else
9128e4f1a1aSRoy Oursler print_inflate_perf_line(&info);
9138e4f1a1aSRoy Oursler }
9148e4f1a1aSRoy Oursler
9158e4f1a1aSRoy Oursler if (inflate_strat.stateful) {
9161db0363cSGreg Tucker info.inflate_mode =
9171db0363cSGreg Tucker (dict_file_size == 0) ? ISAL_STATEFUL : ISAL_WITH_DICTIONARY;
9181db0363cSGreg Tucker
919*55fbfabfSMarcel Cornu ret = isal_inflate_stateful_perf(
920*55fbfabfSMarcel Cornu compressbuf, info.deflate_size, decompbuf, decompbuf_size, filebuf,
921*55fbfabfSMarcel Cornu info.file_size, info.inblock_size, info.hist_bits,
922*55fbfabfSMarcel Cornu info.inflate_time, &info.start, dict_buf, dict_file_size);
9238e4f1a1aSRoy Oursler
9248e4f1a1aSRoy Oursler if (ret)
9258e4f1a1aSRoy Oursler printf(" Error in isal stateful inflate\n");
9268e4f1a1aSRoy Oursler else
9278e4f1a1aSRoy Oursler print_inflate_perf_line(&info);
9288e4f1a1aSRoy Oursler }
9298e4f1a1aSRoy Oursler
9308e4f1a1aSRoy Oursler if (inflate_strat.zlib) {
9318e4f1a1aSRoy Oursler info.inflate_mode = ZLIB;
9328e4f1a1aSRoy Oursler ret = zlib_inflate_perf(compressbuf, info.deflate_size, decompbuf,
9338e4f1a1aSRoy Oursler decompbuf_size, filebuf, info.file_size,
934*55fbfabfSMarcel Cornu info.hist_bits, info.inflate_time, &info.start);
9358e4f1a1aSRoy Oursler if (ret)
9368e4f1a1aSRoy Oursler printf(" Error in zlib inflate\n");
9378e4f1a1aSRoy Oursler else
9388e4f1a1aSRoy Oursler print_inflate_perf_line(&info);
9398e4f1a1aSRoy Oursler }
9408e4f1a1aSRoy Oursler }
9418e4f1a1aSRoy Oursler
9428e4f1a1aSRoy Oursler free(compressbuf);
9438e4f1a1aSRoy Oursler free(decompbuf);
9448e4f1a1aSRoy Oursler free(filebuf);
9451db0363cSGreg Tucker if (dict_buf != NULL)
9461db0363cSGreg Tucker free(dict_buf);
9478e4f1a1aSRoy Oursler return 0;
9488e4f1a1aSRoy Oursler }
949