lzma_encoder_optimum_fast.c   lzma_encoder_optimum_fast.c 
skipping to change at line 13 skipping to change at line 13
/// \file lzma_encoder_optimum_fast.c /// \file lzma_encoder_optimum_fast.c
// //
// Author: Igor Pavlov // Author: Igor Pavlov
// //
// This file has been put into the public domain. // This file has been put into the public domain.
// You can do whatever you want with this file. // You can do whatever you want with this file.
// //
/////////////////////////////////////////////////////////////////////////// //// /////////////////////////////////////////////////////////////////////////// ////
#include "lzma_encoder_private.h" #include "lzma_encoder_private.h"
#include "memcmplen.h"
#define change_pair(small_dist, big_dist) \ #define change_pair(small_dist, big_dist) \
(((big_dist) >> 7) > (small_dist)) (((big_dist) >> 7) > (small_dist))
extern void extern void
lzma_lzma_optimum_fast(lzma_coder *restrict coder, lzma_mf *restrict mf, lzma_lzma_optimum_fast(lzma_coder *restrict coder, lzma_mf *restrict mf,
uint32_t *restrict back_res, uint32_t *restrict len_res) uint32_t *restrict back_res, uint32_t *restrict len_res)
{ {
const uint32_t nice_len = mf->nice_len; const uint32_t nice_len = mf->nice_len;
skipping to change at line 58 skipping to change at line 59
// Pointer to the beginning of the match candidate // Pointer to the beginning of the match candidate
const uint8_t *const buf_back = buf - coder->reps[i] - 1; const uint8_t *const buf_back = buf - coder->reps[i] - 1;
// If the first two bytes (2 == MATCH_LEN_MIN) do not match, // If the first two bytes (2 == MATCH_LEN_MIN) do not match,
// this rep is not useful. // this rep is not useful.
if (not_equal_16(buf, buf_back)) if (not_equal_16(buf, buf_back))
continue; continue;
// The first two bytes matched. // The first two bytes matched.
// Calculate the length of the match. // Calculate the length of the match.
uint32_t len; const uint32_t len = lzma_memcmplen(
for (len = 2; len < buf_avail buf, buf_back, 2, buf_avail);
&& buf[len] == buf_back[len]; ++len) ;
// If we have found a repeated match that is at least // If we have found a repeated match that is at least
// nice_len long, return it immediately. // nice_len long, return it immediately.
if (len >= nice_len) { if (len >= nice_len) {
*back_res = i; *back_res = i;
*len_res = len; *len_res = len;
mf_skip(mf, len - 1); mf_skip(mf, len - 1);
return; return;
} }
skipping to change at line 156 skipping to change at line 156
} }
// In contrast to LZMA SDK, dictionary could not have been moved // In contrast to LZMA SDK, dictionary could not have been moved
// between mf_find() calls, thus it is safe to just increment // between mf_find() calls, thus it is safe to just increment
// the old buf pointer instead of recalculating it with mf_ptr(). // the old buf pointer instead of recalculating it with mf_ptr().
++buf; ++buf;
const uint32_t limit = len_main - 1; const uint32_t limit = len_main - 1;
for (uint32_t i = 0; i < REPS; ++i) { for (uint32_t i = 0; i < REPS; ++i) {
const uint8_t *const buf_back = buf - coder->reps[i] - 1; if (memcmp(buf, buf - coder->reps[i] - 1, limit) == 0) {
if (not_equal_16(buf, buf_back))
continue;
uint32_t len;
for (len = 2; len < limit
&& buf[len] == buf_back[len]; ++len) ;
if (len >= limit) {
*back_res = UINT32_MAX; *back_res = UINT32_MAX;
*len_res = 1; *len_res = 1;
return; return;
} }
} }
*back_res = back_main + REPS; *back_res = back_main + REPS;
*len_res = len_main; *len_res = len_main;
mf_skip(mf, len_main - 2); mf_skip(mf, len_main - 2);
return; return;
 End of changes. 3 change blocks. 
13 lines changed or deleted 4 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/