4 * Fast searching for repeat offset matches.
9 * The author dedicates this file to the public domain.
10 * You can do whatever you want with this file.
13 #ifndef _LZ_REPSEARCH_H
14 #define _LZ_REPSEARCH_H
16 #include "wimlib/lz_extend.h"
17 #include "wimlib/unaligned.h"
20 lz_extend_repmatch(const u8 *strptr, const u8 *matchptr, u32 max_len);
23 * Given a pointer to the current string and a queue of 3 recent match offsets,
24 * find the longest repeat offset match.
26 * If no match of at least 2 bytes is found, then return 0.
28 * If a match of at least 2 bytes is found, then return its length and set
29 * *rep_max_idx_ret to the index of its offset in @recent_offsets.
32 lz_repsearch3(const u8 * const strptr, const u32 max_len,
33 const u32 recent_offsets[3], unsigned *rep_max_idx_ret)
38 const u16 str = load_u16_unaligned(strptr);
41 matchptr = strptr - recent_offsets[0];
42 if (load_u16_unaligned(matchptr) == str)
43 rep_max_len = lz_extend_repmatch(strptr, matchptr, max_len);
48 matchptr = strptr - recent_offsets[1];
49 if (load_u16_unaligned(matchptr) == str) {
50 rep_len = lz_extend_repmatch(strptr, matchptr, max_len);
51 if (rep_len > rep_max_len) {
52 rep_max_len = rep_len;
57 matchptr = strptr - recent_offsets[2];
58 if (load_u16_unaligned(matchptr) == str) {
59 rep_len = lz_extend_repmatch(strptr, matchptr, max_len);
60 if (rep_len > rep_max_len) {
61 rep_max_len = rep_len;
66 *rep_max_idx_ret = rep_max_idx;
70 #endif /* _LZ_REPSEARCH_H */