1 /* deflate_huff.c -- compress data using huffman encoding only strategy
2  *
3  * Copyright (C) 1995-2013 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  */
deflate_huff(deflate_state * s,int flush)16 Z_INTERNAL block_state deflate_huff(deflate_state *s, int flush) {
17     int bflush = 0;         /* set if current block must be flushed */
18 
19     for (;;) {
20         /* Make sure that we have a literal to write. */
21         if (s->lookahead == 0) {
22             fill_window(s);
23             if (s->lookahead == 0) {
24                 if (flush == Z_NO_FLUSH)
25                     return need_more;
26                 break;      /* flush the current block */
27             }
28         }
29 
30         /* Output a literal byte */
31         bflush = zng_tr_tally_lit(s, s->window[s->strstart]);
32         s->lookahead--;
33         s->strstart++;
34         if (bflush)
35             FLUSH_BLOCK(s, 0);
36     }
37     s->insert = 0;
38     if (flush == Z_FINISH) {
39         FLUSH_BLOCK(s, 1);
40         return finish_done;
41     }
42     if (s->sym_next)
43         FLUSH_BLOCK(s, 0);
44     return block_done;
45 }
46