File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / zlib / deflate.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:23:02 2012 UTC (12 years, 4 months ago) by misho
Branches: sudo, MAIN
CVS tags: v1_8_3p2, HEAD
sudo

    1: /* deflate.c -- compress data using the deflation algorithm
    2:  * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
    3:  * For conditions of distribution and use, see copyright notice in zlib.h
    4:  */
    5: 
    6: /*
    7:  *  ALGORITHM
    8:  *
    9:  *      The "deflation" process depends on being able to identify portions
   10:  *      of the input text which are identical to earlier input (within a
   11:  *      sliding window trailing behind the input currently being processed).
   12:  *
   13:  *      The most straightforward technique turns out to be the fastest for
   14:  *      most input files: try all possible matches and select the longest.
   15:  *      The key feature of this algorithm is that insertions into the string
   16:  *      dictionary are very simple and thus fast, and deletions are avoided
   17:  *      completely. Insertions are performed at each input character, whereas
   18:  *      string matches are performed only when the previous match ends. So it
   19:  *      is preferable to spend more time in matches to allow very fast string
   20:  *      insertions and avoid deletions. The matching algorithm for small
   21:  *      strings is inspired from that of Rabin & Karp. A brute force approach
   22:  *      is used to find longer strings when a small match has been found.
   23:  *      A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
   24:  *      (by Leonid Broukhis).
   25:  *         A previous version of this file used a more sophisticated algorithm
   26:  *      (by Fiala and Greene) which is guaranteed to run in linear amortized
   27:  *      time, but has a larger average cost, uses more memory and is patented.
   28:  *      However the F&G algorithm may be faster for some highly redundant
   29:  *      files if the parameter max_chain_length (described below) is too large.
   30:  *
   31:  *  ACKNOWLEDGEMENTS
   32:  *
   33:  *      The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
   34:  *      I found it in 'freeze' written by Leonid Broukhis.
   35:  *      Thanks to many people for bug reports and testing.
   36:  *
   37:  *  REFERENCES
   38:  *
   39:  *      Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
   40:  *      Available in http://www.ietf.org/rfc/rfc1951.txt
   41:  *
   42:  *      A description of the Rabin and Karp algorithm is given in the book
   43:  *         "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
   44:  *
   45:  *      Fiala,E.R., and Greene,D.H.
   46:  *         Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
   47:  *
   48:  */
   49: 
   50: /* @(#) $Id: deflate.c,v 1.1.1.1 2012/02/21 16:23:02 misho Exp $ */
   51: 
   52: #include "deflate.h"
   53: 
   54: const char deflate_copyright[] =
   55:    " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler ";
   56: /*
   57:   If you use the zlib library in a product, an acknowledgment is welcome
   58:   in the documentation of your product. If for some reason you cannot
   59:   include such an acknowledgment, I would appreciate that you keep this
   60:   copyright string in the executable of your product.
   61:  */
   62: 
   63: /* ===========================================================================
   64:  *  Function prototypes.
   65:  */
   66: typedef enum {
   67:     need_more,      /* block not completed, need more input or more output */
   68:     block_done,     /* block flush performed */
   69:     finish_started, /* finish started, need only more output at next deflate */
   70:     finish_done     /* finish done, accept no more input or output */
   71: } block_state;
   72: 
   73: typedef block_state (*compress_func) OF((deflate_state *s, int flush));
   74: /* Compression function. Returns the block state after the call. */
   75: 
   76: local void fill_window    OF((deflate_state *s));
   77: local block_state deflate_stored OF((deflate_state *s, int flush));
   78: local block_state deflate_fast   OF((deflate_state *s, int flush));
   79: #ifndef FASTEST
   80: local block_state deflate_slow   OF((deflate_state *s, int flush));
   81: #endif
   82: local block_state deflate_rle    OF((deflate_state *s, int flush));
   83: local block_state deflate_huff   OF((deflate_state *s, int flush));
   84: local void lm_init        OF((deflate_state *s));
   85: local void putShortMSB    OF((deflate_state *s, uInt b));
   86: local void flush_pending  OF((z_streamp strm));
   87: local int read_buf        OF((z_streamp strm, Bytef *buf, unsigned size));
   88: #ifdef ASMV
   89:       void match_init OF((void)); /* asm code initialization */
   90:       uInt longest_match  OF((deflate_state *s, IPos cur_match));
   91: #else
   92: local uInt longest_match  OF((deflate_state *s, IPos cur_match));
   93: #endif
   94: 
   95: #ifdef DEBUG
   96: local  void check_match OF((deflate_state *s, IPos start, IPos match,
   97:                             int length));
   98: #endif
   99: 
  100: /* ===========================================================================
  101:  * Local data
  102:  */
  103: 
  104: #define NIL 0
  105: /* Tail of hash chains */
  106: 
  107: #ifndef TOO_FAR
  108: #  define TOO_FAR 4096
  109: #endif
  110: /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
  111: 
  112: /* Values for max_lazy_match, good_match and max_chain_length, depending on
  113:  * the desired pack level (0..9). The values given below have been tuned to
  114:  * exclude worst case performance for pathological files. Better values may be
  115:  * found for specific files.
  116:  */
  117: typedef struct config_s {
  118:    ush good_length; /* reduce lazy search above this match length */
  119:    ush max_lazy;    /* do not perform lazy search above this match length */
  120:    ush nice_length; /* quit search above this match length */
  121:    ush max_chain;
  122:    compress_func func;
  123: } config;
  124: 
  125: #ifdef FASTEST
  126: local const config configuration_table[2] = {
  127: /*      good lazy nice chain */
  128: /* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */
  129: /* 1 */ {4,    4,  8,    4, deflate_fast}}; /* max speed, no lazy matches */
  130: #else
  131: local const config configuration_table[10] = {
  132: /*      good lazy nice chain */
  133: /* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */
  134: /* 1 */ {4,    4,  8,    4, deflate_fast}, /* max speed, no lazy matches */
  135: /* 2 */ {4,    5, 16,    8, deflate_fast},
  136: /* 3 */ {4,    6, 32,   32, deflate_fast},
  137: 
  138: /* 4 */ {4,    4, 16,   16, deflate_slow},  /* lazy matches */
  139: /* 5 */ {8,   16, 32,   32, deflate_slow},
  140: /* 6 */ {8,   16, 128, 128, deflate_slow},
  141: /* 7 */ {8,   32, 128, 256, deflate_slow},
  142: /* 8 */ {32, 128, 258, 1024, deflate_slow},
  143: /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */
  144: #endif
  145: 
  146: /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
  147:  * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
  148:  * meaning.
  149:  */
  150: 
  151: #define EQUAL 0
  152: /* result of memcmp for equal strings */
  153: 
  154: #ifndef NO_DUMMY_DECL
  155: struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
  156: #endif
  157: 
  158: /* ===========================================================================
  159:  * Update a hash value with the given input byte
  160:  * IN  assertion: all calls to to UPDATE_HASH are made with consecutive
  161:  *    input characters, so that a running hash key can be computed from the
  162:  *    previous key instead of complete recalculation each time.
  163:  */
  164: #define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
  165: 
  166: 
  167: /* ===========================================================================
  168:  * Insert string str in the dictionary and set match_head to the previous head
  169:  * of the hash chain (the most recent string with same hash key). Return
  170:  * the previous length of the hash chain.
  171:  * If this file is compiled with -DFASTEST, the compression level is forced
  172:  * to 1, and no hash chains are maintained.
  173:  * IN  assertion: all calls to to INSERT_STRING are made with consecutive
  174:  *    input characters and the first MIN_MATCH bytes of str are valid
  175:  *    (except for the last MIN_MATCH-1 bytes of the input file).
  176:  */
  177: #ifdef FASTEST
  178: #define INSERT_STRING(s, str, match_head) \
  179:    (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
  180:     match_head = s->head[s->ins_h], \
  181:     s->head[s->ins_h] = (Pos)(str))
  182: #else
  183: #define INSERT_STRING(s, str, match_head) \
  184:    (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
  185:     match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
  186:     s->head[s->ins_h] = (Pos)(str))
  187: #endif
  188: 
  189: /* ===========================================================================
  190:  * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
  191:  * prev[] will be initialized on the fly.
  192:  */
  193: #define CLEAR_HASH(s) \
  194:     s->head[s->hash_size-1] = NIL; \
  195:     zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
  196: 
  197: /* ========================================================================= */
  198: int ZEXPORT deflateInit_(strm, level, version, stream_size)
  199:     z_streamp strm;
  200:     int level;
  201:     const char *version;
  202:     int stream_size;
  203: {
  204:     return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
  205:                          Z_DEFAULT_STRATEGY, version, stream_size);
  206:     /* To do: ignore strm->next_in if we use it as window */
  207: }
  208: 
  209: /* ========================================================================= */
  210: int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
  211:                   version, stream_size)
  212:     z_streamp strm;
  213:     int  level;
  214:     int  method;
  215:     int  windowBits;
  216:     int  memLevel;
  217:     int  strategy;
  218:     const char *version;
  219:     int stream_size;
  220: {
  221:     deflate_state *s;
  222:     int wrap = 1;
  223:     static const char my_version[] = ZLIB_VERSION;
  224: 
  225:     ushf *overlay;
  226:     /* We overlay pending_buf and d_buf+l_buf. This works since the average
  227:      * output size for (length,distance) codes is <= 24 bits.
  228:      */
  229: 
  230:     if (version == Z_NULL || version[0] != my_version[0] ||
  231:         stream_size != sizeof(z_stream)) {
  232:         return Z_VERSION_ERROR;
  233:     }
  234:     if (strm == Z_NULL) return Z_STREAM_ERROR;
  235: 
  236:     strm->msg = Z_NULL;
  237:     if (strm->zalloc == (alloc_func)0) {
  238:         strm->zalloc = zcalloc;
  239:         strm->opaque = (voidpf)0;
  240:     }
  241:     if (strm->zfree == (free_func)0) strm->zfree = zcfree;
  242: 
  243: #ifdef FASTEST
  244:     if (level != 0) level = 1;
  245: #else
  246:     if (level == Z_DEFAULT_COMPRESSION) level = 6;
  247: #endif
  248: 
  249:     if (windowBits < 0) { /* suppress zlib wrapper */
  250:         wrap = 0;
  251:         windowBits = -windowBits;
  252:     }
  253: #ifdef GZIP
  254:     else if (windowBits > 15) {
  255:         wrap = 2;       /* write gzip wrapper instead */
  256:         windowBits -= 16;
  257:     }
  258: #endif
  259:     if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
  260:         windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
  261:         strategy < 0 || strategy > Z_FIXED) {
  262:         return Z_STREAM_ERROR;
  263:     }
  264:     if (windowBits == 8) windowBits = 9;  /* until 256-byte window bug fixed */
  265:     s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
  266:     if (s == Z_NULL) return Z_MEM_ERROR;
  267:     strm->state = (struct internal_state FAR *)s;
  268:     s->strm = strm;
  269: 
  270:     s->wrap = wrap;
  271:     s->gzhead = Z_NULL;
  272:     s->w_bits = windowBits;
  273:     s->w_size = 1 << s->w_bits;
  274:     s->w_mask = s->w_size - 1;
  275: 
  276:     s->hash_bits = memLevel + 7;
  277:     s->hash_size = 1 << s->hash_bits;
  278:     s->hash_mask = s->hash_size - 1;
  279:     s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
  280: 
  281:     s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
  282:     s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
  283:     s->head   = (Posf *)  ZALLOC(strm, s->hash_size, sizeof(Pos));
  284: 
  285:     s->high_water = 0;      /* nothing written to s->window yet */
  286: 
  287:     s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
  288: 
  289:     overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
  290:     s->pending_buf = (uchf *) overlay;
  291:     s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
  292: 
  293:     if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
  294:         s->pending_buf == Z_NULL) {
  295:         s->status = FINISH_STATE;
  296:         strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
  297:         deflateEnd (strm);
  298:         return Z_MEM_ERROR;
  299:     }
  300:     s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
  301:     s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
  302: 
  303:     s->level = level;
  304:     s->strategy = strategy;
  305:     s->method = (Byte)method;
  306: 
  307:     return deflateReset(strm);
  308: }
  309: 
  310: /* ========================================================================= */
  311: int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
  312:     z_streamp strm;
  313:     const Bytef *dictionary;
  314:     uInt  dictLength;
  315: {
  316:     deflate_state *s;
  317:     uInt length = dictLength;
  318:     uInt n;
  319:     IPos hash_head = 0;
  320: 
  321:     if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||
  322:         strm->state->wrap == 2 ||
  323:         (strm->state->wrap == 1 && strm->state->status != INIT_STATE))
  324:         return Z_STREAM_ERROR;
  325: 
  326:     s = strm->state;
  327:     if (s->wrap)
  328:         strm->adler = adler32(strm->adler, dictionary, dictLength);
  329: 
  330:     if (length < MIN_MATCH) return Z_OK;
  331:     if (length > s->w_size) {
  332:         length = s->w_size;
  333:         dictionary += dictLength - length; /* use the tail of the dictionary */
  334:     }
  335:     zmemcpy(s->window, dictionary, length);
  336:     s->strstart = length;
  337:     s->block_start = (long)length;
  338: 
  339:     /* Insert all strings in the hash table (except for the last two bytes).
  340:      * s->lookahead stays null, so s->ins_h will be recomputed at the next
  341:      * call of fill_window.
  342:      */
  343:     s->ins_h = s->window[0];
  344:     UPDATE_HASH(s, s->ins_h, s->window[1]);
  345:     for (n = 0; n <= length - MIN_MATCH; n++) {
  346:         INSERT_STRING(s, n, hash_head);
  347:     }
  348:     if (hash_head) hash_head = 0;  /* to make compiler happy */
  349:     return Z_OK;
  350: }
  351: 
  352: /* ========================================================================= */
  353: int ZEXPORT deflateReset (strm)
  354:     z_streamp strm;
  355: {
  356:     deflate_state *s;
  357: 
  358:     if (strm == Z_NULL || strm->state == Z_NULL ||
  359:         strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {
  360:         return Z_STREAM_ERROR;
  361:     }
  362: 
  363:     strm->total_in = strm->total_out = 0;
  364:     strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
  365:     strm->data_type = Z_UNKNOWN;
  366: 
  367:     s = (deflate_state *)strm->state;
  368:     s->pending = 0;
  369:     s->pending_out = s->pending_buf;
  370: 
  371:     if (s->wrap < 0) {
  372:         s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
  373:     }
  374:     s->status = s->wrap ? INIT_STATE : BUSY_STATE;
  375:     strm->adler =
  376: #ifdef GZIP
  377:         s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
  378: #endif
  379:         adler32(0L, Z_NULL, 0);
  380:     s->last_flush = Z_NO_FLUSH;
  381: 
  382:     _tr_init(s);
  383:     lm_init(s);
  384: 
  385:     return Z_OK;
  386: }
  387: 
  388: /* ========================================================================= */
  389: int ZEXPORT deflateSetHeader (strm, head)
  390:     z_streamp strm;
  391:     gz_headerp head;
  392: {
  393:     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
  394:     if (strm->state->wrap != 2) return Z_STREAM_ERROR;
  395:     strm->state->gzhead = head;
  396:     return Z_OK;
  397: }
  398: 
  399: /* ========================================================================= */
  400: int ZEXPORT deflatePrime (strm, bits, value)
  401:     z_streamp strm;
  402:     int bits;
  403:     int value;
  404: {
  405:     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
  406:     strm->state->bi_valid = bits;
  407:     strm->state->bi_buf = (ush)(value & ((1 << bits) - 1));
  408:     return Z_OK;
  409: }
  410: 
  411: /* ========================================================================= */
  412: int ZEXPORT deflateParams(strm, level, strategy)
  413:     z_streamp strm;
  414:     int level;
  415:     int strategy;
  416: {
  417:     deflate_state *s;
  418:     compress_func func;
  419:     int err = Z_OK;
  420: 
  421:     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
  422:     s = strm->state;
  423: 
  424: #ifdef FASTEST
  425:     if (level != 0) level = 1;
  426: #else
  427:     if (level == Z_DEFAULT_COMPRESSION) level = 6;
  428: #endif
  429:     if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {
  430:         return Z_STREAM_ERROR;
  431:     }
  432:     func = configuration_table[s->level].func;
  433: 
  434:     if ((strategy != s->strategy || func != configuration_table[level].func) &&
  435:         strm->total_in != 0) {
  436:         /* Flush the last buffer: */
  437:         err = deflate(strm, Z_BLOCK);
  438:     }
  439:     if (s->level != level) {
  440:         s->level = level;
  441:         s->max_lazy_match   = configuration_table[level].max_lazy;
  442:         s->good_match       = configuration_table[level].good_length;
  443:         s->nice_match       = configuration_table[level].nice_length;
  444:         s->max_chain_length = configuration_table[level].max_chain;
  445:     }
  446:     s->strategy = strategy;
  447:     return err;
  448: }
  449: 
  450: /* ========================================================================= */
  451: int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
  452:     z_streamp strm;
  453:     int good_length;
  454:     int max_lazy;
  455:     int nice_length;
  456:     int max_chain;
  457: {
  458:     deflate_state *s;
  459: 
  460:     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
  461:     s = strm->state;
  462:     s->good_match = good_length;
  463:     s->max_lazy_match = max_lazy;
  464:     s->nice_match = nice_length;
  465:     s->max_chain_length = max_chain;
  466:     return Z_OK;
  467: }
  468: 
  469: /* =========================================================================
  470:  * For the default windowBits of 15 and memLevel of 8, this function returns
  471:  * a close to exact, as well as small, upper bound on the compressed size.
  472:  * They are coded as constants here for a reason--if the #define's are
  473:  * changed, then this function needs to be changed as well.  The return
  474:  * value for 15 and 8 only works for those exact settings.
  475:  *
  476:  * For any setting other than those defaults for windowBits and memLevel,
  477:  * the value returned is a conservative worst case for the maximum expansion
  478:  * resulting from using fixed blocks instead of stored blocks, which deflate
  479:  * can emit on compressed data for some combinations of the parameters.
  480:  *
  481:  * This function could be more sophisticated to provide closer upper bounds for
  482:  * every combination of windowBits and memLevel.  But even the conservative
  483:  * upper bound of about 14% expansion does not seem onerous for output buffer
  484:  * allocation.
  485:  */
  486: uLong ZEXPORT deflateBound(strm, sourceLen)
  487:     z_streamp strm;
  488:     uLong sourceLen;
  489: {
  490:     deflate_state *s;
  491:     uLong complen, wraplen;
  492:     Bytef *str;
  493: 
  494:     /* conservative upper bound for compressed data */
  495:     complen = sourceLen +
  496:               ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
  497: 
  498:     /* if can't get parameters, return conservative bound plus zlib wrapper */
  499:     if (strm == Z_NULL || strm->state == Z_NULL)
  500:         return complen + 6;
  501: 
  502:     /* compute wrapper length */
  503:     s = strm->state;
  504:     switch (s->wrap) {
  505:     case 0:                                 /* raw deflate */
  506:         wraplen = 0;
  507:         break;
  508:     case 1:                                 /* zlib wrapper */
  509:         wraplen = 6 + (s->strstart ? 4 : 0);
  510:         break;
  511:     case 2:                                 /* gzip wrapper */
  512:         wraplen = 18;
  513:         if (s->gzhead != Z_NULL) {          /* user-supplied gzip header */
  514:             if (s->gzhead->extra != Z_NULL)
  515:                 wraplen += 2 + s->gzhead->extra_len;
  516:             str = s->gzhead->name;
  517:             if (str != Z_NULL)
  518:                 do {
  519:                     wraplen++;
  520:                 } while (*str++);
  521:             str = s->gzhead->comment;
  522:             if (str != Z_NULL)
  523:                 do {
  524:                     wraplen++;
  525:                 } while (*str++);
  526:             if (s->gzhead->hcrc)
  527:                 wraplen += 2;
  528:         }
  529:         break;
  530:     default:                                /* for compiler happiness */
  531:         wraplen = 6;
  532:     }
  533: 
  534:     /* if not default parameters, return conservative bound */
  535:     if (s->w_bits != 15 || s->hash_bits != 8 + 7)
  536:         return complen + wraplen;
  537: 
  538:     /* default settings: return tight bound for that case */
  539:     return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
  540:            (sourceLen >> 25) + 13 - 6 + wraplen;
  541: }
  542: 
  543: /* =========================================================================
  544:  * Put a short in the pending buffer. The 16-bit value is put in MSB order.
  545:  * IN assertion: the stream state is correct and there is enough room in
  546:  * pending_buf.
  547:  */
  548: local void putShortMSB (s, b)
  549:     deflate_state *s;
  550:     uInt b;
  551: {
  552:     put_byte(s, (Byte)(b >> 8));
  553:     put_byte(s, (Byte)(b & 0xff));
  554: }
  555: 
  556: /* =========================================================================
  557:  * Flush as much pending output as possible. All deflate() output goes
  558:  * through this function so some applications may wish to modify it
  559:  * to avoid allocating a large strm->next_out buffer and copying into it.
  560:  * (See also read_buf()).
  561:  */
  562: local void flush_pending(strm)
  563:     z_streamp strm;
  564: {
  565:     unsigned len = strm->state->pending;
  566: 
  567:     if (len > strm->avail_out) len = strm->avail_out;
  568:     if (len == 0) return;
  569: 
  570:     zmemcpy(strm->next_out, strm->state->pending_out, len);
  571:     strm->next_out  += len;
  572:     strm->state->pending_out  += len;
  573:     strm->total_out += len;
  574:     strm->avail_out  -= len;
  575:     strm->state->pending -= len;
  576:     if (strm->state->pending == 0) {
  577:         strm->state->pending_out = strm->state->pending_buf;
  578:     }
  579: }
  580: 
  581: /* ========================================================================= */
  582: int ZEXPORT deflate (strm, flush)
  583:     z_streamp strm;
  584:     int flush;
  585: {
  586:     int old_flush; /* value of flush param for previous deflate call */
  587:     deflate_state *s;
  588: 
  589:     if (strm == Z_NULL || strm->state == Z_NULL ||
  590:         flush > Z_BLOCK || flush < 0) {
  591:         return Z_STREAM_ERROR;
  592:     }
  593:     s = strm->state;
  594: 
  595:     if (strm->next_out == Z_NULL ||
  596:         (strm->next_in == Z_NULL && strm->avail_in != 0) ||
  597:         (s->status == FINISH_STATE && flush != Z_FINISH)) {
  598:         ERR_RETURN(strm, Z_STREAM_ERROR);
  599:     }
  600:     if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
  601: 
  602:     s->strm = strm; /* just in case */
  603:     old_flush = s->last_flush;
  604:     s->last_flush = flush;
  605: 
  606:     /* Write the header */
  607:     if (s->status == INIT_STATE) {
  608: #ifdef GZIP
  609:         if (s->wrap == 2) {
  610:             strm->adler = crc32(0L, Z_NULL, 0);
  611:             put_byte(s, 31);
  612:             put_byte(s, 139);
  613:             put_byte(s, 8);
  614:             if (s->gzhead == Z_NULL) {
  615:                 put_byte(s, 0);
  616:                 put_byte(s, 0);
  617:                 put_byte(s, 0);
  618:                 put_byte(s, 0);
  619:                 put_byte(s, 0);
  620:                 put_byte(s, s->level == 9 ? 2 :
  621:                             (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
  622:                              4 : 0));
  623:                 put_byte(s, OS_CODE);
  624:                 s->status = BUSY_STATE;
  625:             }
  626:             else {
  627:                 put_byte(s, (s->gzhead->text ? 1 : 0) +
  628:                             (s->gzhead->hcrc ? 2 : 0) +
  629:                             (s->gzhead->extra == Z_NULL ? 0 : 4) +
  630:                             (s->gzhead->name == Z_NULL ? 0 : 8) +
  631:                             (s->gzhead->comment == Z_NULL ? 0 : 16)
  632:                         );
  633:                 put_byte(s, (Byte)(s->gzhead->time & 0xff));
  634:                 put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));
  635:                 put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));
  636:                 put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));
  637:                 put_byte(s, s->level == 9 ? 2 :
  638:                             (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
  639:                              4 : 0));
  640:                 put_byte(s, s->gzhead->os & 0xff);
  641:                 if (s->gzhead->extra != Z_NULL) {
  642:                     put_byte(s, s->gzhead->extra_len & 0xff);
  643:                     put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
  644:                 }
  645:                 if (s->gzhead->hcrc)
  646:                     strm->adler = crc32(strm->adler, s->pending_buf,
  647:                                         s->pending);
  648:                 s->gzindex = 0;
  649:                 s->status = EXTRA_STATE;
  650:             }
  651:         }
  652:         else
  653: #endif
  654:         {
  655:             uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
  656:             uInt level_flags;
  657: 
  658:             if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
  659:                 level_flags = 0;
  660:             else if (s->level < 6)
  661:                 level_flags = 1;
  662:             else if (s->level == 6)
  663:                 level_flags = 2;
  664:             else
  665:                 level_flags = 3;
  666:             header |= (level_flags << 6);
  667:             if (s->strstart != 0) header |= PRESET_DICT;
  668:             header += 31 - (header % 31);
  669: 
  670:             s->status = BUSY_STATE;
  671:             putShortMSB(s, header);
  672: 
  673:             /* Save the adler32 of the preset dictionary: */
  674:             if (s->strstart != 0) {
  675:                 putShortMSB(s, (uInt)(strm->adler >> 16));
  676:                 putShortMSB(s, (uInt)(strm->adler & 0xffff));
  677:             }
  678:             strm->adler = adler32(0L, Z_NULL, 0);
  679:         }
  680:     }
  681: #ifdef GZIP
  682:     if (s->status == EXTRA_STATE) {
  683:         if (s->gzhead->extra != Z_NULL) {
  684:             uInt beg = s->pending;  /* start of bytes to update crc */
  685: 
  686:             while (s->gzindex < (s->gzhead->extra_len & 0xffff)) {
  687:                 if (s->pending == s->pending_buf_size) {
  688:                     if (s->gzhead->hcrc && s->pending > beg)
  689:                         strm->adler = crc32(strm->adler, s->pending_buf + beg,
  690:                                             s->pending - beg);
  691:                     flush_pending(strm);
  692:                     beg = s->pending;
  693:                     if (s->pending == s->pending_buf_size)
  694:                         break;
  695:                 }
  696:                 put_byte(s, s->gzhead->extra[s->gzindex]);
  697:                 s->gzindex++;
  698:             }
  699:             if (s->gzhead->hcrc && s->pending > beg)
  700:                 strm->adler = crc32(strm->adler, s->pending_buf + beg,
  701:                                     s->pending - beg);
  702:             if (s->gzindex == s->gzhead->extra_len) {
  703:                 s->gzindex = 0;
  704:                 s->status = NAME_STATE;
  705:             }
  706:         }
  707:         else
  708:             s->status = NAME_STATE;
  709:     }
  710:     if (s->status == NAME_STATE) {
  711:         if (s->gzhead->name != Z_NULL) {
  712:             uInt beg = s->pending;  /* start of bytes to update crc */
  713:             int val;
  714: 
  715:             do {
  716:                 if (s->pending == s->pending_buf_size) {
  717:                     if (s->gzhead->hcrc && s->pending > beg)
  718:                         strm->adler = crc32(strm->adler, s->pending_buf + beg,
  719:                                             s->pending - beg);
  720:                     flush_pending(strm);
  721:                     beg = s->pending;
  722:                     if (s->pending == s->pending_buf_size) {
  723:                         val = 1;
  724:                         break;
  725:                     }
  726:                 }
  727:                 val = s->gzhead->name[s->gzindex++];
  728:                 put_byte(s, val);
  729:             } while (val != 0);
  730:             if (s->gzhead->hcrc && s->pending > beg)
  731:                 strm->adler = crc32(strm->adler, s->pending_buf + beg,
  732:                                     s->pending - beg);
  733:             if (val == 0) {
  734:                 s->gzindex = 0;
  735:                 s->status = COMMENT_STATE;
  736:             }
  737:         }
  738:         else
  739:             s->status = COMMENT_STATE;
  740:     }
  741:     if (s->status == COMMENT_STATE) {
  742:         if (s->gzhead->comment != Z_NULL) {
  743:             uInt beg = s->pending;  /* start of bytes to update crc */
  744:             int val;
  745: 
  746:             do {
  747:                 if (s->pending == s->pending_buf_size) {
  748:                     if (s->gzhead->hcrc && s->pending > beg)
  749:                         strm->adler = crc32(strm->adler, s->pending_buf + beg,
  750:                                             s->pending - beg);
  751:                     flush_pending(strm);
  752:                     beg = s->pending;
  753:                     if (s->pending == s->pending_buf_size) {
  754:                         val = 1;
  755:                         break;
  756:                     }
  757:                 }
  758:                 val = s->gzhead->comment[s->gzindex++];
  759:                 put_byte(s, val);
  760:             } while (val != 0);
  761:             if (s->gzhead->hcrc && s->pending > beg)
  762:                 strm->adler = crc32(strm->adler, s->pending_buf + beg,
  763:                                     s->pending - beg);
  764:             if (val == 0)
  765:                 s->status = HCRC_STATE;
  766:         }
  767:         else
  768:             s->status = HCRC_STATE;
  769:     }
  770:     if (s->status == HCRC_STATE) {
  771:         if (s->gzhead->hcrc) {
  772:             if (s->pending + 2 > s->pending_buf_size)
  773:                 flush_pending(strm);
  774:             if (s->pending + 2 <= s->pending_buf_size) {
  775:                 put_byte(s, (Byte)(strm->adler & 0xff));
  776:                 put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
  777:                 strm->adler = crc32(0L, Z_NULL, 0);
  778:                 s->status = BUSY_STATE;
  779:             }
  780:         }
  781:         else
  782:             s->status = BUSY_STATE;
  783:     }
  784: #endif
  785: 
  786:     /* Flush as much pending output as possible */
  787:     if (s->pending != 0) {
  788:         flush_pending(strm);
  789:         if (strm->avail_out == 0) {
  790:             /* Since avail_out is 0, deflate will be called again with
  791:              * more output space, but possibly with both pending and
  792:              * avail_in equal to zero. There won't be anything to do,
  793:              * but this is not an error situation so make sure we
  794:              * return OK instead of BUF_ERROR at next call of deflate:
  795:              */
  796:             s->last_flush = -1;
  797:             return Z_OK;
  798:         }
  799: 
  800:     /* Make sure there is something to do and avoid duplicate consecutive
  801:      * flushes. For repeated and useless calls with Z_FINISH, we keep
  802:      * returning Z_STREAM_END instead of Z_BUF_ERROR.
  803:      */
  804:     } else if (strm->avail_in == 0 && flush <= old_flush &&
  805:                flush != Z_FINISH) {
  806:         ERR_RETURN(strm, Z_BUF_ERROR);
  807:     }
  808: 
  809:     /* User must not provide more input after the first FINISH: */
  810:     if (s->status == FINISH_STATE && strm->avail_in != 0) {
  811:         ERR_RETURN(strm, Z_BUF_ERROR);
  812:     }
  813: 
  814:     /* Start a new block or continue the current one.
  815:      */
  816:     if (strm->avail_in != 0 || s->lookahead != 0 ||
  817:         (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
  818:         block_state bstate;
  819: 
  820:         bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
  821:                     (s->strategy == Z_RLE ? deflate_rle(s, flush) :
  822:                         (*(configuration_table[s->level].func))(s, flush));
  823: 
  824:         if (bstate == finish_started || bstate == finish_done) {
  825:             s->status = FINISH_STATE;
  826:         }
  827:         if (bstate == need_more || bstate == finish_started) {
  828:             if (strm->avail_out == 0) {
  829:                 s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
  830:             }
  831:             return Z_OK;
  832:             /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
  833:              * of deflate should use the same flush parameter to make sure
  834:              * that the flush is complete. So we don't have to output an
  835:              * empty block here, this will be done at next call. This also
  836:              * ensures that for a very small output buffer, we emit at most
  837:              * one empty block.
  838:              */
  839:         }
  840:         if (bstate == block_done) {
  841:             if (flush == Z_PARTIAL_FLUSH) {
  842:                 _tr_align(s);
  843:             } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
  844:                 _tr_stored_block(s, (char*)0, 0L, 0);
  845:                 /* For a full flush, this empty block will be recognized
  846:                  * as a special marker by inflate_sync().
  847:                  */
  848:                 if (flush == Z_FULL_FLUSH) {
  849:                     CLEAR_HASH(s);             /* forget history */
  850:                     if (s->lookahead == 0) {
  851:                         s->strstart = 0;
  852:                         s->block_start = 0L;
  853:                     }
  854:                 }
  855:             }
  856:             flush_pending(strm);
  857:             if (strm->avail_out == 0) {
  858:               s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
  859:               return Z_OK;
  860:             }
  861:         }
  862:     }
  863:     Assert(strm->avail_out > 0, "bug2");
  864: 
  865:     if (flush != Z_FINISH) return Z_OK;
  866:     if (s->wrap <= 0) return Z_STREAM_END;
  867: 
  868:     /* Write the trailer */
  869: #ifdef GZIP
  870:     if (s->wrap == 2) {
  871:         put_byte(s, (Byte)(strm->adler & 0xff));
  872:         put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
  873:         put_byte(s, (Byte)((strm->adler >> 16) & 0xff));
  874:         put_byte(s, (Byte)((strm->adler >> 24) & 0xff));
  875:         put_byte(s, (Byte)(strm->total_in & 0xff));
  876:         put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));
  877:         put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));
  878:         put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));
  879:     }
  880:     else
  881: #endif
  882:     {
  883:         putShortMSB(s, (uInt)(strm->adler >> 16));
  884:         putShortMSB(s, (uInt)(strm->adler & 0xffff));
  885:     }
  886:     flush_pending(strm);
  887:     /* If avail_out is zero, the application will call deflate again
  888:      * to flush the rest.
  889:      */
  890:     if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */
  891:     return s->pending != 0 ? Z_OK : Z_STREAM_END;
  892: }
  893: 
  894: /* ========================================================================= */
  895: int ZEXPORT deflateEnd (strm)
  896:     z_streamp strm;
  897: {
  898:     int status;
  899: 
  900:     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
  901: 
  902:     status = strm->state->status;
  903:     if (status != INIT_STATE &&
  904:         status != EXTRA_STATE &&
  905:         status != NAME_STATE &&
  906:         status != COMMENT_STATE &&
  907:         status != HCRC_STATE &&
  908:         status != BUSY_STATE &&
  909:         status != FINISH_STATE) {
  910:       return Z_STREAM_ERROR;
  911:     }
  912: 
  913:     /* Deallocate in reverse order of allocations: */
  914:     TRY_FREE(strm, strm->state->pending_buf);
  915:     TRY_FREE(strm, strm->state->head);
  916:     TRY_FREE(strm, strm->state->prev);
  917:     TRY_FREE(strm, strm->state->window);
  918: 
  919:     ZFREE(strm, strm->state);
  920:     strm->state = Z_NULL;
  921: 
  922:     return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
  923: }
  924: 
  925: /* =========================================================================
  926:  * Copy the source state to the destination state.
  927:  * To simplify the source, this is not supported for 16-bit MSDOS (which
  928:  * doesn't have enough memory anyway to duplicate compression states).
  929:  */
  930: int ZEXPORT deflateCopy (dest, source)
  931:     z_streamp dest;
  932:     z_streamp source;
  933: {
  934: #ifdef MAXSEG_64K
  935:     return Z_STREAM_ERROR;
  936: #else
  937:     deflate_state *ds;
  938:     deflate_state *ss;
  939:     ushf *overlay;
  940: 
  941: 
  942:     if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
  943:         return Z_STREAM_ERROR;
  944:     }
  945: 
  946:     ss = source->state;
  947: 
  948:     zmemcpy(dest, source, sizeof(z_stream));
  949: 
  950:     ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
  951:     if (ds == Z_NULL) return Z_MEM_ERROR;
  952:     dest->state = (struct internal_state FAR *) ds;
  953:     zmemcpy(ds, ss, sizeof(deflate_state));
  954:     ds->strm = dest;
  955: 
  956:     ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
  957:     ds->prev   = (Posf *)  ZALLOC(dest, ds->w_size, sizeof(Pos));
  958:     ds->head   = (Posf *)  ZALLOC(dest, ds->hash_size, sizeof(Pos));
  959:     overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
  960:     ds->pending_buf = (uchf *) overlay;
  961: 
  962:     if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
  963:         ds->pending_buf == Z_NULL) {
  964:         deflateEnd (dest);
  965:         return Z_MEM_ERROR;
  966:     }
  967:     /* following zmemcpy do not work for 16-bit MSDOS */
  968:     zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
  969:     zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
  970:     zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
  971:     zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
  972: 
  973:     ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
  974:     ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
  975:     ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
  976: 
  977:     ds->l_desc.dyn_tree = ds->dyn_ltree;
  978:     ds->d_desc.dyn_tree = ds->dyn_dtree;
  979:     ds->bl_desc.dyn_tree = ds->bl_tree;
  980: 
  981:     return Z_OK;
  982: #endif /* MAXSEG_64K */
  983: }
  984: 
  985: /* ===========================================================================
  986:  * Read a new buffer from the current input stream, update the adler32
  987:  * and total number of bytes read.  All deflate() input goes through
  988:  * this function so some applications may wish to modify it to avoid
  989:  * allocating a large strm->next_in buffer and copying from it.
  990:  * (See also flush_pending()).
  991:  */
  992: local int read_buf(strm, buf, size)
  993:     z_streamp strm;
  994:     Bytef *buf;
  995:     unsigned size;
  996: {
  997:     unsigned len = strm->avail_in;
  998: 
  999:     if (len > size) len = size;
 1000:     if (len == 0) return 0;
 1001: 
 1002:     strm->avail_in  -= len;
 1003: 
 1004:     if (strm->state->wrap == 1) {
 1005:         strm->adler = adler32(strm->adler, strm->next_in, len);
 1006:     }
 1007: #ifdef GZIP
 1008:     else if (strm->state->wrap == 2) {
 1009:         strm->adler = crc32(strm->adler, strm->next_in, len);
 1010:     }
 1011: #endif
 1012:     zmemcpy(buf, strm->next_in, len);
 1013:     strm->next_in  += len;
 1014:     strm->total_in += len;
 1015: 
 1016:     return (int)len;
 1017: }
 1018: 
 1019: /* ===========================================================================
 1020:  * Initialize the "longest match" routines for a new zlib stream
 1021:  */
 1022: local void lm_init (s)
 1023:     deflate_state *s;
 1024: {
 1025:     s->window_size = (ulg)2L*s->w_size;
 1026: 
 1027:     CLEAR_HASH(s);
 1028: 
 1029:     /* Set the default configuration parameters:
 1030:      */
 1031:     s->max_lazy_match   = configuration_table[s->level].max_lazy;
 1032:     s->good_match       = configuration_table[s->level].good_length;
 1033:     s->nice_match       = configuration_table[s->level].nice_length;
 1034:     s->max_chain_length = configuration_table[s->level].max_chain;
 1035: 
 1036:     s->strstart = 0;
 1037:     s->block_start = 0L;
 1038:     s->lookahead = 0;
 1039:     s->match_length = s->prev_length = MIN_MATCH-1;
 1040:     s->match_available = 0;
 1041:     s->ins_h = 0;
 1042: #ifndef FASTEST
 1043: #ifdef ASMV
 1044:     match_init(); /* initialize the asm code */
 1045: #endif
 1046: #endif
 1047: }
 1048: 
 1049: #ifndef FASTEST
 1050: /* ===========================================================================
 1051:  * Set match_start to the longest match starting at the given string and
 1052:  * return its length. Matches shorter or equal to prev_length are discarded,
 1053:  * in which case the result is equal to prev_length and match_start is
 1054:  * garbage.
 1055:  * IN assertions: cur_match is the head of the hash chain for the current
 1056:  *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
 1057:  * OUT assertion: the match length is not greater than s->lookahead.
 1058:  */
 1059: #ifndef ASMV
 1060: /* For 80x86 and 680x0, an optimized version will be provided in match.asm or
 1061:  * match.S. The code will be functionally equivalent.
 1062:  */
 1063: local uInt longest_match(s, cur_match)
 1064:     deflate_state *s;
 1065:     IPos cur_match;                             /* current match */
 1066: {
 1067:     unsigned chain_length = s->max_chain_length;/* max hash chain length */
 1068:     register Bytef *scan = s->window + s->strstart; /* current string */
 1069:     register Bytef *match;                       /* matched string */
 1070:     register int len;                           /* length of current match */
 1071:     int best_len = s->prev_length;              /* best match length so far */
 1072:     int nice_match = s->nice_match;             /* stop if match long enough */
 1073:     IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
 1074:         s->strstart - (IPos)MAX_DIST(s) : NIL;
 1075:     /* Stop when cur_match becomes <= limit. To simplify the code,
 1076:      * we prevent matches with the string of window index 0.
 1077:      */
 1078:     Posf *prev = s->prev;
 1079:     uInt wmask = s->w_mask;
 1080: 
 1081: #ifdef UNALIGNED_OK
 1082:     /* Compare two bytes at a time. Note: this is not always beneficial.
 1083:      * Try with and without -DUNALIGNED_OK to check.
 1084:      */
 1085:     register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
 1086:     register ush scan_start = *(ushf*)scan;
 1087:     register ush scan_end   = *(ushf*)(scan+best_len-1);
 1088: #else
 1089:     register Bytef *strend = s->window + s->strstart + MAX_MATCH;
 1090:     register Byte scan_end1  = scan[best_len-1];
 1091:     register Byte scan_end   = scan[best_len];
 1092: #endif
 1093: 
 1094:     /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
 1095:      * It is easy to get rid of this optimization if necessary.
 1096:      */
 1097:     Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
 1098: 
 1099:     /* Do not waste too much time if we already have a good match: */
 1100:     if (s->prev_length >= s->good_match) {
 1101:         chain_length >>= 2;
 1102:     }
 1103:     /* Do not look for matches beyond the end of the input. This is necessary
 1104:      * to make deflate deterministic.
 1105:      */
 1106:     if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
 1107: 
 1108:     Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
 1109: 
 1110:     do {
 1111:         Assert(cur_match < s->strstart, "no future");
 1112:         match = s->window + cur_match;
 1113: 
 1114:         /* Skip to next match if the match length cannot increase
 1115:          * or if the match length is less than 2.  Note that the checks below
 1116:          * for insufficient lookahead only occur occasionally for performance
 1117:          * reasons.  Therefore uninitialized memory will be accessed, and
 1118:          * conditional jumps will be made that depend on those values.
 1119:          * However the length of the match is limited to the lookahead, so
 1120:          * the output of deflate is not affected by the uninitialized values.
 1121:          */
 1122: #if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
 1123:         /* This code assumes sizeof(unsigned short) == 2. Do not use
 1124:          * UNALIGNED_OK if your compiler uses a different size.
 1125:          */
 1126:         if (*(ushf*)(match+best_len-1) != scan_end ||
 1127:             *(ushf*)match != scan_start) continue;
 1128: 
 1129:         /* It is not necessary to compare scan[2] and match[2] since they are
 1130:          * always equal when the other bytes match, given that the hash keys
 1131:          * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
 1132:          * strstart+3, +5, ... up to strstart+257. We check for insufficient
 1133:          * lookahead only every 4th comparison; the 128th check will be made
 1134:          * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
 1135:          * necessary to put more guard bytes at the end of the window, or
 1136:          * to check more often for insufficient lookahead.
 1137:          */
 1138:         Assert(scan[2] == match[2], "scan[2]?");
 1139:         scan++, match++;
 1140:         do {
 1141:         } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
 1142:                  *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
 1143:                  *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
 1144:                  *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
 1145:                  scan < strend);
 1146:         /* The funny "do {}" generates better code on most compilers */
 1147: 
 1148:         /* Here, scan <= window+strstart+257 */
 1149:         Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
 1150:         if (*scan == *match) scan++;
 1151: 
 1152:         len = (MAX_MATCH - 1) - (int)(strend-scan);
 1153:         scan = strend - (MAX_MATCH-1);
 1154: 
 1155: #else /* UNALIGNED_OK */
 1156: 
 1157:         if (match[best_len]   != scan_end  ||
 1158:             match[best_len-1] != scan_end1 ||
 1159:             *match            != *scan     ||
 1160:             *++match          != scan[1])      continue;
 1161: 
 1162:         /* The check at best_len-1 can be removed because it will be made
 1163:          * again later. (This heuristic is not always a win.)
 1164:          * It is not necessary to compare scan[2] and match[2] since they
 1165:          * are always equal when the other bytes match, given that
 1166:          * the hash keys are equal and that HASH_BITS >= 8.
 1167:          */
 1168:         scan += 2, match++;
 1169:         Assert(*scan == *match, "match[2]?");
 1170: 
 1171:         /* We check for insufficient lookahead only every 8th comparison;
 1172:          * the 256th check will be made at strstart+258.
 1173:          */
 1174:         do {
 1175:         } while (*++scan == *++match && *++scan == *++match &&
 1176:                  *++scan == *++match && *++scan == *++match &&
 1177:                  *++scan == *++match && *++scan == *++match &&
 1178:                  *++scan == *++match && *++scan == *++match &&
 1179:                  scan < strend);
 1180: 
 1181:         Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
 1182: 
 1183:         len = MAX_MATCH - (int)(strend - scan);
 1184:         scan = strend - MAX_MATCH;
 1185: 
 1186: #endif /* UNALIGNED_OK */
 1187: 
 1188:         if (len > best_len) {
 1189:             s->match_start = cur_match;
 1190:             best_len = len;
 1191:             if (len >= nice_match) break;
 1192: #ifdef UNALIGNED_OK
 1193:             scan_end = *(ushf*)(scan+best_len-1);
 1194: #else
 1195:             scan_end1  = scan[best_len-1];
 1196:             scan_end   = scan[best_len];
 1197: #endif
 1198:         }
 1199:     } while ((cur_match = prev[cur_match & wmask]) > limit
 1200:              && --chain_length != 0);
 1201: 
 1202:     if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
 1203:     return s->lookahead;
 1204: }
 1205: #endif /* ASMV */
 1206: 
 1207: #else /* FASTEST */
 1208: 
 1209: /* ---------------------------------------------------------------------------
 1210:  * Optimized version for FASTEST only
 1211:  */
 1212: local uInt longest_match(s, cur_match)
 1213:     deflate_state *s;
 1214:     IPos cur_match;                             /* current match */
 1215: {
 1216:     register Bytef *scan = s->window + s->strstart; /* current string */
 1217:     register Bytef *match;                       /* matched string */
 1218:     register int len;                           /* length of current match */
 1219:     register Bytef *strend = s->window + s->strstart + MAX_MATCH;
 1220: 
 1221:     /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
 1222:      * It is easy to get rid of this optimization if necessary.
 1223:      */
 1224:     Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
 1225: 
 1226:     Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
 1227: 
 1228:     Assert(cur_match < s->strstart, "no future");
 1229: 
 1230:     match = s->window + cur_match;
 1231: 
 1232:     /* Return failure if the match length is less than 2:
 1233:      */
 1234:     if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
 1235: 
 1236:     /* The check at best_len-1 can be removed because it will be made
 1237:      * again later. (This heuristic is not always a win.)
 1238:      * It is not necessary to compare scan[2] and match[2] since they
 1239:      * are always equal when the other bytes match, given that
 1240:      * the hash keys are equal and that HASH_BITS >= 8.
 1241:      */
 1242:     scan += 2, match += 2;
 1243:     Assert(*scan == *match, "match[2]?");
 1244: 
 1245:     /* We check for insufficient lookahead only every 8th comparison;
 1246:      * the 256th check will be made at strstart+258.
 1247:      */
 1248:     do {
 1249:     } while (*++scan == *++match && *++scan == *++match &&
 1250:              *++scan == *++match && *++scan == *++match &&
 1251:              *++scan == *++match && *++scan == *++match &&
 1252:              *++scan == *++match && *++scan == *++match &&
 1253:              scan < strend);
 1254: 
 1255:     Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
 1256: 
 1257:     len = MAX_MATCH - (int)(strend - scan);
 1258: 
 1259:     if (len < MIN_MATCH) return MIN_MATCH - 1;
 1260: 
 1261:     s->match_start = cur_match;
 1262:     return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;
 1263: }
 1264: 
 1265: #endif /* FASTEST */
 1266: 
 1267: #ifdef DEBUG
 1268: /* ===========================================================================
 1269:  * Check that the match at match_start is indeed a match.
 1270:  */
 1271: local void check_match(s, start, match, length)
 1272:     deflate_state *s;
 1273:     IPos start, match;
 1274:     int length;
 1275: {
 1276:     /* check that the match is indeed a match */
 1277:     if (zmemcmp(s->window + match,
 1278:                 s->window + start, length) != EQUAL) {
 1279:         fprintf(stderr, " start %u, match %u, length %d\n",
 1280:                 start, match, length);
 1281:         do {
 1282:             fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
 1283:         } while (--length != 0);
 1284:         z_error("invalid match");
 1285:     }
 1286:     if (z_verbose > 1) {
 1287:         fprintf(stderr,"\\[%d,%d]", start-match, length);
 1288:         do { putc(s->window[start++], stderr); } while (--length != 0);
 1289:     }
 1290: }
 1291: #else
 1292: #  define check_match(s, start, match, length)
 1293: #endif /* DEBUG */
 1294: 
 1295: /* ===========================================================================
 1296:  * Fill the window when the lookahead becomes insufficient.
 1297:  * Updates strstart and lookahead.
 1298:  *
 1299:  * IN assertion: lookahead < MIN_LOOKAHEAD
 1300:  * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
 1301:  *    At least one byte has been read, or avail_in == 0; reads are
 1302:  *    performed for at least two bytes (required for the zip translate_eol
 1303:  *    option -- not supported here).
 1304:  */
 1305: local void fill_window(s)
 1306:     deflate_state *s;
 1307: {
 1308:     register unsigned n, m;
 1309:     register Posf *p;
 1310:     unsigned more;    /* Amount of free space at the end of the window. */
 1311:     uInt wsize = s->w_size;
 1312: 
 1313:     do {
 1314:         more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
 1315: 
 1316:         /* Deal with !@#$% 64K limit: */
 1317:         if (sizeof(int) <= 2) {
 1318:             if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
 1319:                 more = wsize;
 1320: 
 1321:             } else if (more == (unsigned)(-1)) {
 1322:                 /* Very unlikely, but possible on 16 bit machine if
 1323:                  * strstart == 0 && lookahead == 1 (input done a byte at time)
 1324:                  */
 1325:                 more--;
 1326:             }
 1327:         }
 1328: 
 1329:         /* If the window is almost full and there is insufficient lookahead,
 1330:          * move the upper half to the lower one to make room in the upper half.
 1331:          */
 1332:         if (s->strstart >= wsize+MAX_DIST(s)) {
 1333: 
 1334:             zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
 1335:             s->match_start -= wsize;
 1336:             s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
 1337:             s->block_start -= (long) wsize;
 1338: 
 1339:             /* Slide the hash table (could be avoided with 32 bit values
 1340:                at the expense of memory usage). We slide even when level == 0
 1341:                to keep the hash table consistent if we switch back to level > 0
 1342:                later. (Using level 0 permanently is not an optimal usage of
 1343:                zlib, so we don't care about this pathological case.)
 1344:              */
 1345:             n = s->hash_size;
 1346:             p = &s->head[n];
 1347:             do {
 1348:                 m = *--p;
 1349:                 *p = (Pos)(m >= wsize ? m-wsize : NIL);
 1350:             } while (--n);
 1351: 
 1352:             n = wsize;
 1353: #ifndef FASTEST
 1354:             p = &s->prev[n];
 1355:             do {
 1356:                 m = *--p;
 1357:                 *p = (Pos)(m >= wsize ? m-wsize : NIL);
 1358:                 /* If n is not on any hash chain, prev[n] is garbage but
 1359:                  * its value will never be used.
 1360:                  */
 1361:             } while (--n);
 1362: #endif
 1363:             more += wsize;
 1364:         }
 1365:         if (s->strm->avail_in == 0) return;
 1366: 
 1367:         /* If there was no sliding:
 1368:          *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
 1369:          *    more == window_size - lookahead - strstart
 1370:          * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
 1371:          * => more >= window_size - 2*WSIZE + 2
 1372:          * In the BIG_MEM or MMAP case (not yet supported),
 1373:          *   window_size == input_size + MIN_LOOKAHEAD  &&
 1374:          *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
 1375:          * Otherwise, window_size == 2*WSIZE so more >= 2.
 1376:          * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
 1377:          */
 1378:         Assert(more >= 2, "more < 2");
 1379: 
 1380:         n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
 1381:         s->lookahead += n;
 1382: 
 1383:         /* Initialize the hash value now that we have some input: */
 1384:         if (s->lookahead >= MIN_MATCH) {
 1385:             s->ins_h = s->window[s->strstart];
 1386:             UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
 1387: #if MIN_MATCH != 3
 1388:             Call UPDATE_HASH() MIN_MATCH-3 more times
 1389: #endif
 1390:         }
 1391:         /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
 1392:          * but this is not important since only literal bytes will be emitted.
 1393:          */
 1394: 
 1395:     } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
 1396: 
 1397:     /* If the WIN_INIT bytes after the end of the current data have never been
 1398:      * written, then zero those bytes in order to avoid memory check reports of
 1399:      * the use of uninitialized (or uninitialised as Julian writes) bytes by
 1400:      * the longest match routines.  Update the high water mark for the next
 1401:      * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
 1402:      * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
 1403:      */
 1404:     if (s->high_water < s->window_size) {
 1405:         ulg curr = s->strstart + (ulg)(s->lookahead);
 1406:         ulg init;
 1407: 
 1408:         if (s->high_water < curr) {
 1409:             /* Previous high water mark below current data -- zero WIN_INIT
 1410:              * bytes or up to end of window, whichever is less.
 1411:              */
 1412:             init = s->window_size - curr;
 1413:             if (init > WIN_INIT)
 1414:                 init = WIN_INIT;
 1415:             zmemzero(s->window + curr, (unsigned)init);
 1416:             s->high_water = curr + init;
 1417:         }
 1418:         else if (s->high_water < (ulg)curr + WIN_INIT) {
 1419:             /* High water mark at or above current data, but below current data
 1420:              * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
 1421:              * to end of window, whichever is less.
 1422:              */
 1423:             init = (ulg)curr + WIN_INIT - s->high_water;
 1424:             if (init > s->window_size - s->high_water)
 1425:                 init = s->window_size - s->high_water;
 1426:             zmemzero(s->window + s->high_water, (unsigned)init);
 1427:             s->high_water += init;
 1428:         }
 1429:     }
 1430: }
 1431: 
 1432: /* ===========================================================================
 1433:  * Flush the current block, with given end-of-file flag.
 1434:  * IN assertion: strstart is set to the end of the current match.
 1435:  */
 1436: #define FLUSH_BLOCK_ONLY(s, last) { \
 1437:    _tr_flush_block(s, (s->block_start >= 0L ? \
 1438:                    (charf *)&s->window[(unsigned)s->block_start] : \
 1439:                    (charf *)Z_NULL), \
 1440:                 (ulg)((long)s->strstart - s->block_start), \
 1441:                 (last)); \
 1442:    s->block_start = s->strstart; \
 1443:    flush_pending(s->strm); \
 1444:    Tracev((stderr,"[FLUSH]")); \
 1445: }
 1446: 
 1447: /* Same but force premature exit if necessary. */
 1448: #define FLUSH_BLOCK(s, last) { \
 1449:    FLUSH_BLOCK_ONLY(s, last); \
 1450:    if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
 1451: }
 1452: 
 1453: /* ===========================================================================
 1454:  * Copy without compression as much as possible from the input stream, return
 1455:  * the current block state.
 1456:  * This function does not insert new strings in the dictionary since
 1457:  * uncompressible data is probably not useful. This function is used
 1458:  * only for the level=0 compression option.
 1459:  * NOTE: this function should be optimized to avoid extra copying from
 1460:  * window to pending_buf.
 1461:  */
 1462: local block_state deflate_stored(s, flush)
 1463:     deflate_state *s;
 1464:     int flush;
 1465: {
 1466:     /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
 1467:      * to pending_buf_size, and each stored block has a 5 byte header:
 1468:      */
 1469:     ulg max_block_size = 0xffff;
 1470:     ulg max_start;
 1471: 
 1472:     if (max_block_size > s->pending_buf_size - 5) {
 1473:         max_block_size = s->pending_buf_size - 5;
 1474:     }
 1475: 
 1476:     /* Copy as much as possible from input to output: */
 1477:     for (;;) {
 1478:         /* Fill the window as much as possible: */
 1479:         if (s->lookahead <= 1) {
 1480: 
 1481:             Assert(s->strstart < s->w_size+MAX_DIST(s) ||
 1482:                    s->block_start >= (long)s->w_size, "slide too late");
 1483: 
 1484:             fill_window(s);
 1485:             if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
 1486: 
 1487:             if (s->lookahead == 0) break; /* flush the current block */
 1488:         }
 1489:         Assert(s->block_start >= 0L, "block gone");
 1490: 
 1491:         s->strstart += s->lookahead;
 1492:         s->lookahead = 0;
 1493: 
 1494:         /* Emit a stored block if pending_buf will be full: */
 1495:         max_start = s->block_start + max_block_size;
 1496:         if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
 1497:             /* strstart == 0 is possible when wraparound on 16-bit machine */
 1498:             s->lookahead = (uInt)(s->strstart - max_start);
 1499:             s->strstart = (uInt)max_start;
 1500:             FLUSH_BLOCK(s, 0);
 1501:         }
 1502:         /* Flush if we may have to slide, otherwise block_start may become
 1503:          * negative and the data will be gone:
 1504:          */
 1505:         if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
 1506:             FLUSH_BLOCK(s, 0);
 1507:         }
 1508:     }
 1509:     FLUSH_BLOCK(s, flush == Z_FINISH);
 1510:     return flush == Z_FINISH ? finish_done : block_done;
 1511: }
 1512: 
 1513: /* ===========================================================================
 1514:  * Compress as much as possible from the input stream, return the current
 1515:  * block state.
 1516:  * This function does not perform lazy evaluation of matches and inserts
 1517:  * new strings in the dictionary only for unmatched strings or for short
 1518:  * matches. It is used only for the fast compression options.
 1519:  */
 1520: local block_state deflate_fast(s, flush)
 1521:     deflate_state *s;
 1522:     int flush;
 1523: {
 1524:     IPos hash_head;       /* head of the hash chain */
 1525:     int bflush;           /* set if current block must be flushed */
 1526: 
 1527:     for (;;) {
 1528:         /* Make sure that we always have enough lookahead, except
 1529:          * at the end of the input file. We need MAX_MATCH bytes
 1530:          * for the next match, plus MIN_MATCH bytes to insert the
 1531:          * string following the next match.
 1532:          */
 1533:         if (s->lookahead < MIN_LOOKAHEAD) {
 1534:             fill_window(s);
 1535:             if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
 1536:                 return need_more;
 1537:             }
 1538:             if (s->lookahead == 0) break; /* flush the current block */
 1539:         }
 1540: 
 1541:         /* Insert the string window[strstart .. strstart+2] in the
 1542:          * dictionary, and set hash_head to the head of the hash chain:
 1543:          */
 1544:         hash_head = NIL;
 1545:         if (s->lookahead >= MIN_MATCH) {
 1546:             INSERT_STRING(s, s->strstart, hash_head);
 1547:         }
 1548: 
 1549:         /* Find the longest match, discarding those <= prev_length.
 1550:          * At this point we have always match_length < MIN_MATCH
 1551:          */
 1552:         if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
 1553:             /* To simplify the code, we prevent matches with the string
 1554:              * of window index 0 (in particular we have to avoid a match
 1555:              * of the string with itself at the start of the input file).
 1556:              */
 1557:             s->match_length = longest_match (s, hash_head);
 1558:             /* longest_match() sets match_start */
 1559:         }
 1560:         if (s->match_length >= MIN_MATCH) {
 1561:             check_match(s, s->strstart, s->match_start, s->match_length);
 1562: 
 1563:             _tr_tally_dist(s, s->strstart - s->match_start,
 1564:                            s->match_length - MIN_MATCH, bflush);
 1565: 
 1566:             s->lookahead -= s->match_length;
 1567: 
 1568:             /* Insert new strings in the hash table only if the match length
 1569:              * is not too large. This saves time but degrades compression.
 1570:              */
 1571: #ifndef FASTEST
 1572:             if (s->match_length <= s->max_insert_length &&
 1573:                 s->lookahead >= MIN_MATCH) {
 1574:                 s->match_length--; /* string at strstart already in table */
 1575:                 do {
 1576:                     s->strstart++;
 1577:                     INSERT_STRING(s, s->strstart, hash_head);
 1578:                     /* strstart never exceeds WSIZE-MAX_MATCH, so there are
 1579:                      * always MIN_MATCH bytes ahead.
 1580:                      */
 1581:                 } while (--s->match_length != 0);
 1582:                 s->strstart++;
 1583:             } else
 1584: #endif
 1585:             {
 1586:                 s->strstart += s->match_length;
 1587:                 s->match_length = 0;
 1588:                 s->ins_h = s->window[s->strstart];
 1589:                 UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
 1590: #if MIN_MATCH != 3
 1591:                 Call UPDATE_HASH() MIN_MATCH-3 more times
 1592: #endif
 1593:                 /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
 1594:                  * matter since it will be recomputed at next deflate call.
 1595:                  */
 1596:             }
 1597:         } else {
 1598:             /* No match, output a literal byte */
 1599:             Tracevv((stderr,"%c", s->window[s->strstart]));
 1600:             _tr_tally_lit (s, s->window[s->strstart], bflush);
 1601:             s->lookahead--;
 1602:             s->strstart++;
 1603:         }
 1604:         if (bflush) FLUSH_BLOCK(s, 0);
 1605:     }
 1606:     FLUSH_BLOCK(s, flush == Z_FINISH);
 1607:     return flush == Z_FINISH ? finish_done : block_done;
 1608: }
 1609: 
 1610: #ifndef FASTEST
 1611: /* ===========================================================================
 1612:  * Same as above, but achieves better compression. We use a lazy
 1613:  * evaluation for matches: a match is finally adopted only if there is
 1614:  * no better match at the next window position.
 1615:  */
 1616: local block_state deflate_slow(s, flush)
 1617:     deflate_state *s;
 1618:     int flush;
 1619: {
 1620:     IPos hash_head;          /* head of hash chain */
 1621:     int bflush;              /* set if current block must be flushed */
 1622: 
 1623:     /* Process the input block. */
 1624:     for (;;) {
 1625:         /* Make sure that we always have enough lookahead, except
 1626:          * at the end of the input file. We need MAX_MATCH bytes
 1627:          * for the next match, plus MIN_MATCH bytes to insert the
 1628:          * string following the next match.
 1629:          */
 1630:         if (s->lookahead < MIN_LOOKAHEAD) {
 1631:             fill_window(s);
 1632:             if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
 1633:                 return need_more;
 1634:             }
 1635:             if (s->lookahead == 0) break; /* flush the current block */
 1636:         }
 1637: 
 1638:         /* Insert the string window[strstart .. strstart+2] in the
 1639:          * dictionary, and set hash_head to the head of the hash chain:
 1640:          */
 1641:         hash_head = NIL;
 1642:         if (s->lookahead >= MIN_MATCH) {
 1643:             INSERT_STRING(s, s->strstart, hash_head);
 1644:         }
 1645: 
 1646:         /* Find the longest match, discarding those <= prev_length.
 1647:          */
 1648:         s->prev_length = s->match_length, s->prev_match = s->match_start;
 1649:         s->match_length = MIN_MATCH-1;
 1650: 
 1651:         if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
 1652:             s->strstart - hash_head <= MAX_DIST(s)) {
 1653:             /* To simplify the code, we prevent matches with the string
 1654:              * of window index 0 (in particular we have to avoid a match
 1655:              * of the string with itself at the start of the input file).
 1656:              */
 1657:             s->match_length = longest_match (s, hash_head);
 1658:             /* longest_match() sets match_start */
 1659: 
 1660:             if (s->match_length <= 5 && (s->strategy == Z_FILTERED
 1661: #if TOO_FAR <= 32767
 1662:                 || (s->match_length == MIN_MATCH &&
 1663:                     s->strstart - s->match_start > TOO_FAR)
 1664: #endif
 1665:                 )) {
 1666: 
 1667:                 /* If prev_match is also MIN_MATCH, match_start is garbage
 1668:                  * but we will ignore the current match anyway.
 1669:                  */
 1670:                 s->match_length = MIN_MATCH-1;
 1671:             }
 1672:         }
 1673:         /* If there was a match at the previous step and the current
 1674:          * match is not better, output the previous match:
 1675:          */
 1676:         if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
 1677:             uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
 1678:             /* Do not insert strings in hash table beyond this. */
 1679: 
 1680:             check_match(s, s->strstart-1, s->prev_match, s->prev_length);
 1681: 
 1682:             _tr_tally_dist(s, s->strstart -1 - s->prev_match,
 1683:                            s->prev_length - MIN_MATCH, bflush);
 1684: 
 1685:             /* Insert in hash table all strings up to the end of the match.
 1686:              * strstart-1 and strstart are already inserted. If there is not
 1687:              * enough lookahead, the last two strings are not inserted in
 1688:              * the hash table.
 1689:              */
 1690:             s->lookahead -= s->prev_length-1;
 1691:             s->prev_length -= 2;
 1692:             do {
 1693:                 if (++s->strstart <= max_insert) {
 1694:                     INSERT_STRING(s, s->strstart, hash_head);
 1695:                 }
 1696:             } while (--s->prev_length != 0);
 1697:             s->match_available = 0;
 1698:             s->match_length = MIN_MATCH-1;
 1699:             s->strstart++;
 1700: 
 1701:             if (bflush) FLUSH_BLOCK(s, 0);
 1702: 
 1703:         } else if (s->match_available) {
 1704:             /* If there was no match at the previous position, output a
 1705:              * single literal. If there was a match but the current match
 1706:              * is longer, truncate the previous match to a single literal.
 1707:              */
 1708:             Tracevv((stderr,"%c", s->window[s->strstart-1]));
 1709:             _tr_tally_lit(s, s->window[s->strstart-1], bflush);
 1710:             if (bflush) {
 1711:                 FLUSH_BLOCK_ONLY(s, 0);
 1712:             }
 1713:             s->strstart++;
 1714:             s->lookahead--;
 1715:             if (s->strm->avail_out == 0) return need_more;
 1716:         } else {
 1717:             /* There is no previous match to compare with, wait for
 1718:              * the next step to decide.
 1719:              */
 1720:             s->match_available = 1;
 1721:             s->strstart++;
 1722:             s->lookahead--;
 1723:         }
 1724:     }
 1725:     Assert (flush != Z_NO_FLUSH, "no flush?");
 1726:     if (s->match_available) {
 1727:         Tracevv((stderr,"%c", s->window[s->strstart-1]));
 1728:         _tr_tally_lit(s, s->window[s->strstart-1], bflush);
 1729:         s->match_available = 0;
 1730:     }
 1731:     FLUSH_BLOCK(s, flush == Z_FINISH);
 1732:     return flush == Z_FINISH ? finish_done : block_done;
 1733: }
 1734: #endif /* FASTEST */
 1735: 
 1736: /* ===========================================================================
 1737:  * For Z_RLE, simply look for runs of bytes, generate matches only of distance
 1738:  * one.  Do not maintain a hash table.  (It will be regenerated if this run of
 1739:  * deflate switches away from Z_RLE.)
 1740:  */
 1741: local block_state deflate_rle(s, flush)
 1742:     deflate_state *s;
 1743:     int flush;
 1744: {
 1745:     int bflush;             /* set if current block must be flushed */
 1746:     uInt prev;              /* byte at distance one to match */
 1747:     Bytef *scan, *strend;   /* scan goes up to strend for length of run */
 1748: 
 1749:     for (;;) {
 1750:         /* Make sure that we always have enough lookahead, except
 1751:          * at the end of the input file. We need MAX_MATCH bytes
 1752:          * for the longest encodable run.
 1753:          */
 1754:         if (s->lookahead < MAX_MATCH) {
 1755:             fill_window(s);
 1756:             if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) {
 1757:                 return need_more;
 1758:             }
 1759:             if (s->lookahead == 0) break; /* flush the current block */
 1760:         }
 1761: 
 1762:         /* See how many times the previous byte repeats */
 1763:         s->match_length = 0;
 1764:         if (s->lookahead >= MIN_MATCH && s->strstart > 0) {
 1765:             scan = s->window + s->strstart - 1;
 1766:             prev = *scan;
 1767:             if (prev == *++scan && prev == *++scan && prev == *++scan) {
 1768:                 strend = s->window + s->strstart + MAX_MATCH;
 1769:                 do {
 1770:                 } while (prev == *++scan && prev == *++scan &&
 1771:                          prev == *++scan && prev == *++scan &&
 1772:                          prev == *++scan && prev == *++scan &&
 1773:                          prev == *++scan && prev == *++scan &&
 1774:                          scan < strend);
 1775:                 s->match_length = MAX_MATCH - (int)(strend - scan);
 1776:                 if (s->match_length > s->lookahead)
 1777:                     s->match_length = s->lookahead;
 1778:             }
 1779:         }
 1780: 
 1781:         /* Emit match if have run of MIN_MATCH or longer, else emit literal */
 1782:         if (s->match_length >= MIN_MATCH) {
 1783:             check_match(s, s->strstart, s->strstart - 1, s->match_length);
 1784: 
 1785:             _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
 1786: 
 1787:             s->lookahead -= s->match_length;
 1788:             s->strstart += s->match_length;
 1789:             s->match_length = 0;
 1790:         } else {
 1791:             /* No match, output a literal byte */
 1792:             Tracevv((stderr,"%c", s->window[s->strstart]));
 1793:             _tr_tally_lit (s, s->window[s->strstart], bflush);
 1794:             s->lookahead--;
 1795:             s->strstart++;
 1796:         }
 1797:         if (bflush) FLUSH_BLOCK(s, 0);
 1798:     }
 1799:     FLUSH_BLOCK(s, flush == Z_FINISH);
 1800:     return flush == Z_FINISH ? finish_done : block_done;
 1801: }
 1802: 
 1803: /* ===========================================================================
 1804:  * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
 1805:  * (It will be regenerated if this run of deflate switches away from Huffman.)
 1806:  */
 1807: local block_state deflate_huff(s, flush)
 1808:     deflate_state *s;
 1809:     int flush;
 1810: {
 1811:     int bflush;             /* set if current block must be flushed */
 1812: 
 1813:     for (;;) {
 1814:         /* Make sure that we have a literal to write. */
 1815:         if (s->lookahead == 0) {
 1816:             fill_window(s);
 1817:             if (s->lookahead == 0) {
 1818:                 if (flush == Z_NO_FLUSH)
 1819:                     return need_more;
 1820:                 break;      /* flush the current block */
 1821:             }
 1822:         }
 1823: 
 1824:         /* Output a literal byte */
 1825:         s->match_length = 0;
 1826:         Tracevv((stderr,"%c", s->window[s->strstart]));
 1827:         _tr_tally_lit (s, s->window[s->strstart], bflush);
 1828:         s->lookahead--;
 1829:         s->strstart++;
 1830:         if (bflush) FLUSH_BLOCK(s, 0);
 1831:     }
 1832:     FLUSH_BLOCK(s, flush == Z_FINISH);
 1833:     return flush == Z_FINISH ? finish_done : block_done;
 1834: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>