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)16Z_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