/src/zlib-ng/deflate_huff.c
Line | Count | Source |
1 | | /* deflate_huff.c -- compress data using huffman encoding only strategy |
2 | | * |
3 | | * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler |
4 | | * For conditions of distribution and use, see copyright notice in zlib.h |
5 | | */ |
6 | | |
7 | | #include "zbuild.h" |
8 | | #include "deflate.h" |
9 | | #include "deflate_p.h" |
10 | | #include "functable.h" |
11 | | |
12 | | /* =========================================================================== |
13 | | * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. |
14 | | * (It will be regenerated if this run of deflate switches away from Huffman.) |
15 | | */ |
16 | 0 | Z_INTERNAL block_state deflate_huff(deflate_state *s, int flush) { |
17 | 0 | unsigned char *window = s->window; |
18 | 0 | int bflush = 0; /* set if current block must be flushed */ |
19 | 0 | unsigned int lookahead = s->lookahead; |
20 | 0 | unsigned int strstart = s->strstart; |
21 | |
|
22 | 0 | for (;;) { |
23 | | /* Make sure that we have a literal to write. */ |
24 | 0 | if (UNLIKELY(lookahead == 0)) { |
25 | 0 | s->lookahead = lookahead; |
26 | 0 | s->strstart = strstart; |
27 | 0 | PREFIX(fill_window)(s); |
28 | 0 | lookahead = s->lookahead; |
29 | 0 | strstart = s->strstart; |
30 | 0 | if (UNLIKELY(lookahead == 0)) { |
31 | 0 | if (flush == Z_NO_FLUSH) |
32 | 0 | return need_more; |
33 | 0 | break; /* flush the current block */ |
34 | 0 | } |
35 | 0 | } |
36 | | |
37 | | /* Output a literal byte */ |
38 | 0 | bflush = zng_tr_tally_lit(s, window[strstart]); |
39 | 0 | lookahead--; |
40 | 0 | strstart++; |
41 | 0 | if (bflush) { |
42 | 0 | s->lookahead = lookahead; |
43 | 0 | s->strstart = strstart; |
44 | 0 | FLUSH_BLOCK(s, window, 0); |
45 | 0 | } |
46 | 0 | } |
47 | 0 | s->lookahead = lookahead; |
48 | 0 | s->strstart = strstart; |
49 | 0 | s->insert = 0; |
50 | 0 | if (flush == Z_FINISH) { |
51 | 0 | FLUSH_BLOCK(s, window, 1); |
52 | 0 | return finish_done; |
53 | 0 | } |
54 | 0 | if (s->sym_next) |
55 | 0 | FLUSH_BLOCK(s, window, 0); |
56 | 0 | return block_done; |
57 | 0 | } |