(root)/
xz-5.4.5/
src/
liblzma/
rangecoder/
price_tablegen.c
       1  ///////////////////////////////////////////////////////////////////////////////
       2  //
       3  /// \file       price_tablegen.c
       4  /// \brief      Probability price table generator
       5  ///
       6  /// Compiling: gcc -std=c99 -o price_tablegen price_tablegen.c
       7  ///
       8  //  Authors:    Igor Pavlov
       9  //              Lasse Collin
      10  //
      11  //  This file has been put into the public domain.
      12  //  You can do whatever you want with this file.
      13  //
      14  ///////////////////////////////////////////////////////////////////////////////
      15  
      16  #include <inttypes.h>
      17  #include <stdio.h>
      18  #include "range_common.h"
      19  #include "price.h"
      20  
      21  
      22  static uint32_t rc_prices[RC_PRICE_TABLE_SIZE];
      23  
      24  
      25  static void
      26  init_price_table(void)
      27  {
      28  	for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2;
      29  			i < RC_BIT_MODEL_TOTAL;
      30  			i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) {
      31  		const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS;
      32  		uint32_t w = i;
      33  		uint32_t bit_count = 0;
      34  
      35  		for (uint32_t j = 0; j < cycles_bits; ++j) {
      36  			w *= w;
      37  			bit_count <<= 1;
      38  
      39  			while (w >= (UINT32_C(1) << 16)) {
      40  				w >>= 1;
      41  				++bit_count;
      42  			}
      43  		}
      44  
      45  		rc_prices[i >> RC_MOVE_REDUCING_BITS]
      46  				= (RC_BIT_MODEL_TOTAL_BITS << cycles_bits)
      47  				- 15 - bit_count;
      48  	}
      49  
      50  	return;
      51  }
      52  
      53  
      54  static void
      55  print_price_table(void)
      56  {
      57  	printf("/* This file has been automatically generated by "
      58  			"price_tablegen.c. */\n\n"
      59  			"#include \"range_encoder.h\"\n\n"
      60  			"const uint8_t lzma_rc_prices["
      61  			"RC_PRICE_TABLE_SIZE] = {");
      62  
      63  	const size_t array_size = sizeof(lzma_rc_prices)
      64  			/ sizeof(lzma_rc_prices[0]);
      65  	for (size_t i = 0; i < array_size; ++i) {
      66  		if (i % 8 == 0)
      67  			printf("\n\t");
      68  
      69  		printf("%4" PRIu32, rc_prices[i]);
      70  
      71  		if (i != array_size - 1)
      72  			printf(",");
      73  	}
      74  
      75  	printf("\n};\n");
      76  
      77  	return;
      78  }
      79  
      80  
      81  int
      82  main(void)
      83  {
      84  	init_price_table();
      85  	print_price_table();
      86  	return 0;
      87  }