Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Kitware
GitHub Repository: Kitware/CMake
Path: blob/master/Utilities/cmliblzma/liblzma/rangecoder/price_tablegen.c
3156 views
1
// SPDX-License-Identifier: 0BSD
2
3
///////////////////////////////////////////////////////////////////////////////
4
//
5
/// \file price_tablegen.c
6
/// \brief Probability price table generator
7
///
8
/// Compiling: gcc -std=c99 -o price_tablegen price_tablegen.c
9
///
10
// Authors: Igor Pavlov
11
// Lasse Collin
12
//
13
///////////////////////////////////////////////////////////////////////////////
14
15
#include <inttypes.h>
16
#include <stdio.h>
17
18
// Make it compile without common.h.
19
#define BUILDING_PRICE_TABLEGEN
20
#define lzma_attr_visibility_hidden
21
22
#include "range_common.h"
23
#include "price.h"
24
25
26
static uint32_t rc_prices[RC_PRICE_TABLE_SIZE];
27
28
29
static void
30
init_price_table(void)
31
{
32
for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2;
33
i < RC_BIT_MODEL_TOTAL;
34
i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) {
35
const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS;
36
uint32_t w = i;
37
uint32_t bit_count = 0;
38
39
for (uint32_t j = 0; j < cycles_bits; ++j) {
40
w *= w;
41
bit_count <<= 1;
42
43
while (w >= (UINT32_C(1) << 16)) {
44
w >>= 1;
45
++bit_count;
46
}
47
}
48
49
rc_prices[i >> RC_MOVE_REDUCING_BITS]
50
= (RC_BIT_MODEL_TOTAL_BITS << cycles_bits)
51
- 15 - bit_count;
52
}
53
54
return;
55
}
56
57
58
static void
59
print_price_table(void)
60
{
61
// Split the SPDX string so that it won't accidentally match
62
// when tools search for the string.
63
printf("// SPDX" "-License-Identifier" ": 0BSD\n\n"
64
"// This file has been generated by price_tablegen.c.\n\n"
65
"#include \"range_encoder.h\"\n\n"
66
"const uint8_t lzma_rc_prices["
67
"RC_PRICE_TABLE_SIZE] = {");
68
69
const size_t array_size = sizeof(lzma_rc_prices)
70
/ sizeof(lzma_rc_prices[0]);
71
for (size_t i = 0; i < array_size; ++i) {
72
if (i % 8 == 0)
73
printf("\n\t");
74
75
printf("%4" PRIu32, rc_prices[i]);
76
77
if (i != array_size - 1)
78
printf(",");
79
}
80
81
printf("\n};\n");
82
83
return;
84
}
85
86
87
int
88
main(void)
89
{
90
init_price_table();
91
print_price_table();
92
return 0;
93
}
94
95