| #ifndef INSERT_STRING_H_ | |
| #define INSERT_STRING_H_ | |
| /* insert_string.h -- Private insert_string functions shared with more than | |
| * one insert string implementation | |
| * | |
| * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler | |
| * | |
| * Copyright (C) 2013 Intel Corporation. All rights reserved. | |
| * Authors: | |
| * Wajdi Feghali <[email protected]> | |
| * Jim Guilford <[email protected]> | |
| * Vinodh Gopal <[email protected]> | |
| * Erdinc Ozturk <[email protected]> | |
| * Jim Kukunas <[email protected]> | |
| * | |
| * Portions are Copyright (C) 2016 12Sided Technology, LLC. | |
| * Author: | |
| * Phil Vachon <[email protected]> | |
| * | |
| * For conditions of distribution and use, see copyright notice in zlib.h | |
| * | |
| */ | |
| #ifndef HASH_CALC_OFFSET | |
| # define HASH_CALC_OFFSET 0 | |
| #endif | |
| #ifndef HASH_CALC_MASK | |
| # define HASH_CALC_MASK HASH_MASK | |
| #endif | |
| #ifndef HASH_CALC_READ | |
| # if BYTE_ORDER == LITTLE_ENDIAN | |
| # define HASH_CALC_READ \ | |
| zmemcpy_4(&val, strstart); | |
| # else | |
| # define HASH_CALC_READ \ | |
| val = ((uint32_t)(strstart[0])); \ | |
| val |= ((uint32_t)(strstart[1]) << 8); \ | |
| val |= ((uint32_t)(strstart[2]) << 16); \ | |
| val |= ((uint32_t)(strstart[3]) << 24); | |
| # endif | |
| #endif | |
| /* =========================================================================== | |
| * Update a hash value with the given input byte | |
| * IN assertion: all calls to to UPDATE_HASH are made with consecutive | |
| * input characters, so that a running hash key can be computed from the | |
| * previous key instead of complete recalculation each time. | |
| */ | |
| Z_INTERNAL uint32_t UPDATE_HASH(deflate_state *const s, uint32_t h, uint32_t val) { | |
| (void)s; | |
| HASH_CALC(s, h, val); | |
| return h & HASH_CALC_MASK; | |
| } | |
| /* =========================================================================== | |
| * Quick insert string str in the dictionary and set match_head to the previous head | |
| * of the hash chain (the most recent string with same hash key). Return | |
| * the previous length of the hash chain. | |
| */ | |
| Z_INTERNAL Pos QUICK_INSERT_STRING(deflate_state *const s, uint32_t str) { | |
| Pos head; | |
| uint8_t *strstart = s->window + str + HASH_CALC_OFFSET; | |
| uint32_t val, hm; | |
| HASH_CALC_VAR_INIT; | |
| HASH_CALC_READ; | |
| HASH_CALC(s, HASH_CALC_VAR, val); | |
| HASH_CALC_VAR &= HASH_CALC_MASK; | |
| hm = HASH_CALC_VAR; | |
| head = s->head[hm]; | |
| if (LIKELY(head != str)) { | |
| s->prev[str & s->w_mask] = head; | |
| s->head[hm] = (Pos)str; | |
| } | |
| return head; | |
| } | |
| /* =========================================================================== | |
| * Insert string str in the dictionary and set match_head to the previous head | |
| * of the hash chain (the most recent string with same hash key). Return | |
| * the previous length of the hash chain. | |
| * IN assertion: all calls to to INSERT_STRING are made with consecutive | |
| * input characters and the first STD_MIN_MATCH bytes of str are valid | |
| * (except for the last STD_MIN_MATCH-1 bytes of the input file). | |
| */ | |
| Z_INTERNAL void INSERT_STRING(deflate_state *const s, uint32_t str, uint32_t count) { | |
| uint8_t *strstart = s->window + str + HASH_CALC_OFFSET; | |
| uint8_t *strend = strstart + count; | |
| for (Pos idx = (Pos)str; strstart < strend; idx++, strstart++) { | |
| uint32_t val, hm; | |
| HASH_CALC_VAR_INIT; | |
| HASH_CALC_READ; | |
| HASH_CALC(s, HASH_CALC_VAR, val); | |
| HASH_CALC_VAR &= HASH_CALC_MASK; | |
| hm = HASH_CALC_VAR; | |
| Pos head = s->head[hm]; | |
| if (LIKELY(head != idx)) { | |
| s->prev[idx & s->w_mask] = head; | |
| s->head[hm] = idx; | |
| } | |
| } | |
| } | |
| #endif |