xref: /isa-l/igzip/generate_static_inflate.c (revision 55fbfabfc60f1002bc8133b730a59f6abd22cfce)
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