1 #ifndef INSERT_STRING_H_
2 #define INSERT_STRING_H_
3
4 /* insert_string.h -- Private insert_string functions shared with more than
5 * one insert string implementation
6 *
7 * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
8 *
9 * Copyright (C) 2013 Intel Corporation. All rights reserved.
10 * Authors:
11 * Wajdi Feghali <wajdi.k.feghali@intel.com>
12 * Jim Guilford <james.guilford@intel.com>
13 * Vinodh Gopal <vinodh.gopal@intel.com>
14 * Erdinc Ozturk <erdinc.ozturk@intel.com>
15 * Jim Kukunas <james.t.kukunas@linux.intel.com>
16 *
17 * Portions are Copyright (C) 2016 12Sided Technology, LLC.
18 * Author:
19 * Phil Vachon <pvachon@12sidedtech.com>
20 *
21 * For conditions of distribution and use, see copyright notice in zlib.h
22 *
23 */
24
25 /* ===========================================================================
26 * Quick insert string str in the dictionary and set match_head to the previous head
27 * of the hash chain (the most recent string with same hash key). Return
28 * the previous length of the hash chain.
29 */
QUICK_INSERT_STRING(deflate_state * const s,const uint32_t str)30 Z_INTERNAL Pos QUICK_INSERT_STRING(deflate_state *const s, const uint32_t str) {
31 Pos head;
32 uint8_t *strstart = s->window + str;
33 uint32_t val, hm, h = 0;
34
35 #ifdef UNALIGNED_OK
36 val = *(uint32_t *)(strstart);
37 #else
38 val = ((uint32_t)(strstart[0]));
39 val |= ((uint32_t)(strstart[1]) << 8);
40 val |= ((uint32_t)(strstart[2]) << 16);
41 val |= ((uint32_t)(strstart[3]) << 24);
42 #endif
43
44 UPDATE_HASH(s, h, val);
45 hm = h & HASH_MASK;
46
47 head = s->head[hm];
48 if (LIKELY(head != str)) {
49 s->prev[str & s->w_mask] = head;
50 s->head[hm] = str;
51 }
52 return head;
53 }
54
55 /* ===========================================================================
56 * Insert string str in the dictionary and set match_head to the previous head
57 * of the hash chain (the most recent string with same hash key). Return
58 * the previous length of the hash chain.
59 * IN assertion: all calls to to INSERT_STRING are made with consecutive
60 * input characters and the first MIN_MATCH bytes of str are valid
61 * (except for the last MIN_MATCH-1 bytes of the input file).
62 */
INSERT_STRING(deflate_state * const s,const uint32_t str,uint32_t count)63 Z_INTERNAL void INSERT_STRING(deflate_state *const s, const uint32_t str, uint32_t count) {
64 uint8_t *strstart = s->window + str;
65 uint8_t *strend = strstart + count - 1; /* last position */
66
67 for (Pos idx = str; strstart <= strend; idx++, strstart++) {
68 uint32_t val, hm, h = 0;
69
70 #ifdef UNALIGNED_OK
71 val = *(uint32_t *)(strstart);
72 #else
73 val = ((uint32_t)(strstart[0]));
74 val |= ((uint32_t)(strstart[1]) << 8);
75 val |= ((uint32_t)(strstart[2]) << 16);
76 val |= ((uint32_t)(strstart[3]) << 24);
77 #endif
78
79 UPDATE_HASH(s, h, val);
80 hm = h & HASH_MASK;
81
82 Pos head = s->head[hm];
83 if (LIKELY(head != idx)) {
84 s->prev[idx & s->w_mask] = head;
85 s->head[hm] = idx;
86 }
87 }
88 }
89 #endif
90