lzma1 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/utils.js ADDED
@@ -0,0 +1,300 @@
1
+ // Constants for 64-bit arithmetic
2
+ const MAX_UINT32 = 0x100000000;
3
+ const MAX_INT32 = 0x7FFFFFFF;
4
+ const MIN_INT32 = -0x80000000;
5
+ // Additional LZMA constants
6
+ export const INFINITY_PRICE = 0xFFFFFFF;
7
+ export const _MAX_UINT32 = 0xFFFFFFFF;
8
+ export const DICTIONARY_SIZE_THRESHOLD = 0x3FFFFFFF;
9
+ // Range coder constants
10
+ export const kTopValue = 1 << 24;
11
+ export const kNumBitModelTotalBits = 11;
12
+ export const kBitModelTotal = 1 << kNumBitModelTotalBits;
13
+ export const kNumMoveBits = 5;
14
+ export const kNumMoveReducingBits = 2;
15
+ export const kNumBitPriceShiftBits = 6;
16
+ // Common array sizes used throughout LZMA implementation
17
+ export const MATCH_DECODERS_SIZE = 0xC0; // 192
18
+ export const REP_DECODERS_SIZE = 12;
19
+ export const POS_DECODERS_SIZE = 114;
20
+ export const LITERAL_DECODER_SIZE = 0x300; // 768
21
+ export const DEFAULT_WINDOW_SIZE = 0x1000; // 4096
22
+ export const CHOICE_ARRAY_SIZE = 2;
23
+ // Special 64-bit number constants
24
+ export const N1_LONG_LIT = [0xFFFFFFFF, -MAX_UINT32];
25
+ export const MIN_VALUE = [0, -0x8000000000000000];
26
+ export const P0_LONG_LIT = [0, 0];
27
+ export const P1_LONG_LIT = [1, 0];
28
+ export const ZERO_64 = [0, 0];
29
+ /**
30
+ * CRC32 lookup table for hash calculations
31
+ * dprint-ignore
32
+ */
33
+ export const CRC32_TABLE = [
34
+ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
35
+ 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
36
+ 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
37
+ 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
38
+ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
39
+ 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
40
+ 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
41
+ 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
42
+ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
43
+ 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
44
+ 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
45
+ 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
46
+ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
47
+ 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
48
+ 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
49
+ 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
50
+ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
51
+ 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
52
+ 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
53
+ 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
54
+ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
55
+ 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
56
+ 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
57
+ 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
58
+ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
59
+ 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
60
+ 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
61
+ 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
62
+ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
63
+ 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
64
+ 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
65
+ 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
66
+ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
67
+ 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
68
+ 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
69
+ 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
70
+ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
71
+ 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
72
+ 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
73
+ 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
74
+ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
75
+ 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
76
+ 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
77
+ ];
78
+ /**
79
+ * Pre-computed static instances for common use
80
+ */
81
+ export const PROB_PRICES = createProbPrices();
82
+ export const G_FAST_POS = createFastPos();
83
+ /**
84
+ * Initialize array with specified length and default value
85
+ * This is MUCH faster than "new Array(len)" in newer versions of v8
86
+ * (starting with Node.js 0.11.15, which uses v8 3.28.73).
87
+ */
88
+ export function initArray(len, value = 0) {
89
+ const array = [];
90
+ // Pre-allocate array by setting the last index
91
+ array[len - 1] = undefined;
92
+ // Fill with specified value if needed
93
+ if (value !== 0) {
94
+ for (let i = 0; i < len; i++) {
95
+ array[i] = value;
96
+ }
97
+ }
98
+ return array;
99
+ }
100
+ /**
101
+ * Copy array data with bounds checking and overlap handling
102
+ */
103
+ export function arraycopy(src, srcOfs, dest, destOfs, len) {
104
+ // Bounds checking
105
+ if (srcOfs < 0
106
+ || destOfs < 0
107
+ || len < 0
108
+ || srcOfs + len > src.length
109
+ || destOfs + len > dest.length) {
110
+ return;
111
+ }
112
+ if (src === dest
113
+ && srcOfs < destOfs
114
+ && destOfs < srcOfs + len) {
115
+ // Overlapping regions - copy backwards
116
+ for (let i = len - 1; i >= 0; i--) {
117
+ dest[destOfs + i] = src[srcOfs + i];
118
+ }
119
+ }
120
+ else {
121
+ // Non-overlapping or safe regions - copy forward
122
+ for (let i = 0; i < len; i++) {
123
+ dest[destOfs + i] = src[srcOfs + i];
124
+ }
125
+ }
126
+ }
127
+ /**
128
+ * Get bit price using pre-computed probability prices
129
+ */
130
+ export function getBitPrice(probability, bit) {
131
+ return PROB_PRICES[((probability - bit ^ -bit) & 2047) >>> 2];
132
+ }
133
+ /**
134
+ * Create a 64-bit number from low and high parts
135
+ */
136
+ export function create64(valueLow, valueHigh) {
137
+ let diffHigh, diffLow;
138
+ valueHigh %= 1.8446744073709552E19;
139
+ valueLow %= 1.8446744073709552E19;
140
+ diffHigh = valueHigh % MAX_UINT32;
141
+ diffLow = Math.floor(valueLow / MAX_UINT32) * MAX_UINT32;
142
+ valueHigh = valueHigh - diffHigh + diffLow;
143
+ valueLow = valueLow - diffLow + diffHigh;
144
+ while (valueLow < 0) {
145
+ valueLow += MAX_UINT32;
146
+ valueHigh -= MAX_UINT32;
147
+ }
148
+ while (valueLow > 0xFFFFFFFF) {
149
+ valueLow -= MAX_UINT32;
150
+ valueHigh += MAX_UINT32;
151
+ }
152
+ valueHigh = valueHigh % 1.8446744073709552E19;
153
+ while (valueHigh > 9223372032559808512) {
154
+ valueHigh -= 1.8446744073709552E19;
155
+ }
156
+ while (valueHigh < -9223372036854775808) {
157
+ valueHigh += 1.8446744073709552E19;
158
+ }
159
+ return [valueLow, valueHigh];
160
+ }
161
+ /**
162
+ * Add two 64-bit numbers
163
+ */
164
+ export function add64(a, b) {
165
+ return create64(a[0] + b[0], a[1] + b[1]);
166
+ }
167
+ /**
168
+ * Subtract two 64-bit numbers
169
+ */
170
+ export function sub64(a, b) {
171
+ return create64(a[0] - b[0], a[1] - b[1]);
172
+ }
173
+ /**
174
+ * Compare two 64-bit numbers
175
+ */
176
+ export function compare64(a, b) {
177
+ if (a[0] == b[0] && a[1] == b[1]) {
178
+ return 0;
179
+ }
180
+ const nega = a[1] < 0;
181
+ const negb = b[1] < 0;
182
+ if (nega && !negb) {
183
+ return -1;
184
+ }
185
+ if (!nega && negb) {
186
+ return 1;
187
+ }
188
+ if (sub64(a, b)[1] < 0) {
189
+ return -1;
190
+ }
191
+ return 1;
192
+ }
193
+ /**
194
+ * Extract low bits from 64-bit number
195
+ */
196
+ export function lowBits64(a) {
197
+ if (a[0] >= 0x80000000) {
198
+ return ~~Math.max(Math.min(a[0] - MAX_UINT32, MAX_INT32), MIN_INT32);
199
+ }
200
+ return ~~Math.max(Math.min(a[0], MAX_INT32), MIN_INT32);
201
+ }
202
+ /**
203
+ * Create 64-bit number from integer
204
+ */
205
+ export function fromInt64(value) {
206
+ if (value >= 0) {
207
+ return [value, 0];
208
+ }
209
+ else {
210
+ return [value + MAX_UINT32, -MAX_UINT32];
211
+ }
212
+ }
213
+ /**
214
+ * Right shift 64-bit number
215
+ */
216
+ export function shr64(a, n) {
217
+ n &= 0x3F;
218
+ if (n <= 0x1E) {
219
+ const shiftFact = 1 << n;
220
+ return create64(Math.floor(a[0] / shiftFact), a[1] / shiftFact);
221
+ }
222
+ const shiftFact = (1 << 0x1E) * (1 << (n - 0x1E));
223
+ return create64(Math.floor(a[0] / shiftFact), a[1] / shiftFact);
224
+ }
225
+ /**
226
+ * Bit model operations
227
+ */
228
+ /**
229
+ * Initialize bit models with default probability
230
+ */
231
+ export function initBitModels(probs) {
232
+ for (let i = probs.length - 1; i >= 0; --i) {
233
+ probs[i] = 1024;
234
+ }
235
+ }
236
+ /**
237
+ * Position and state operations
238
+ */
239
+ /**
240
+ * Get length to position state mapping
241
+ */
242
+ export function getLenToPosState(len) {
243
+ len -= 2;
244
+ if (len < 4) {
245
+ return len;
246
+ }
247
+ return 3;
248
+ }
249
+ /**
250
+ * Update state after character encoding/decoding
251
+ */
252
+ export function stateUpdateChar(index) {
253
+ if (index < 4) {
254
+ return 0;
255
+ }
256
+ if (index < 10) {
257
+ return index - 3;
258
+ }
259
+ return index - 6;
260
+ }
261
+ /**
262
+ * Bit tree operations
263
+ */
264
+ /**
265
+ * Create a bit tree with specified number of bit levels
266
+ */
267
+ export function createBitTree(numBitLevels) {
268
+ return {
269
+ numBitLevels: numBitLevels,
270
+ models: initArray(1 << numBitLevels),
271
+ };
272
+ }
273
+ /**
274
+ * Create probability prices lookup table
275
+ */
276
+ export function createProbPrices() {
277
+ const probPrices = [];
278
+ for (let i = 8; i >= 0; --i) {
279
+ let start = 1 << (9 - i - 1);
280
+ let end = 1 << (9 - i);
281
+ for (let j = start; j < end; ++j) {
282
+ probPrices[j] = (i << 6) + ((end - j) << 6 >>> (9 - i - 1));
283
+ }
284
+ }
285
+ return probPrices;
286
+ }
287
+ /**
288
+ * Create fast position lookup table
289
+ */
290
+ export function createFastPos() {
291
+ const gFastPos = [0, 1];
292
+ let c = 2;
293
+ for (let slotFast = 2; slotFast < 22; ++slotFast) {
294
+ let k = 1 << ((slotFast >> 1) - 1);
295
+ for (let j = 0; j < k; ++j, ++c) {
296
+ gFastPos[c] = slotFast;
297
+ }
298
+ }
299
+ return gFastPos;
300
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lzma1",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.2.0",
5
5
  "license": "MIT",
6
6
  "author": "Filip Seman <filip.seman@pm.me>",
7
7
  "description": "A JavaScript implementation of the Lempel-Ziv-Markov (LZMA) chain compression algorithm",
@@ -22,8 +22,8 @@
22
22
  "fmt": "dprint fmt",
23
23
  "fmt:check": "dprint check",
24
24
  "typecheck": "tsc --noEmit",
25
- "test": "bun test --coverage lzma.test.ts",
26
- "test:watch": "bun test --watch lzma.test.ts"
25
+ "test": "bun test --coverage --coverage-reporter=text --coverage-reporter=lcov ./src/lzma.test.ts",
26
+ "test:watch": "bun test --watch ./src/lzma.test.ts"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/bun": "^1.2.18",