(root)/
xz-5.4.5/
src/
liblzma/
lzma/
lzma_encoder_optimum_normal.c
       1  ///////////////////////////////////////////////////////////////////////////////
       2  //
       3  /// \file       lzma_encoder_optimum_normal.c
       4  //
       5  //  Author:     Igor Pavlov
       6  //
       7  //  This file has been put into the public domain.
       8  //  You can do whatever you want with this file.
       9  //
      10  ///////////////////////////////////////////////////////////////////////////////
      11  
      12  #include "lzma_encoder_private.h"
      13  #include "fastpos.h"
      14  #include "memcmplen.h"
      15  
      16  
      17  ////////////
      18  // Prices //
      19  ////////////
      20  
      21  static uint32_t
      22  get_literal_price(const lzma_lzma1_encoder *const coder, const uint32_t pos,
      23  		const uint32_t prev_byte, const bool match_mode,
      24  		uint32_t match_byte, uint32_t symbol)
      25  {
      26  	const probability *const subcoder = literal_subcoder(coder->literal,
      27  			coder->literal_context_bits, coder->literal_pos_mask,
      28  			pos, prev_byte);
      29  
      30  	uint32_t price = 0;
      31  
      32  	if (!match_mode) {
      33  		price = rc_bittree_price(subcoder, 8, symbol);
      34  	} else {
      35  		uint32_t offset = 0x100;
      36  		symbol += UINT32_C(1) << 8;
      37  
      38  		do {
      39  			match_byte <<= 1;
      40  
      41  			const uint32_t match_bit = match_byte & offset;
      42  			const uint32_t subcoder_index
      43  					= offset + match_bit + (symbol >> 8);
      44  			const uint32_t bit = (symbol >> 7) & 1;
      45  			price += rc_bit_price(subcoder[subcoder_index], bit);
      46  
      47  			symbol <<= 1;
      48  			offset &= ~(match_byte ^ symbol);
      49  
      50  		} while (symbol < (UINT32_C(1) << 16));
      51  	}
      52  
      53  	return price;
      54  }
      55  
      56  
      57  static inline uint32_t
      58  get_len_price(const lzma_length_encoder *const lencoder,
      59  		const uint32_t len, const uint32_t pos_state)
      60  {
      61  	// NOTE: Unlike the other price tables, length prices are updated
      62  	// in lzma_encoder.c
      63  	return lencoder->prices[pos_state][len - MATCH_LEN_MIN];
      64  }
      65  
      66  
      67  static inline uint32_t
      68  get_short_rep_price(const lzma_lzma1_encoder *const coder,
      69  		const lzma_lzma_state state, const uint32_t pos_state)
      70  {
      71  	return rc_bit_0_price(coder->is_rep0[state])
      72  		+ rc_bit_0_price(coder->is_rep0_long[state][pos_state]);
      73  }
      74  
      75  
      76  static inline uint32_t
      77  get_pure_rep_price(const lzma_lzma1_encoder *const coder, const uint32_t rep_index,
      78  		const lzma_lzma_state state, uint32_t pos_state)
      79  {
      80  	uint32_t price;
      81  
      82  	if (rep_index == 0) {
      83  		price = rc_bit_0_price(coder->is_rep0[state]);
      84  		price += rc_bit_1_price(coder->is_rep0_long[state][pos_state]);
      85  	} else {
      86  		price = rc_bit_1_price(coder->is_rep0[state]);
      87  
      88  		if (rep_index == 1) {
      89  			price += rc_bit_0_price(coder->is_rep1[state]);
      90  		} else {
      91  			price += rc_bit_1_price(coder->is_rep1[state]);
      92  			price += rc_bit_price(coder->is_rep2[state],
      93  					rep_index - 2);
      94  		}
      95  	}
      96  
      97  	return price;
      98  }
      99  
     100  
     101  static inline uint32_t
     102  get_rep_price(const lzma_lzma1_encoder *const coder, const uint32_t rep_index,
     103  		const uint32_t len, const lzma_lzma_state state,
     104  		const uint32_t pos_state)
     105  {
     106  	return get_len_price(&coder->rep_len_encoder, len, pos_state)
     107  		+ get_pure_rep_price(coder, rep_index, state, pos_state);
     108  }
     109  
     110  
     111  static inline uint32_t
     112  get_dist_len_price(const lzma_lzma1_encoder *const coder, const uint32_t dist,
     113  		const uint32_t len, const uint32_t pos_state)
     114  {
     115  	const uint32_t dist_state = get_dist_state(len);
     116  	uint32_t price;
     117  
     118  	if (dist < FULL_DISTANCES) {
     119  		price = coder->dist_prices[dist_state][dist];
     120  	} else {
     121  		const uint32_t dist_slot = get_dist_slot_2(dist);
     122  		price = coder->dist_slot_prices[dist_state][dist_slot]
     123  				+ coder->align_prices[dist & ALIGN_MASK];
     124  	}
     125  
     126  	price += get_len_price(&coder->match_len_encoder, len, pos_state);
     127  
     128  	return price;
     129  }
     130  
     131  
     132  static void
     133  fill_dist_prices(lzma_lzma1_encoder *coder)
     134  {
     135  	for (uint32_t dist_state = 0; dist_state < DIST_STATES; ++dist_state) {
     136  
     137  		uint32_t *const dist_slot_prices
     138  				= coder->dist_slot_prices[dist_state];
     139  
     140  		// Price to encode the dist_slot.
     141  		for (uint32_t dist_slot = 0;
     142  				dist_slot < coder->dist_table_size; ++dist_slot)
     143  			dist_slot_prices[dist_slot] = rc_bittree_price(
     144  					coder->dist_slot[dist_state],
     145  					DIST_SLOT_BITS, dist_slot);
     146  
     147  		// For matches with distance >= FULL_DISTANCES, add the price
     148  		// of the direct bits part of the match distance. (Align bits
     149  		// are handled by fill_align_prices()).
     150  		for (uint32_t dist_slot = DIST_MODEL_END;
     151  				dist_slot < coder->dist_table_size;
     152  				++dist_slot)
     153  			dist_slot_prices[dist_slot] += rc_direct_price(
     154  					((dist_slot >> 1) - 1) - ALIGN_BITS);
     155  
     156  		// Distances in the range [0, 3] are fully encoded with
     157  		// dist_slot, so they are used for coder->dist_prices
     158  		// as is.
     159  		for (uint32_t i = 0; i < DIST_MODEL_START; ++i)
     160  			coder->dist_prices[dist_state][i]
     161  					= dist_slot_prices[i];
     162  	}
     163  
     164  	// Distances in the range [4, 127] depend on dist_slot and
     165  	// dist_special. We do this in a loop separate from the above
     166  	// loop to avoid redundant calls to get_dist_slot().
     167  	for (uint32_t i = DIST_MODEL_START; i < FULL_DISTANCES; ++i) {
     168  		const uint32_t dist_slot = get_dist_slot(i);
     169  		const uint32_t footer_bits = ((dist_slot >> 1) - 1);
     170  		const uint32_t base = (2 | (dist_slot & 1)) << footer_bits;
     171  		const uint32_t price = rc_bittree_reverse_price(
     172  				coder->dist_special + base - dist_slot - 1,
     173  				footer_bits, i - base);
     174  
     175  		for (uint32_t dist_state = 0; dist_state < DIST_STATES;
     176  				++dist_state)
     177  			coder->dist_prices[dist_state][i]
     178  					= price + coder->dist_slot_prices[
     179  						dist_state][dist_slot];
     180  	}
     181  
     182  	coder->match_price_count = 0;
     183  	return;
     184  }
     185  
     186  
     187  static void
     188  fill_align_prices(lzma_lzma1_encoder *coder)
     189  {
     190  	for (uint32_t i = 0; i < ALIGN_SIZE; ++i)
     191  		coder->align_prices[i] = rc_bittree_reverse_price(
     192  				coder->dist_align, ALIGN_BITS, i);
     193  
     194  	coder->align_price_count = 0;
     195  	return;
     196  }
     197  
     198  
     199  /////////////
     200  // Optimal //
     201  /////////////
     202  
     203  static inline void
     204  make_literal(lzma_optimal *optimal)
     205  {
     206  	optimal->back_prev = UINT32_MAX;
     207  	optimal->prev_1_is_literal = false;
     208  }
     209  
     210  
     211  static inline void
     212  make_short_rep(lzma_optimal *optimal)
     213  {
     214  	optimal->back_prev = 0;
     215  	optimal->prev_1_is_literal = false;
     216  }
     217  
     218  
     219  #define is_short_rep(optimal) \
     220  	((optimal).back_prev == 0)
     221  
     222  
     223  static void
     224  backward(lzma_lzma1_encoder *restrict coder, uint32_t *restrict len_res,
     225  		uint32_t *restrict back_res, uint32_t cur)
     226  {
     227  	coder->opts_end_index = cur;
     228  
     229  	uint32_t pos_mem = coder->opts[cur].pos_prev;
     230  	uint32_t back_mem = coder->opts[cur].back_prev;
     231  
     232  	do {
     233  		if (coder->opts[cur].prev_1_is_literal) {
     234  			make_literal(&coder->opts[pos_mem]);
     235  			coder->opts[pos_mem].pos_prev = pos_mem - 1;
     236  
     237  			if (coder->opts[cur].prev_2) {
     238  				coder->opts[pos_mem - 1].prev_1_is_literal
     239  						= false;
     240  				coder->opts[pos_mem - 1].pos_prev
     241  						= coder->opts[cur].pos_prev_2;
     242  				coder->opts[pos_mem - 1].back_prev
     243  						= coder->opts[cur].back_prev_2;
     244  			}
     245  		}
     246  
     247  		const uint32_t pos_prev = pos_mem;
     248  		const uint32_t back_cur = back_mem;
     249  
     250  		back_mem = coder->opts[pos_prev].back_prev;
     251  		pos_mem = coder->opts[pos_prev].pos_prev;
     252  
     253  		coder->opts[pos_prev].back_prev = back_cur;
     254  		coder->opts[pos_prev].pos_prev = cur;
     255  		cur = pos_prev;
     256  
     257  	} while (cur != 0);
     258  
     259  	coder->opts_current_index = coder->opts[0].pos_prev;
     260  	*len_res = coder->opts[0].pos_prev;
     261  	*back_res = coder->opts[0].back_prev;
     262  
     263  	return;
     264  }
     265  
     266  
     267  //////////
     268  // Main //
     269  //////////
     270  
     271  static inline uint32_t
     272  helper1(lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf,
     273  		uint32_t *restrict back_res, uint32_t *restrict len_res,
     274  		uint32_t position)
     275  {
     276  	const uint32_t nice_len = mf->nice_len;
     277  
     278  	uint32_t len_main;
     279  	uint32_t matches_count;
     280  
     281  	if (mf->read_ahead == 0) {
     282  		len_main = mf_find(mf, &matches_count, coder->matches);
     283  	} else {
     284  		assert(mf->read_ahead == 1);
     285  		len_main = coder->longest_match_length;
     286  		matches_count = coder->matches_count;
     287  	}
     288  
     289  	const uint32_t buf_avail = my_min(mf_avail(mf) + 1, MATCH_LEN_MAX);
     290  	if (buf_avail < 2) {
     291  		*back_res = UINT32_MAX;
     292  		*len_res = 1;
     293  		return UINT32_MAX;
     294  	}
     295  
     296  	const uint8_t *const buf = mf_ptr(mf) - 1;
     297  
     298  	uint32_t rep_lens[REPS];
     299  	uint32_t rep_max_index = 0;
     300  
     301  	for (uint32_t i = 0; i < REPS; ++i) {
     302  		const uint8_t *const buf_back = buf - coder->reps[i] - 1;
     303  
     304  		if (not_equal_16(buf, buf_back)) {
     305  			rep_lens[i] = 0;
     306  			continue;
     307  		}
     308  
     309  		rep_lens[i] = lzma_memcmplen(buf, buf_back, 2, buf_avail);
     310  
     311  		if (rep_lens[i] > rep_lens[rep_max_index])
     312  			rep_max_index = i;
     313  	}
     314  
     315  	if (rep_lens[rep_max_index] >= nice_len) {
     316  		*back_res = rep_max_index;
     317  		*len_res = rep_lens[rep_max_index];
     318  		mf_skip(mf, *len_res - 1);
     319  		return UINT32_MAX;
     320  	}
     321  
     322  
     323  	if (len_main >= nice_len) {
     324  		*back_res = coder->matches[matches_count - 1].dist + REPS;
     325  		*len_res = len_main;
     326  		mf_skip(mf, len_main - 1);
     327  		return UINT32_MAX;
     328  	}
     329  
     330  	const uint8_t current_byte = *buf;
     331  	const uint8_t match_byte = *(buf - coder->reps[0] - 1);
     332  
     333  	if (len_main < 2 && current_byte != match_byte
     334  			&& rep_lens[rep_max_index] < 2) {
     335  		*back_res = UINT32_MAX;
     336  		*len_res = 1;
     337  		return UINT32_MAX;
     338  	}
     339  
     340  	coder->opts[0].state = coder->state;
     341  
     342  	const uint32_t pos_state = position & coder->pos_mask;
     343  
     344  	coder->opts[1].price = rc_bit_0_price(
     345  				coder->is_match[coder->state][pos_state])
     346  			+ get_literal_price(coder, position, buf[-1],
     347  				!is_literal_state(coder->state),
     348  				match_byte, current_byte);
     349  
     350  	make_literal(&coder->opts[1]);
     351  
     352  	const uint32_t match_price = rc_bit_1_price(
     353  			coder->is_match[coder->state][pos_state]);
     354  	const uint32_t rep_match_price = match_price
     355  			+ rc_bit_1_price(coder->is_rep[coder->state]);
     356  
     357  	if (match_byte == current_byte) {
     358  		const uint32_t short_rep_price = rep_match_price
     359  				+ get_short_rep_price(
     360  					coder, coder->state, pos_state);
     361  
     362  		if (short_rep_price < coder->opts[1].price) {
     363  			coder->opts[1].price = short_rep_price;
     364  			make_short_rep(&coder->opts[1]);
     365  		}
     366  	}
     367  
     368  	const uint32_t len_end = my_max(len_main, rep_lens[rep_max_index]);
     369  
     370  	if (len_end < 2) {
     371  		*back_res = coder->opts[1].back_prev;
     372  		*len_res = 1;
     373  		return UINT32_MAX;
     374  	}
     375  
     376  	coder->opts[1].pos_prev = 0;
     377  
     378  	for (uint32_t i = 0; i < REPS; ++i)
     379  		coder->opts[0].backs[i] = coder->reps[i];
     380  
     381  	uint32_t len = len_end;
     382  	do {
     383  		coder->opts[len].price = RC_INFINITY_PRICE;
     384  	} while (--len >= 2);
     385  
     386  
     387  	for (uint32_t i = 0; i < REPS; ++i) {
     388  		uint32_t rep_len = rep_lens[i];
     389  		if (rep_len < 2)
     390  			continue;
     391  
     392  		const uint32_t price = rep_match_price + get_pure_rep_price(
     393  				coder, i, coder->state, pos_state);
     394  
     395  		do {
     396  			const uint32_t cur_and_len_price = price
     397  					+ get_len_price(
     398  						&coder->rep_len_encoder,
     399  						rep_len, pos_state);
     400  
     401  			if (cur_and_len_price < coder->opts[rep_len].price) {
     402  				coder->opts[rep_len].price = cur_and_len_price;
     403  				coder->opts[rep_len].pos_prev = 0;
     404  				coder->opts[rep_len].back_prev = i;
     405  				coder->opts[rep_len].prev_1_is_literal = false;
     406  			}
     407  		} while (--rep_len >= 2);
     408  	}
     409  
     410  
     411  	const uint32_t normal_match_price = match_price
     412  			+ rc_bit_0_price(coder->is_rep[coder->state]);
     413  
     414  	len = rep_lens[0] >= 2 ? rep_lens[0] + 1 : 2;
     415  	if (len <= len_main) {
     416  		uint32_t i = 0;
     417  		while (len > coder->matches[i].len)
     418  			++i;
     419  
     420  		for(; ; ++len) {
     421  			const uint32_t dist = coder->matches[i].dist;
     422  			const uint32_t cur_and_len_price = normal_match_price
     423  					+ get_dist_len_price(coder,
     424  						dist, len, pos_state);
     425  
     426  			if (cur_and_len_price < coder->opts[len].price) {
     427  				coder->opts[len].price = cur_and_len_price;
     428  				coder->opts[len].pos_prev = 0;
     429  				coder->opts[len].back_prev = dist + REPS;
     430  				coder->opts[len].prev_1_is_literal = false;
     431  			}
     432  
     433  			if (len == coder->matches[i].len)
     434  				if (++i == matches_count)
     435  					break;
     436  		}
     437  	}
     438  
     439  	return len_end;
     440  }
     441  
     442  
     443  static inline uint32_t
     444  helper2(lzma_lzma1_encoder *coder, uint32_t *reps, const uint8_t *buf,
     445  		uint32_t len_end, uint32_t position, const uint32_t cur,
     446  		const uint32_t nice_len, const uint32_t buf_avail_full)
     447  {
     448  	uint32_t matches_count = coder->matches_count;
     449  	uint32_t new_len = coder->longest_match_length;
     450  	uint32_t pos_prev = coder->opts[cur].pos_prev;
     451  	lzma_lzma_state state;
     452  
     453  	if (coder->opts[cur].prev_1_is_literal) {
     454  		--pos_prev;
     455  
     456  		if (coder->opts[cur].prev_2) {
     457  			state = coder->opts[coder->opts[cur].pos_prev_2].state;
     458  
     459  			if (coder->opts[cur].back_prev_2 < REPS)
     460  				update_long_rep(state);
     461  			else
     462  				update_match(state);
     463  
     464  		} else {
     465  			state = coder->opts[pos_prev].state;
     466  		}
     467  
     468  		update_literal(state);
     469  
     470  	} else {
     471  		state = coder->opts[pos_prev].state;
     472  	}
     473  
     474  	if (pos_prev == cur - 1) {
     475  		if (is_short_rep(coder->opts[cur]))
     476  			update_short_rep(state);
     477  		else
     478  			update_literal(state);
     479  	} else {
     480  		uint32_t pos;
     481  		if (coder->opts[cur].prev_1_is_literal
     482  				&& coder->opts[cur].prev_2) {
     483  			pos_prev = coder->opts[cur].pos_prev_2;
     484  			pos = coder->opts[cur].back_prev_2;
     485  			update_long_rep(state);
     486  		} else {
     487  			pos = coder->opts[cur].back_prev;
     488  			if (pos < REPS)
     489  				update_long_rep(state);
     490  			else
     491  				update_match(state);
     492  		}
     493  
     494  		if (pos < REPS) {
     495  			reps[0] = coder->opts[pos_prev].backs[pos];
     496  
     497  			uint32_t i;
     498  			for (i = 1; i <= pos; ++i)
     499  				reps[i] = coder->opts[pos_prev].backs[i - 1];
     500  
     501  			for (; i < REPS; ++i)
     502  				reps[i] = coder->opts[pos_prev].backs[i];
     503  
     504  		} else {
     505  			reps[0] = pos - REPS;
     506  
     507  			for (uint32_t i = 1; i < REPS; ++i)
     508  				reps[i] = coder->opts[pos_prev].backs[i - 1];
     509  		}
     510  	}
     511  
     512  	coder->opts[cur].state = state;
     513  
     514  	for (uint32_t i = 0; i < REPS; ++i)
     515  		coder->opts[cur].backs[i] = reps[i];
     516  
     517  	const uint32_t cur_price = coder->opts[cur].price;
     518  
     519  	const uint8_t current_byte = *buf;
     520  	const uint8_t match_byte = *(buf - reps[0] - 1);
     521  
     522  	const uint32_t pos_state = position & coder->pos_mask;
     523  
     524  	const uint32_t cur_and_1_price = cur_price
     525  			+ rc_bit_0_price(coder->is_match[state][pos_state])
     526  			+ get_literal_price(coder, position, buf[-1],
     527  			!is_literal_state(state), match_byte, current_byte);
     528  
     529  	bool next_is_literal = false;
     530  
     531  	if (cur_and_1_price < coder->opts[cur + 1].price) {
     532  		coder->opts[cur + 1].price = cur_and_1_price;
     533  		coder->opts[cur + 1].pos_prev = cur;
     534  		make_literal(&coder->opts[cur + 1]);
     535  		next_is_literal = true;
     536  	}
     537  
     538  	const uint32_t match_price = cur_price
     539  			+ rc_bit_1_price(coder->is_match[state][pos_state]);
     540  	const uint32_t rep_match_price = match_price
     541  			+ rc_bit_1_price(coder->is_rep[state]);
     542  
     543  	if (match_byte == current_byte
     544  			&& !(coder->opts[cur + 1].pos_prev < cur
     545  				&& coder->opts[cur + 1].back_prev == 0)) {
     546  
     547  		const uint32_t short_rep_price = rep_match_price
     548  				+ get_short_rep_price(coder, state, pos_state);
     549  
     550  		if (short_rep_price <= coder->opts[cur + 1].price) {
     551  			coder->opts[cur + 1].price = short_rep_price;
     552  			coder->opts[cur + 1].pos_prev = cur;
     553  			make_short_rep(&coder->opts[cur + 1]);
     554  			next_is_literal = true;
     555  		}
     556  	}
     557  
     558  	if (buf_avail_full < 2)
     559  		return len_end;
     560  
     561  	const uint32_t buf_avail = my_min(buf_avail_full, nice_len);
     562  
     563  	if (!next_is_literal && match_byte != current_byte) { // speed optimization
     564  		// try literal + rep0
     565  		const uint8_t *const buf_back = buf - reps[0] - 1;
     566  		const uint32_t limit = my_min(buf_avail_full, nice_len + 1);
     567  
     568  		const uint32_t len_test = lzma_memcmplen(buf, buf_back, 1, limit) - 1;
     569  
     570  		if (len_test >= 2) {
     571  			lzma_lzma_state state_2 = state;
     572  			update_literal(state_2);
     573  
     574  			const uint32_t pos_state_next = (position + 1) & coder->pos_mask;
     575  			const uint32_t next_rep_match_price = cur_and_1_price
     576  					+ rc_bit_1_price(coder->is_match[state_2][pos_state_next])
     577  					+ rc_bit_1_price(coder->is_rep[state_2]);
     578  
     579  			//for (; len_test >= 2; --len_test) {
     580  			const uint32_t offset = cur + 1 + len_test;
     581  
     582  			while (len_end < offset)
     583  				coder->opts[++len_end].price = RC_INFINITY_PRICE;
     584  
     585  			const uint32_t cur_and_len_price = next_rep_match_price
     586  					+ get_rep_price(coder, 0, len_test,
     587  						state_2, pos_state_next);
     588  
     589  			if (cur_and_len_price < coder->opts[offset].price) {
     590  				coder->opts[offset].price = cur_and_len_price;
     591  				coder->opts[offset].pos_prev = cur + 1;
     592  				coder->opts[offset].back_prev = 0;
     593  				coder->opts[offset].prev_1_is_literal = true;
     594  				coder->opts[offset].prev_2 = false;
     595  			}
     596  			//}
     597  		}
     598  	}
     599  
     600  
     601  	uint32_t start_len = 2; // speed optimization
     602  
     603  	for (uint32_t rep_index = 0; rep_index < REPS; ++rep_index) {
     604  		const uint8_t *const buf_back = buf - reps[rep_index] - 1;
     605  		if (not_equal_16(buf, buf_back))
     606  			continue;
     607  
     608  		uint32_t len_test = lzma_memcmplen(buf, buf_back, 2, buf_avail);
     609  
     610  		while (len_end < cur + len_test)
     611  			coder->opts[++len_end].price = RC_INFINITY_PRICE;
     612  
     613  		const uint32_t len_test_temp = len_test;
     614  		const uint32_t price = rep_match_price + get_pure_rep_price(
     615  				coder, rep_index, state, pos_state);
     616  
     617  		do {
     618  			const uint32_t cur_and_len_price = price
     619  					+ get_len_price(&coder->rep_len_encoder,
     620  							len_test, pos_state);
     621  
     622  			if (cur_and_len_price < coder->opts[cur + len_test].price) {
     623  				coder->opts[cur + len_test].price = cur_and_len_price;
     624  				coder->opts[cur + len_test].pos_prev = cur;
     625  				coder->opts[cur + len_test].back_prev = rep_index;
     626  				coder->opts[cur + len_test].prev_1_is_literal = false;
     627  			}
     628  		} while (--len_test >= 2);
     629  
     630  		len_test = len_test_temp;
     631  
     632  		if (rep_index == 0)
     633  			start_len = len_test + 1;
     634  
     635  
     636  		uint32_t len_test_2 = len_test + 1;
     637  		const uint32_t limit = my_min(buf_avail_full,
     638  				len_test_2 + nice_len);
     639  		// NOTE: len_test_2 may be greater than limit so the call to
     640  		// lzma_memcmplen() must be done conditionally.
     641  		if (len_test_2 < limit)
     642  			len_test_2 = lzma_memcmplen(buf, buf_back, len_test_2, limit);
     643  
     644  		len_test_2 -= len_test + 1;
     645  
     646  		if (len_test_2 >= 2) {
     647  			lzma_lzma_state state_2 = state;
     648  			update_long_rep(state_2);
     649  
     650  			uint32_t pos_state_next = (position + len_test) & coder->pos_mask;
     651  
     652  			const uint32_t cur_and_len_literal_price = price
     653  					+ get_len_price(&coder->rep_len_encoder,
     654  						len_test, pos_state)
     655  					+ rc_bit_0_price(coder->is_match[state_2][pos_state_next])
     656  					+ get_literal_price(coder, position + len_test,
     657  						buf[len_test - 1], true,
     658  						buf_back[len_test], buf[len_test]);
     659  
     660  			update_literal(state_2);
     661  
     662  			pos_state_next = (position + len_test + 1) & coder->pos_mask;
     663  
     664  			const uint32_t next_rep_match_price = cur_and_len_literal_price
     665  					+ rc_bit_1_price(coder->is_match[state_2][pos_state_next])
     666  					+ rc_bit_1_price(coder->is_rep[state_2]);
     667  
     668  			//for(; len_test_2 >= 2; len_test_2--) {
     669  			const uint32_t offset = cur + len_test + 1 + len_test_2;
     670  
     671  			while (len_end < offset)
     672  				coder->opts[++len_end].price = RC_INFINITY_PRICE;
     673  
     674  			const uint32_t cur_and_len_price = next_rep_match_price
     675  					+ get_rep_price(coder, 0, len_test_2,
     676  						state_2, pos_state_next);
     677  
     678  			if (cur_and_len_price < coder->opts[offset].price) {
     679  				coder->opts[offset].price = cur_and_len_price;
     680  				coder->opts[offset].pos_prev = cur + len_test + 1;
     681  				coder->opts[offset].back_prev = 0;
     682  				coder->opts[offset].prev_1_is_literal = true;
     683  				coder->opts[offset].prev_2 = true;
     684  				coder->opts[offset].pos_prev_2 = cur;
     685  				coder->opts[offset].back_prev_2 = rep_index;
     686  			}
     687  			//}
     688  		}
     689  	}
     690  
     691  
     692  	//for (uint32_t len_test = 2; len_test <= new_len; ++len_test)
     693  	if (new_len > buf_avail) {
     694  		new_len = buf_avail;
     695  
     696  		matches_count = 0;
     697  		while (new_len > coder->matches[matches_count].len)
     698  			++matches_count;
     699  
     700  		coder->matches[matches_count++].len = new_len;
     701  	}
     702  
     703  
     704  	if (new_len >= start_len) {
     705  		const uint32_t normal_match_price = match_price
     706  				+ rc_bit_0_price(coder->is_rep[state]);
     707  
     708  		while (len_end < cur + new_len)
     709  			coder->opts[++len_end].price = RC_INFINITY_PRICE;
     710  
     711  		uint32_t i = 0;
     712  		while (start_len > coder->matches[i].len)
     713  			++i;
     714  
     715  		for (uint32_t len_test = start_len; ; ++len_test) {
     716  			const uint32_t cur_back = coder->matches[i].dist;
     717  			uint32_t cur_and_len_price = normal_match_price
     718  					+ get_dist_len_price(coder,
     719  						cur_back, len_test, pos_state);
     720  
     721  			if (cur_and_len_price < coder->opts[cur + len_test].price) {
     722  				coder->opts[cur + len_test].price = cur_and_len_price;
     723  				coder->opts[cur + len_test].pos_prev = cur;
     724  				coder->opts[cur + len_test].back_prev
     725  						= cur_back + REPS;
     726  				coder->opts[cur + len_test].prev_1_is_literal = false;
     727  			}
     728  
     729  			if (len_test == coder->matches[i].len) {
     730  				// Try Match + Literal + Rep0
     731  				const uint8_t *const buf_back = buf - cur_back - 1;
     732  				uint32_t len_test_2 = len_test + 1;
     733  				const uint32_t limit = my_min(buf_avail_full,
     734  						len_test_2 + nice_len);
     735  
     736  				// NOTE: len_test_2 may be greater than limit
     737  				// so the call to lzma_memcmplen() must be
     738  				// done conditionally.
     739  				if (len_test_2 < limit)
     740  					len_test_2 = lzma_memcmplen(buf, buf_back,
     741  							len_test_2, limit);
     742  
     743  				len_test_2 -= len_test + 1;
     744  
     745  				if (len_test_2 >= 2) {
     746  					lzma_lzma_state state_2 = state;
     747  					update_match(state_2);
     748  					uint32_t pos_state_next
     749  							= (position + len_test) & coder->pos_mask;
     750  
     751  					const uint32_t cur_and_len_literal_price = cur_and_len_price
     752  							+ rc_bit_0_price(
     753  								coder->is_match[state_2][pos_state_next])
     754  							+ get_literal_price(coder,
     755  								position + len_test,
     756  								buf[len_test - 1],
     757  								true,
     758  								buf_back[len_test],
     759  								buf[len_test]);
     760  
     761  					update_literal(state_2);
     762  					pos_state_next = (pos_state_next + 1) & coder->pos_mask;
     763  
     764  					const uint32_t next_rep_match_price
     765  							= cur_and_len_literal_price
     766  							+ rc_bit_1_price(
     767  								coder->is_match[state_2][pos_state_next])
     768  							+ rc_bit_1_price(coder->is_rep[state_2]);
     769  
     770  					// for(; len_test_2 >= 2; --len_test_2) {
     771  					const uint32_t offset = cur + len_test + 1 + len_test_2;
     772  
     773  					while (len_end < offset)
     774  						coder->opts[++len_end].price = RC_INFINITY_PRICE;
     775  
     776  					cur_and_len_price = next_rep_match_price
     777  							+ get_rep_price(coder, 0, len_test_2,
     778  								state_2, pos_state_next);
     779  
     780  					if (cur_and_len_price < coder->opts[offset].price) {
     781  						coder->opts[offset].price = cur_and_len_price;
     782  						coder->opts[offset].pos_prev = cur + len_test + 1;
     783  						coder->opts[offset].back_prev = 0;
     784  						coder->opts[offset].prev_1_is_literal = true;
     785  						coder->opts[offset].prev_2 = true;
     786  						coder->opts[offset].pos_prev_2 = cur;
     787  						coder->opts[offset].back_prev_2
     788  								= cur_back + REPS;
     789  					}
     790  					//}
     791  				}
     792  
     793  				if (++i == matches_count)
     794  					break;
     795  			}
     796  		}
     797  	}
     798  
     799  	return len_end;
     800  }
     801  
     802  
     803  extern void
     804  lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder,
     805  		lzma_mf *restrict mf,
     806  		uint32_t *restrict back_res, uint32_t *restrict len_res,
     807  		uint32_t position)
     808  {
     809  	// If we have symbols pending, return the next pending symbol.
     810  	if (coder->opts_end_index != coder->opts_current_index) {
     811  		assert(mf->read_ahead > 0);
     812  		*len_res = coder->opts[coder->opts_current_index].pos_prev
     813  				- coder->opts_current_index;
     814  		*back_res = coder->opts[coder->opts_current_index].back_prev;
     815  		coder->opts_current_index = coder->opts[
     816  				coder->opts_current_index].pos_prev;
     817  		return;
     818  	}
     819  
     820  	// Update the price tables. In LZMA SDK <= 4.60 (and possibly later)
     821  	// this was done in both initialization function and in the main loop.
     822  	// In liblzma they were moved into this single place.
     823  	if (mf->read_ahead == 0) {
     824  		if (coder->match_price_count >= (1 << 7))
     825  			fill_dist_prices(coder);
     826  
     827  		if (coder->align_price_count >= ALIGN_SIZE)
     828  			fill_align_prices(coder);
     829  	}
     830  
     831  	// TODO: This needs quite a bit of cleaning still. But splitting
     832  	// the original function into two pieces makes it at least a little
     833  	// more readable, since those two parts don't share many variables.
     834  
     835  	uint32_t len_end = helper1(coder, mf, back_res, len_res, position);
     836  	if (len_end == UINT32_MAX)
     837  		return;
     838  
     839  	uint32_t reps[REPS];
     840  	memcpy(reps, coder->reps, sizeof(reps));
     841  
     842  	uint32_t cur;
     843  	for (cur = 1; cur < len_end; ++cur) {
     844  		assert(cur < OPTS);
     845  
     846  		coder->longest_match_length = mf_find(
     847  				mf, &coder->matches_count, coder->matches);
     848  
     849  		if (coder->longest_match_length >= mf->nice_len)
     850  			break;
     851  
     852  		len_end = helper2(coder, reps, mf_ptr(mf) - 1, len_end,
     853  				position + cur, cur, mf->nice_len,
     854  				my_min(mf_avail(mf) + 1, OPTS - 1 - cur));
     855  	}
     856  
     857  	backward(coder, len_res, back_res, cur);
     858  	return;
     859  }