152d97476SRoy Oursler /**********************************************************************
252d97476SRoy Oursler Copyright(c) 2011-2018 Intel Corporation All rights reserved.
352d97476SRoy Oursler
452d97476SRoy Oursler Redistribution and use in source and binary forms, with or without
552d97476SRoy Oursler modification, are permitted provided that the following conditions
652d97476SRoy Oursler are met:
752d97476SRoy Oursler * Redistributions of source code must retain the above copyright
852d97476SRoy Oursler notice, this list of conditions and the following disclaimer.
952d97476SRoy Oursler * Redistributions in binary form must reproduce the above copyright
1052d97476SRoy Oursler notice, this list of conditions and the following disclaimer in
1152d97476SRoy Oursler the documentation and/or other materials provided with the
1252d97476SRoy Oursler distribution.
1352d97476SRoy Oursler * Neither the name of Intel Corporation nor the names of its
1452d97476SRoy Oursler contributors may be used to endorse or promote products derived
1552d97476SRoy Oursler from this software without specific prior written permission.
1652d97476SRoy Oursler
1752d97476SRoy Oursler THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1852d97476SRoy Oursler "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1952d97476SRoy Oursler LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2052d97476SRoy Oursler A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2152d97476SRoy Oursler OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2252d97476SRoy Oursler SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2352d97476SRoy Oursler LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2452d97476SRoy Oursler DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2552d97476SRoy Oursler THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2652d97476SRoy Oursler (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2752d97476SRoy Oursler OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2852d97476SRoy Oursler **********************************************************************/
2952d97476SRoy Oursler
3052d97476SRoy Oursler #include <stdint.h>
3152d97476SRoy Oursler #include <stdio.h>
3252d97476SRoy Oursler #include <inttypes.h>
3352d97476SRoy Oursler #include <string.h>
3452d97476SRoy Oursler #include <stdlib.h>
3552d97476SRoy Oursler #include "igzip_lib.h"
3652d97476SRoy Oursler
37c1965724SRoy Oursler #define STATIC_INFLATE_FILE "static_inflate.h"
3863dffab9SGreg Tucker #define DOUBLE_SYM_THRESH (4 * 1024)
3952d97476SRoy Oursler
40d7927673SGreg Tucker extern struct isal_hufftables hufftables_default;
41d7927673SGreg Tucker
4252d97476SRoy Oursler /**
4352d97476SRoy Oursler * @brief Prints a table of uint16_t elements to a file.
4452d97476SRoy Oursler * @param outfile: the file the table is printed to.
4552d97476SRoy Oursler * @param table: the table to be printed.
4652d97476SRoy Oursler * @param length: number of elements to be printed.
4752d97476SRoy Oursler * @param header: header to append in front of the table.
4852d97476SRoy Oursler * @param footer: footer to append at the end of the table.
4952d97476SRoy Oursler * @param begin_line: string printed at beginning of new line
5052d97476SRoy Oursler */
51*55fbfabfSMarcel Cornu void
fprint_uint16_table(FILE * outfile,uint16_t * table,uint64_t length,char * header,char * footer,char * begin_line)52*55fbfabfSMarcel Cornu fprint_uint16_table(FILE *outfile, uint16_t *table, uint64_t length, char *header, char *footer,
53*55fbfabfSMarcel Cornu char *begin_line)
5452d97476SRoy Oursler {
5552d97476SRoy Oursler int i;
5652d97476SRoy Oursler fprintf(outfile, "%s", header);
5752d97476SRoy Oursler for (i = 0; i < length - 1; i++) {
5852d97476SRoy Oursler if ((i & 7) == 0)
5952d97476SRoy Oursler fprintf(outfile, "\n%s", begin_line);
6052d97476SRoy Oursler else
6152d97476SRoy Oursler fprintf(outfile, " ");
6252d97476SRoy Oursler fprintf(outfile, "0x%04x,", table[i]);
6352d97476SRoy Oursler }
6452d97476SRoy Oursler
6552d97476SRoy Oursler if ((i & 7) == 0)
6652d97476SRoy Oursler fprintf(outfile, "\n%s", begin_line);
6752d97476SRoy Oursler else
6852d97476SRoy Oursler fprintf(outfile, " ");
6952d97476SRoy Oursler fprintf(outfile, "0x%04x", table[i]);
7052d97476SRoy Oursler fprintf(outfile, "%s", footer);
7152d97476SRoy Oursler }
7252d97476SRoy Oursler
7352d97476SRoy Oursler /**
7452d97476SRoy Oursler * @brief Prints a table of uint32_t elements to a file.
7552d97476SRoy Oursler * @param outfile: the file the table is printed to.
7652d97476SRoy Oursler * @param table: the table to be printed.
7752d97476SRoy Oursler * @param length: number of elements to be printed.
7852d97476SRoy Oursler * @param header: header to append in front of the table.
7952d97476SRoy Oursler * @param footer: footer to append at the end of the table.
8052d97476SRoy Oursler * @param begin_line: string printed at beginning of new line
8152d97476SRoy Oursler */
82*55fbfabfSMarcel Cornu void
fprint_uint32_table(FILE * outfile,uint32_t * table,uint64_t length,char * header,char * footer,char * begin_line)83*55fbfabfSMarcel Cornu fprint_uint32_table(FILE *outfile, uint32_t *table, uint64_t length, char *header, char *footer,
84*55fbfabfSMarcel Cornu char *begin_line)
8552d97476SRoy Oursler {
8652d97476SRoy Oursler int i;
8752d97476SRoy Oursler fprintf(outfile, "%s", header);
8852d97476SRoy Oursler for (i = 0; i < length - 1; i++) {
8952d97476SRoy Oursler if ((i & 3) == 0)
9052d97476SRoy Oursler fprintf(outfile, "\n%s", begin_line);
9152d97476SRoy Oursler else
9252d97476SRoy Oursler fprintf(outfile, " ");
9352d97476SRoy Oursler fprintf(outfile, "0x%08x,", table[i]);
9452d97476SRoy Oursler }
9552d97476SRoy Oursler
9652d97476SRoy Oursler if ((i & 3) == 0)
9752d97476SRoy Oursler fprintf(outfile, "%s", begin_line);
9852d97476SRoy Oursler else
9952d97476SRoy Oursler fprintf(outfile, " ");
10052d97476SRoy Oursler fprintf(outfile, "0x%08x", table[i]);
10152d97476SRoy Oursler fprintf(outfile, "%s", footer);
10252d97476SRoy Oursler }
10352d97476SRoy Oursler
104*55fbfabfSMarcel Cornu void
fprint_header(FILE * output_file)105*55fbfabfSMarcel Cornu fprint_header(FILE *output_file)
10652d97476SRoy Oursler {
10752d97476SRoy Oursler fprintf(output_file, "#include \"igzip_lib.h\"\n\n");
10852d97476SRoy Oursler fprintf(output_file, "#define LONG_BITS_CHECK %d\n", ISAL_DECODE_LONG_BITS);
10952d97476SRoy Oursler fprintf(output_file, "#define SHORT_BITS_CHECK %d\n", ISAL_DECODE_SHORT_BITS);
110*55fbfabfSMarcel Cornu fprintf(output_file, "#if (LONG_BITS_CHECK == ISAL_DECODE_LONG_BITS) && (SHORT_BITS_CHECK "
111*55fbfabfSMarcel Cornu "== ISAL_DECODE_SHORT_BITS)\n"
11252d97476SRoy Oursler "# define ISAL_STATIC_INFLATE_TABLE\n"
11352d97476SRoy Oursler "#else\n"
114*55fbfabfSMarcel Cornu "# warning \"Incompatible compile time defines for optimized static "
115*55fbfabfSMarcel Cornu "inflate table.\"\n"
11652d97476SRoy Oursler "#endif\n\n");
11752d97476SRoy Oursler }
11852d97476SRoy Oursler
119*55fbfabfSMarcel Cornu int
main(int argc,char * argv[])120*55fbfabfSMarcel Cornu main(int argc, char *argv[])
12152d97476SRoy Oursler {
12252d97476SRoy Oursler struct inflate_state state;
12352d97476SRoy Oursler FILE *file;
12452d97476SRoy Oursler uint8_t static_deflate_hdr = 3;
12563dffab9SGreg Tucker uint8_t tmp_space[8], *in_buf;
12663dffab9SGreg Tucker
12763dffab9SGreg Tucker if (NULL == (in_buf = malloc(DOUBLE_SYM_THRESH + 1))) {
12863dffab9SGreg Tucker printf("Can not allocote memory\n");
12963dffab9SGreg Tucker return 1;
13063dffab9SGreg Tucker }
13152d97476SRoy Oursler
13252d97476SRoy Oursler isal_inflate_init(&state);
13352d97476SRoy Oursler
13463dffab9SGreg Tucker memcpy(in_buf, &static_deflate_hdr, sizeof(static_deflate_hdr));
13563dffab9SGreg Tucker state.next_in = in_buf;
13663dffab9SGreg Tucker state.avail_in = DOUBLE_SYM_THRESH + 1;
13752d97476SRoy Oursler state.next_out = tmp_space;
13852d97476SRoy Oursler state.avail_out = sizeof(tmp_space);
13952d97476SRoy Oursler
14052d97476SRoy Oursler isal_inflate(&state);
14152d97476SRoy Oursler
14252d97476SRoy Oursler file = fopen(STATIC_INFLATE_FILE, "w");
14352d97476SRoy Oursler
14452d97476SRoy Oursler if (file == NULL) {
14552d97476SRoy Oursler printf("Error creating file hufftables_c.c\n");
14652d97476SRoy Oursler return 1;
14752d97476SRoy Oursler }
148d7927673SGreg Tucker // Add decode tables describing a type 2 static (fixed) header
14952d97476SRoy Oursler
150*55fbfabfSMarcel Cornu fprintf(file, "#ifndef STATIC_HEADER_H\n"
151*55fbfabfSMarcel Cornu "#define STATIC_HEADER_H\n\n");
15252d97476SRoy Oursler
15352d97476SRoy Oursler fprint_header(file);
15452d97476SRoy Oursler
15552d97476SRoy Oursler fprintf(file, "struct inflate_huff_code_large static_lit_huff_code = {\n");
15652d97476SRoy Oursler fprint_uint32_table(file, state.lit_huff_code.short_code_lookup,
15752d97476SRoy Oursler sizeof(state.lit_huff_code.short_code_lookup) / sizeof(uint32_t),
15852d97476SRoy Oursler "\t.short_code_lookup = {", "\t},\n\n", "\t\t");
15952d97476SRoy Oursler fprint_uint16_table(file, state.lit_huff_code.long_code_lookup,
16052d97476SRoy Oursler sizeof(state.lit_huff_code.long_code_lookup) / sizeof(uint16_t),
16152d97476SRoy Oursler "\t.long_code_lookup = {", "\t}\n", "\t\t");
16252d97476SRoy Oursler fprintf(file, "};\n\n");
16352d97476SRoy Oursler
16452d97476SRoy Oursler fprintf(file, "struct inflate_huff_code_small static_dist_huff_code = {\n");
16552d97476SRoy Oursler fprint_uint16_table(file, state.dist_huff_code.short_code_lookup,
16652d97476SRoy Oursler sizeof(state.dist_huff_code.short_code_lookup) / sizeof(uint16_t),
16752d97476SRoy Oursler "\t.short_code_lookup = {", "\t},\n\n", "\t\t");
16852d97476SRoy Oursler fprint_uint16_table(file, state.dist_huff_code.long_code_lookup,
16952d97476SRoy Oursler sizeof(state.dist_huff_code.long_code_lookup) / sizeof(uint16_t),
17052d97476SRoy Oursler "\t.long_code_lookup = {", "\t}\n", "\t\t");
17152d97476SRoy Oursler fprintf(file, "};\n\n");
17252d97476SRoy Oursler
17352d97476SRoy Oursler fprintf(file, "#endif\n");
174d7927673SGreg Tucker
175d7927673SGreg Tucker // Add other tables for known dynamic headers - level 0
176d7927673SGreg Tucker
177d7927673SGreg Tucker isal_inflate_init(&state);
178d7927673SGreg Tucker
179*55fbfabfSMarcel Cornu memcpy(in_buf, &hufftables_default.deflate_hdr, sizeof(hufftables_default.deflate_hdr));
18063dffab9SGreg Tucker state.next_in = in_buf;
18163dffab9SGreg Tucker state.avail_in = DOUBLE_SYM_THRESH + 1;
182d7927673SGreg Tucker state.next_out = tmp_space;
183d7927673SGreg Tucker state.avail_out = sizeof(tmp_space);
184d7927673SGreg Tucker
185d7927673SGreg Tucker isal_inflate(&state);
186d7927673SGreg Tucker
187d7927673SGreg Tucker fprintf(file, "struct inflate_huff_code_large pregen_lit_huff_code = {\n");
188d7927673SGreg Tucker fprint_uint32_table(file, state.lit_huff_code.short_code_lookup,
189d7927673SGreg Tucker sizeof(state.lit_huff_code.short_code_lookup) / sizeof(uint32_t),
190d7927673SGreg Tucker "\t.short_code_lookup = {", "\t},\n\n", "\t\t");
191d7927673SGreg Tucker fprint_uint16_table(file, state.lit_huff_code.long_code_lookup,
192d7927673SGreg Tucker sizeof(state.lit_huff_code.long_code_lookup) / sizeof(uint16_t),
193d7927673SGreg Tucker "\t.long_code_lookup = {", "\t}\n", "\t\t");
194d7927673SGreg Tucker fprintf(file, "};\n\n");
195d7927673SGreg Tucker
196d7927673SGreg Tucker fprintf(file, "struct inflate_huff_code_small pregen_dist_huff_code = {\n");
197d7927673SGreg Tucker fprint_uint16_table(file, state.dist_huff_code.short_code_lookup,
198d7927673SGreg Tucker sizeof(state.dist_huff_code.short_code_lookup) / sizeof(uint16_t),
199d7927673SGreg Tucker "\t.short_code_lookup = {", "\t},\n\n", "\t\t");
200d7927673SGreg Tucker fprint_uint16_table(file, state.dist_huff_code.long_code_lookup,
201d7927673SGreg Tucker sizeof(state.dist_huff_code.long_code_lookup) / sizeof(uint16_t),
202d7927673SGreg Tucker "\t.long_code_lookup = {", "\t}\n", "\t\t");
203d7927673SGreg Tucker fprintf(file, "};\n\n");
204d7927673SGreg Tucker
20552d97476SRoy Oursler fclose(file);
20663dffab9SGreg Tucker free(in_buf);
20752d97476SRoy Oursler return 0;
20852d97476SRoy Oursler }
209