chmlib-ts 0.1.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/COPYING +510 -0
- package/README.md +126 -0
- package/dist/buffer-reader.d.ts +25 -0
- package/dist/buffer-reader.d.ts.map +1 -0
- package/dist/buffer-reader.js +96 -0
- package/dist/buffer-reader.js.map +1 -0
- package/dist/chm-file.d.ts +60 -0
- package/dist/chm-file.d.ts.map +1 -0
- package/dist/chm-file.js +404 -0
- package/dist/chm-file.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +214 -0
- package/dist/cli.js.map +1 -0
- package/dist/headers.d.ts +8 -0
- package/dist/headers.d.ts.map +1 -0
- package/dist/headers.js +164 -0
- package/dist/headers.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lzx.d.ts +40 -0
- package/dist/lzx.d.ts.map +1 -0
- package/dist/lzx.js +571 -0
- package/dist/lzx.js.map +1 -0
- package/dist/reader.d.ts +13 -0
- package/dist/reader.d.ts.map +1 -0
- package/dist/reader.js +41 -0
- package/dist/reader.js.map +1 -0
- package/dist/system.d.ts +18 -0
- package/dist/system.d.ts.map +1 -0
- package/dist/system.js +69 -0
- package/dist/system.js.map +1 -0
- package/dist/toc.d.ts +14 -0
- package/dist/toc.d.ts.map +1 -0
- package/dist/toc.js +138 -0
- package/dist/toc.js.map +1 -0
- package/dist/types.d.ts +73 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
package/dist/lzx.js
ADDED
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LZX decompression engine.
|
|
3
|
+
* Port of lzx.c from chmlib by Jed Wing (originally from cabextract by Stuart Caie).
|
|
4
|
+
*
|
|
5
|
+
* LZX is a variant of LZ77 with Huffman coding, used inside CHM files.
|
|
6
|
+
*/
|
|
7
|
+
// LZX constants
|
|
8
|
+
const LZX_MIN_MATCH = 2;
|
|
9
|
+
const LZX_NUM_CHARS = 256;
|
|
10
|
+
const LZX_BLOCKTYPE_VERBATIM = 1;
|
|
11
|
+
const LZX_BLOCKTYPE_ALIGNED = 2;
|
|
12
|
+
const LZX_BLOCKTYPE_UNCOMPRESSED = 3;
|
|
13
|
+
const LZX_PRETREE_NUM_ELEMENTS = 20;
|
|
14
|
+
const LZX_NUM_PRIMARY_LENGTHS = 7;
|
|
15
|
+
const LZX_NUM_SECONDARY_LENGTHS = 249;
|
|
16
|
+
// Huffman table sizes
|
|
17
|
+
const LZX_PRETREE_TABLEBITS = 6;
|
|
18
|
+
const LZX_PRETREE_MAXSYMBOLS = LZX_PRETREE_NUM_ELEMENTS;
|
|
19
|
+
const LZX_MAINTREE_TABLEBITS = 12;
|
|
20
|
+
const LZX_MAINTREE_MAXSYMBOLS = LZX_NUM_CHARS + 50 * 8;
|
|
21
|
+
const LZX_LENGTH_TABLEBITS = 12;
|
|
22
|
+
const LZX_LENGTH_MAXSYMBOLS = LZX_NUM_SECONDARY_LENGTHS + 1;
|
|
23
|
+
const LZX_ALIGNED_TABLEBITS = 7;
|
|
24
|
+
const LZX_ALIGNED_MAXSYMBOLS = 8;
|
|
25
|
+
const LZX_LENTABLE_SAFETY = 64;
|
|
26
|
+
// ULONG_BITS: 32 for the bitbuf
|
|
27
|
+
const ULONG_BITS = 32;
|
|
28
|
+
// Position slots: extra bits and base positions
|
|
29
|
+
const EXTRA_BITS = new Uint8Array([
|
|
30
|
+
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
|
|
31
|
+
7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14,
|
|
32
|
+
15, 15, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
33
|
+
17, 17, 17,
|
|
34
|
+
]);
|
|
35
|
+
const POSITION_BASE = new Uint32Array([
|
|
36
|
+
0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48,
|
|
37
|
+
64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072,
|
|
38
|
+
4096, 6144, 8192, 12288, 16384, 24576, 32768, 49152, 65536, 98304, 131072, 196608,
|
|
39
|
+
262144, 393216, 524288, 655360, 786432, 917504, 1048576, 1179648, 1310720, 1441792, 1572864, 1703936,
|
|
40
|
+
1835008, 1966080, 2097152,
|
|
41
|
+
]);
|
|
42
|
+
/** Build a Huffman decode table from code lengths. Returns 0 on success, 1 on error. */
|
|
43
|
+
function makeDecodeTable(nsyms, nbits, length, table) {
|
|
44
|
+
let leaf;
|
|
45
|
+
let bitNum = 1;
|
|
46
|
+
let pos = 0;
|
|
47
|
+
let tableMask = 1 << nbits;
|
|
48
|
+
let bitMask = tableMask >> 1;
|
|
49
|
+
let nextSymbol = bitMask;
|
|
50
|
+
// Fill entries for codes short enough for direct mapping
|
|
51
|
+
while (bitNum <= nbits) {
|
|
52
|
+
for (let sym = 0; sym < nsyms; sym++) {
|
|
53
|
+
if (length[sym] === bitNum) {
|
|
54
|
+
leaf = pos;
|
|
55
|
+
if ((pos += bitMask) > tableMask)
|
|
56
|
+
return 1; // table overrun
|
|
57
|
+
let fill = bitMask;
|
|
58
|
+
while (fill-- > 0)
|
|
59
|
+
table[leaf++] = sym;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
bitMask >>= 1;
|
|
63
|
+
bitNum++;
|
|
64
|
+
}
|
|
65
|
+
if (pos !== tableMask) {
|
|
66
|
+
// Clear remainder of table
|
|
67
|
+
for (let sym = pos; sym < tableMask; sym++)
|
|
68
|
+
table[sym] = 0;
|
|
69
|
+
// Room for codes up to 16 more bits — shift pos AND tableMask
|
|
70
|
+
// (safe: nbits ≤ 12 so tableMask ≤ 2^28 after shift, fits in int32)
|
|
71
|
+
pos <<= 16;
|
|
72
|
+
tableMask <<= 16;
|
|
73
|
+
bitMask = 1 << 15;
|
|
74
|
+
while (bitNum <= 16) {
|
|
75
|
+
for (let sym = 0; sym < nsyms; sym++) {
|
|
76
|
+
if (length[sym] === bitNum) {
|
|
77
|
+
leaf = pos >> 16;
|
|
78
|
+
for (let fill = 0; fill < bitNum - nbits; fill++) {
|
|
79
|
+
if (table[leaf] === 0) {
|
|
80
|
+
table[nextSymbol << 1] = 0;
|
|
81
|
+
table[(nextSymbol << 1) + 1] = 0;
|
|
82
|
+
table[leaf] = nextSymbol++;
|
|
83
|
+
}
|
|
84
|
+
leaf = table[leaf] << 1;
|
|
85
|
+
if ((pos >> (15 - fill)) & 1)
|
|
86
|
+
leaf++;
|
|
87
|
+
}
|
|
88
|
+
table[leaf] = sym;
|
|
89
|
+
if ((pos += bitMask) > tableMask)
|
|
90
|
+
return 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
bitMask >>= 1;
|
|
94
|
+
bitNum++;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (pos === tableMask)
|
|
98
|
+
return 0;
|
|
99
|
+
for (let sym = 0; sym < nsyms; sym++)
|
|
100
|
+
if (length[sym])
|
|
101
|
+
return 1;
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
104
|
+
export class LZXState {
|
|
105
|
+
window;
|
|
106
|
+
windowSize;
|
|
107
|
+
actualSize;
|
|
108
|
+
windowPosn;
|
|
109
|
+
R0;
|
|
110
|
+
R1;
|
|
111
|
+
R2;
|
|
112
|
+
mainElements;
|
|
113
|
+
headerRead;
|
|
114
|
+
blockType;
|
|
115
|
+
blockLength;
|
|
116
|
+
blockRemaining;
|
|
117
|
+
framesRead;
|
|
118
|
+
intelFilesize;
|
|
119
|
+
intelCurpos;
|
|
120
|
+
intelStarted;
|
|
121
|
+
// Huffman tables
|
|
122
|
+
PRETREE_table;
|
|
123
|
+
PRETREE_len;
|
|
124
|
+
MAINTREE_table;
|
|
125
|
+
MAINTREE_len;
|
|
126
|
+
LENGTH_table;
|
|
127
|
+
LENGTH_len;
|
|
128
|
+
ALIGNED_table;
|
|
129
|
+
ALIGNED_len;
|
|
130
|
+
constructor(windowBits) {
|
|
131
|
+
if (windowBits < 15 || windowBits > 21)
|
|
132
|
+
throw new RangeError(`LZXState: invalid window size bits ${windowBits} (must be 15-21)`);
|
|
133
|
+
const wndsize = 1 << windowBits;
|
|
134
|
+
let posnSlots;
|
|
135
|
+
if (windowBits === 20)
|
|
136
|
+
posnSlots = 42;
|
|
137
|
+
else if (windowBits === 21)
|
|
138
|
+
posnSlots = 50;
|
|
139
|
+
else
|
|
140
|
+
posnSlots = windowBits << 1;
|
|
141
|
+
this.window = new Uint8Array(wndsize);
|
|
142
|
+
this.windowSize = wndsize;
|
|
143
|
+
this.actualSize = wndsize;
|
|
144
|
+
this.windowPosn = 0;
|
|
145
|
+
this.R0 = this.R1 = this.R2 = 1;
|
|
146
|
+
this.mainElements = LZX_NUM_CHARS + (posnSlots << 3);
|
|
147
|
+
this.headerRead = false;
|
|
148
|
+
this.framesRead = 0;
|
|
149
|
+
this.blockRemaining = 0;
|
|
150
|
+
this.blockType = 0; // LZX_BLOCKTYPE_INVALID
|
|
151
|
+
this.blockLength = 0;
|
|
152
|
+
this.intelCurpos = 0;
|
|
153
|
+
this.intelStarted = false;
|
|
154
|
+
this.intelFilesize = 0;
|
|
155
|
+
// Allocate Huffman tables
|
|
156
|
+
this.PRETREE_table = new Uint16Array((1 << LZX_PRETREE_TABLEBITS) + (LZX_PRETREE_MAXSYMBOLS << 1));
|
|
157
|
+
this.PRETREE_len = new Uint8Array(LZX_PRETREE_MAXSYMBOLS + LZX_LENTABLE_SAFETY);
|
|
158
|
+
this.MAINTREE_table = new Uint16Array((1 << LZX_MAINTREE_TABLEBITS) + (LZX_MAINTREE_MAXSYMBOLS << 1));
|
|
159
|
+
this.MAINTREE_len = new Uint8Array(LZX_MAINTREE_MAXSYMBOLS + LZX_LENTABLE_SAFETY);
|
|
160
|
+
this.LENGTH_table = new Uint16Array((1 << LZX_LENGTH_TABLEBITS) + (LZX_LENGTH_MAXSYMBOLS << 1));
|
|
161
|
+
this.LENGTH_len = new Uint8Array(LZX_LENGTH_MAXSYMBOLS + LZX_LENTABLE_SAFETY);
|
|
162
|
+
this.ALIGNED_table = new Uint16Array((1 << LZX_ALIGNED_TABLEBITS) + (LZX_ALIGNED_MAXSYMBOLS << 1));
|
|
163
|
+
this.ALIGNED_len = new Uint8Array(LZX_ALIGNED_MAXSYMBOLS + LZX_LENTABLE_SAFETY);
|
|
164
|
+
}
|
|
165
|
+
reset() {
|
|
166
|
+
this.R0 = this.R1 = this.R2 = 1;
|
|
167
|
+
this.headerRead = false;
|
|
168
|
+
this.framesRead = 0;
|
|
169
|
+
this.blockRemaining = 0;
|
|
170
|
+
this.blockType = 0; // LZX_BLOCKTYPE_INVALID
|
|
171
|
+
this.intelCurpos = 0;
|
|
172
|
+
this.intelStarted = false;
|
|
173
|
+
this.windowPosn = 0;
|
|
174
|
+
this.MAINTREE_len.fill(0);
|
|
175
|
+
this.LENGTH_len.fill(0);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export const DECR_OK = 0;
|
|
179
|
+
export const DECR_DATAFORMAT = 1;
|
|
180
|
+
export const DECR_ILLEGALDATA = 2;
|
|
181
|
+
/** Decompress one LZX block. Returns DECR_OK on success. */
|
|
182
|
+
export function lzxDecompress(state, inData, outData, inLen, outLen) {
|
|
183
|
+
const window = state.window;
|
|
184
|
+
const windowSize = state.windowSize;
|
|
185
|
+
let windowPosn = state.windowPosn;
|
|
186
|
+
let R0 = state.R0;
|
|
187
|
+
let R1 = state.R1;
|
|
188
|
+
let R2 = state.R2;
|
|
189
|
+
// Bitstream state — 32-bit ULONG bitbuf (matches C: sizeof(ULONG)*8 = 32)
|
|
190
|
+
let bitbuf = 0; // ULONG: 32-bit unsigned
|
|
191
|
+
let bitsleft = 0;
|
|
192
|
+
let inpos = 0;
|
|
193
|
+
const endinp = inLen;
|
|
194
|
+
// ENSURE_BITS(n): ensures at least n bits in bitbuf
|
|
195
|
+
// bitbuf is filled from MSB, 16 bits at a time (little-endian word order)
|
|
196
|
+
function ensureBits(n) {
|
|
197
|
+
while (bitsleft < n) {
|
|
198
|
+
const lo = inpos < inLen ? inData[inpos] : 0;
|
|
199
|
+
const hi = inpos + 1 < inLen ? inData[inpos + 1] : 0;
|
|
200
|
+
// bitbuf |= word << (ULONG_BITS - 16 - bitsleft)
|
|
201
|
+
bitbuf = (bitbuf | (((hi << 8) | lo) << (ULONG_BITS - 16 - bitsleft))) >>> 0;
|
|
202
|
+
bitsleft += 16;
|
|
203
|
+
inpos += 2;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// PEEK_BITS(n): extract top n bits without removing them
|
|
207
|
+
function peekBits(n) {
|
|
208
|
+
return (bitbuf >>> (ULONG_BITS - n)) >>> 0;
|
|
209
|
+
}
|
|
210
|
+
// REMOVE_BITS(n): remove top n bits
|
|
211
|
+
function removeBits(n) {
|
|
212
|
+
bitbuf = (bitbuf << n) >>> 0;
|
|
213
|
+
bitsleft -= n;
|
|
214
|
+
}
|
|
215
|
+
// READ_BITS(n): read and consume n bits
|
|
216
|
+
function readBits(n) {
|
|
217
|
+
ensureBits(n);
|
|
218
|
+
const v = peekBits(n);
|
|
219
|
+
removeBits(n);
|
|
220
|
+
return v;
|
|
221
|
+
}
|
|
222
|
+
// READ_HUFFSYM: decode one Huffman symbol from the stream
|
|
223
|
+
function readHuffSym(table, len, tablebits, maxsyms) {
|
|
224
|
+
ensureBits(16);
|
|
225
|
+
let i = table[peekBits(tablebits)];
|
|
226
|
+
if (i >= maxsyms) {
|
|
227
|
+
let j = 1 << (ULONG_BITS - tablebits);
|
|
228
|
+
do {
|
|
229
|
+
j >>>= 1;
|
|
230
|
+
i <<= 1;
|
|
231
|
+
i |= (bitbuf & j) ? 1 : 0;
|
|
232
|
+
if (!j)
|
|
233
|
+
return -1; // DECR_ILLEGALDATA
|
|
234
|
+
i = table[i];
|
|
235
|
+
} while (i >= maxsyms);
|
|
236
|
+
}
|
|
237
|
+
const bits = len[i];
|
|
238
|
+
removeBits(bits);
|
|
239
|
+
return i;
|
|
240
|
+
}
|
|
241
|
+
// READ_LENGTHS(tbl, first, last): read code lengths for table entries [first..last)
|
|
242
|
+
// IMPORTANT: pretree lengths go into state.PRETREE_len, NOT into the target lens array.
|
|
243
|
+
function readLengths(lens, first, last) {
|
|
244
|
+
// Read 20 4-bit values into PRETREE_len (not into lens!)
|
|
245
|
+
for (let x = 0; x < 20; x++) {
|
|
246
|
+
state.PRETREE_len[x] = readBits(4);
|
|
247
|
+
}
|
|
248
|
+
// Build pretree decode table
|
|
249
|
+
if (makeDecodeTable(LZX_PRETREE_MAXSYMBOLS, LZX_PRETREE_TABLEBITS, state.PRETREE_len, state.PRETREE_table))
|
|
250
|
+
return true; // error
|
|
251
|
+
// Use pretree to decode delta lengths for [first..last)
|
|
252
|
+
let x = first;
|
|
253
|
+
while (x < last) {
|
|
254
|
+
const z = readHuffSym(state.PRETREE_table, state.PRETREE_len, LZX_PRETREE_TABLEBITS, LZX_PRETREE_MAXSYMBOLS);
|
|
255
|
+
if (z < 0)
|
|
256
|
+
return true;
|
|
257
|
+
if (z === 17) {
|
|
258
|
+
let y = readBits(4) + 4;
|
|
259
|
+
while (y-- > 0)
|
|
260
|
+
lens[x++] = 0;
|
|
261
|
+
}
|
|
262
|
+
else if (z === 18) {
|
|
263
|
+
let y = readBits(5) + 20;
|
|
264
|
+
while (y-- > 0)
|
|
265
|
+
lens[x++] = 0;
|
|
266
|
+
}
|
|
267
|
+
else if (z === 19) {
|
|
268
|
+
let y = readBits(1) + 4;
|
|
269
|
+
const zz = readHuffSym(state.PRETREE_table, state.PRETREE_len, LZX_PRETREE_TABLEBITS, LZX_PRETREE_MAXSYMBOLS);
|
|
270
|
+
if (zz < 0)
|
|
271
|
+
return true;
|
|
272
|
+
let val = lens[x] - zz;
|
|
273
|
+
if (val < 0)
|
|
274
|
+
val += 17;
|
|
275
|
+
while (y-- > 0)
|
|
276
|
+
lens[x++] = val;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
// z is a delta: new_len = (old_len - z + 17) % 17
|
|
280
|
+
let val = lens[x] - z;
|
|
281
|
+
if (val < 0)
|
|
282
|
+
val += 17;
|
|
283
|
+
lens[x++] = val;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
let togo = outLen;
|
|
289
|
+
// Read header if necessary (only on first call per stream)
|
|
290
|
+
if (!state.headerRead) {
|
|
291
|
+
let i = 0;
|
|
292
|
+
let j = 0;
|
|
293
|
+
const k = readBits(1);
|
|
294
|
+
if (k) {
|
|
295
|
+
i = readBits(16);
|
|
296
|
+
j = readBits(16);
|
|
297
|
+
}
|
|
298
|
+
state.intelFilesize = (i << 16) | j;
|
|
299
|
+
state.headerRead = true;
|
|
300
|
+
}
|
|
301
|
+
// Main decoding loop
|
|
302
|
+
while (togo > 0) {
|
|
303
|
+
// Start a new block if current one is exhausted
|
|
304
|
+
if (state.blockRemaining === 0) {
|
|
305
|
+
if (state.blockType === LZX_BLOCKTYPE_UNCOMPRESSED) {
|
|
306
|
+
if (state.blockLength & 1)
|
|
307
|
+
inpos++; // realign to word boundary
|
|
308
|
+
// Re-initialize bitstream after uncompressed block
|
|
309
|
+
bitsleft = 0;
|
|
310
|
+
bitbuf = 0;
|
|
311
|
+
}
|
|
312
|
+
state.blockType = readBits(3);
|
|
313
|
+
const i16 = readBits(16);
|
|
314
|
+
const j8 = readBits(8);
|
|
315
|
+
state.blockRemaining = state.blockLength = (i16 << 8) | j8;
|
|
316
|
+
switch (state.blockType) {
|
|
317
|
+
case LZX_BLOCKTYPE_ALIGNED:
|
|
318
|
+
// Read aligned offset tree (8 symbols, 3-bit lengths)
|
|
319
|
+
for (let i = 0; i < 8; i++) {
|
|
320
|
+
state.ALIGNED_len[i] = readBits(3);
|
|
321
|
+
}
|
|
322
|
+
if (makeDecodeTable(LZX_ALIGNED_MAXSYMBOLS, LZX_ALIGNED_TABLEBITS, state.ALIGNED_len, state.ALIGNED_table))
|
|
323
|
+
return DECR_ILLEGALDATA;
|
|
324
|
+
// Fall through: aligned block also reads main and length trees
|
|
325
|
+
/* falls through */
|
|
326
|
+
case LZX_BLOCKTYPE_VERBATIM:
|
|
327
|
+
if (readLengths(state.MAINTREE_len, 0, 256))
|
|
328
|
+
return DECR_ILLEGALDATA;
|
|
329
|
+
if (readLengths(state.MAINTREE_len, 256, state.mainElements))
|
|
330
|
+
return DECR_ILLEGALDATA;
|
|
331
|
+
if (makeDecodeTable(LZX_MAINTREE_MAXSYMBOLS, LZX_MAINTREE_TABLEBITS, state.MAINTREE_len, state.MAINTREE_table))
|
|
332
|
+
return DECR_ILLEGALDATA;
|
|
333
|
+
if (state.MAINTREE_len[0xe8] !== 0)
|
|
334
|
+
state.intelStarted = true;
|
|
335
|
+
if (readLengths(state.LENGTH_len, 0, LZX_NUM_SECONDARY_LENGTHS))
|
|
336
|
+
return DECR_ILLEGALDATA;
|
|
337
|
+
if (makeDecodeTable(LZX_LENGTH_MAXSYMBOLS, LZX_LENGTH_TABLEBITS, state.LENGTH_len, state.LENGTH_table))
|
|
338
|
+
return DECR_ILLEGALDATA;
|
|
339
|
+
break;
|
|
340
|
+
case LZX_BLOCKTYPE_UNCOMPRESSED:
|
|
341
|
+
state.intelStarted = true;
|
|
342
|
+
// Align: consume up to 16 pad bits, then re-align
|
|
343
|
+
ensureBits(16);
|
|
344
|
+
if (bitsleft > 16)
|
|
345
|
+
inpos -= 2;
|
|
346
|
+
// Read R0, R1, R2 as LE 32-bit integers from stream
|
|
347
|
+
R0 = (inData[inpos] | (inData[inpos + 1] << 8) | (inData[inpos + 2] << 16) | (inData[inpos + 3] << 24)) >>> 0;
|
|
348
|
+
inpos += 4;
|
|
349
|
+
R1 = (inData[inpos] | (inData[inpos + 1] << 8) | (inData[inpos + 2] << 16) | (inData[inpos + 3] << 24)) >>> 0;
|
|
350
|
+
inpos += 4;
|
|
351
|
+
R2 = (inData[inpos] | (inData[inpos + 1] << 8) | (inData[inpos + 2] << 16) | (inData[inpos + 3] << 24)) >>> 0;
|
|
352
|
+
inpos += 4;
|
|
353
|
+
break;
|
|
354
|
+
default:
|
|
355
|
+
return DECR_ILLEGALDATA;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Buffer exhaustion check
|
|
359
|
+
if (inpos > endinp) {
|
|
360
|
+
if (inpos > endinp + 2 || bitsleft < 16)
|
|
361
|
+
return DECR_ILLEGALDATA;
|
|
362
|
+
}
|
|
363
|
+
// Process as much of this block as possible (up to togo bytes)
|
|
364
|
+
while (state.blockRemaining > 0 && togo > 0) {
|
|
365
|
+
let thisRun = state.blockRemaining;
|
|
366
|
+
if (thisRun > togo)
|
|
367
|
+
thisRun = togo;
|
|
368
|
+
togo -= thisRun;
|
|
369
|
+
state.blockRemaining -= thisRun;
|
|
370
|
+
// Apply window size mask
|
|
371
|
+
windowPosn &= windowSize - 1;
|
|
372
|
+
if (windowPosn + thisRun > windowSize)
|
|
373
|
+
return DECR_DATAFORMAT;
|
|
374
|
+
switch (state.blockType) {
|
|
375
|
+
case LZX_BLOCKTYPE_VERBATIM:
|
|
376
|
+
while (thisRun > 0) {
|
|
377
|
+
const mainElement = readHuffSym(state.MAINTREE_table, state.MAINTREE_len, LZX_MAINTREE_TABLEBITS, LZX_MAINTREE_MAXSYMBOLS);
|
|
378
|
+
if (mainElement < 0)
|
|
379
|
+
return DECR_ILLEGALDATA;
|
|
380
|
+
if (mainElement < LZX_NUM_CHARS) {
|
|
381
|
+
window[windowPosn++] = mainElement;
|
|
382
|
+
thisRun--;
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
const me = mainElement - LZX_NUM_CHARS;
|
|
386
|
+
let matchLength = me & LZX_NUM_PRIMARY_LENGTHS;
|
|
387
|
+
if (matchLength === LZX_NUM_PRIMARY_LENGTHS) {
|
|
388
|
+
const lf = readHuffSym(state.LENGTH_table, state.LENGTH_len, LZX_LENGTH_TABLEBITS, LZX_LENGTH_MAXSYMBOLS);
|
|
389
|
+
if (lf < 0)
|
|
390
|
+
return DECR_ILLEGALDATA;
|
|
391
|
+
matchLength += lf;
|
|
392
|
+
}
|
|
393
|
+
matchLength += LZX_MIN_MATCH;
|
|
394
|
+
let matchOffset = me >> 3;
|
|
395
|
+
if (matchOffset > 2) {
|
|
396
|
+
if (matchOffset !== 3) {
|
|
397
|
+
const extra = EXTRA_BITS[matchOffset];
|
|
398
|
+
const verbatimBits = readBits(extra);
|
|
399
|
+
matchOffset = POSITION_BASE[matchOffset] - 2 + verbatimBits;
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
matchOffset = 1;
|
|
403
|
+
}
|
|
404
|
+
R2 = R1;
|
|
405
|
+
R1 = R0;
|
|
406
|
+
R0 = matchOffset;
|
|
407
|
+
}
|
|
408
|
+
else if (matchOffset === 0) {
|
|
409
|
+
matchOffset = R0;
|
|
410
|
+
}
|
|
411
|
+
else if (matchOffset === 1) {
|
|
412
|
+
matchOffset = R1;
|
|
413
|
+
R1 = R0;
|
|
414
|
+
R0 = matchOffset;
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
matchOffset = R2;
|
|
418
|
+
R2 = R0;
|
|
419
|
+
R0 = matchOffset;
|
|
420
|
+
}
|
|
421
|
+
let rundest = windowPosn;
|
|
422
|
+
let runsrc = rundest - matchOffset;
|
|
423
|
+
windowPosn += matchLength;
|
|
424
|
+
if (windowPosn > windowSize)
|
|
425
|
+
return DECR_ILLEGALDATA;
|
|
426
|
+
thisRun -= matchLength;
|
|
427
|
+
// Copy wrapped-around source data
|
|
428
|
+
while (runsrc < 0 && matchLength-- > 0) {
|
|
429
|
+
window[rundest++] = window[runsrc + windowSize];
|
|
430
|
+
runsrc++;
|
|
431
|
+
}
|
|
432
|
+
// Copy match data
|
|
433
|
+
while (matchLength-- > 0) {
|
|
434
|
+
window[rundest++] = window[runsrc++];
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
break;
|
|
439
|
+
case LZX_BLOCKTYPE_ALIGNED:
|
|
440
|
+
while (thisRun > 0) {
|
|
441
|
+
const mainElement = readHuffSym(state.MAINTREE_table, state.MAINTREE_len, LZX_MAINTREE_TABLEBITS, LZX_MAINTREE_MAXSYMBOLS);
|
|
442
|
+
if (mainElement < 0)
|
|
443
|
+
return DECR_ILLEGALDATA;
|
|
444
|
+
if (mainElement < LZX_NUM_CHARS) {
|
|
445
|
+
window[windowPosn++] = mainElement;
|
|
446
|
+
thisRun--;
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
const me = mainElement - LZX_NUM_CHARS;
|
|
450
|
+
let matchLength = me & LZX_NUM_PRIMARY_LENGTHS;
|
|
451
|
+
if (matchLength === LZX_NUM_PRIMARY_LENGTHS) {
|
|
452
|
+
const lf = readHuffSym(state.LENGTH_table, state.LENGTH_len, LZX_LENGTH_TABLEBITS, LZX_LENGTH_MAXSYMBOLS);
|
|
453
|
+
if (lf < 0)
|
|
454
|
+
return DECR_ILLEGALDATA;
|
|
455
|
+
matchLength += lf;
|
|
456
|
+
}
|
|
457
|
+
matchLength += LZX_MIN_MATCH;
|
|
458
|
+
let matchOffset = me >> 3;
|
|
459
|
+
if (matchOffset > 2) {
|
|
460
|
+
const extra = EXTRA_BITS[matchOffset];
|
|
461
|
+
matchOffset = POSITION_BASE[matchOffset] - 2;
|
|
462
|
+
if (extra > 3) {
|
|
463
|
+
const verbatimBits = readBits(extra - 3);
|
|
464
|
+
matchOffset += verbatimBits << 3;
|
|
465
|
+
const alignedBits = readHuffSym(state.ALIGNED_table, state.ALIGNED_len, LZX_ALIGNED_TABLEBITS, LZX_ALIGNED_MAXSYMBOLS);
|
|
466
|
+
if (alignedBits < 0)
|
|
467
|
+
return DECR_ILLEGALDATA;
|
|
468
|
+
matchOffset += alignedBits;
|
|
469
|
+
}
|
|
470
|
+
else if (extra === 3) {
|
|
471
|
+
const alignedBits = readHuffSym(state.ALIGNED_table, state.ALIGNED_len, LZX_ALIGNED_TABLEBITS, LZX_ALIGNED_MAXSYMBOLS);
|
|
472
|
+
if (alignedBits < 0)
|
|
473
|
+
return DECR_ILLEGALDATA;
|
|
474
|
+
matchOffset += alignedBits;
|
|
475
|
+
}
|
|
476
|
+
else if (extra > 0) {
|
|
477
|
+
const verbatimBits = readBits(extra);
|
|
478
|
+
matchOffset += verbatimBits;
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
matchOffset = 1;
|
|
482
|
+
}
|
|
483
|
+
R2 = R1;
|
|
484
|
+
R1 = R0;
|
|
485
|
+
R0 = matchOffset;
|
|
486
|
+
}
|
|
487
|
+
else if (matchOffset === 0) {
|
|
488
|
+
matchOffset = R0;
|
|
489
|
+
}
|
|
490
|
+
else if (matchOffset === 1) {
|
|
491
|
+
matchOffset = R1;
|
|
492
|
+
R1 = R0;
|
|
493
|
+
R0 = matchOffset;
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
matchOffset = R2;
|
|
497
|
+
R2 = R0;
|
|
498
|
+
R0 = matchOffset;
|
|
499
|
+
}
|
|
500
|
+
let rundest = windowPosn;
|
|
501
|
+
let runsrc = rundest - matchOffset;
|
|
502
|
+
windowPosn += matchLength;
|
|
503
|
+
if (windowPosn > windowSize)
|
|
504
|
+
return DECR_ILLEGALDATA;
|
|
505
|
+
thisRun -= matchLength;
|
|
506
|
+
while (runsrc < 0 && matchLength-- > 0) {
|
|
507
|
+
window[rundest++] = window[runsrc + windowSize];
|
|
508
|
+
runsrc++;
|
|
509
|
+
}
|
|
510
|
+
while (matchLength-- > 0) {
|
|
511
|
+
window[rundest++] = window[runsrc++];
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
break;
|
|
516
|
+
case LZX_BLOCKTYPE_UNCOMPRESSED:
|
|
517
|
+
if (inpos + thisRun > endinp)
|
|
518
|
+
return DECR_ILLEGALDATA;
|
|
519
|
+
// Write directly to window (C code does memcpy(window + window_posn, inpos, ...))
|
|
520
|
+
window.set(inData.subarray(inpos, inpos + thisRun), windowPosn);
|
|
521
|
+
inpos += thisRun;
|
|
522
|
+
windowPosn += thisRun;
|
|
523
|
+
break;
|
|
524
|
+
default:
|
|
525
|
+
return DECR_ILLEGALDATA;
|
|
526
|
+
}
|
|
527
|
+
} // end inner while
|
|
528
|
+
} // end outer while
|
|
529
|
+
if (togo !== 0)
|
|
530
|
+
return DECR_ILLEGALDATA;
|
|
531
|
+
// Copy decompressed data from window to output
|
|
532
|
+
// C: memcpy(outpos, window + ((!window_posn) ? window_size : window_posn) - outlen, outlen)
|
|
533
|
+
const copyFrom = (windowPosn === 0 ? windowSize : windowPosn) - outLen;
|
|
534
|
+
outData.set(window.subarray(copyFrom, copyFrom + outLen), 0);
|
|
535
|
+
state.windowPosn = windowPosn;
|
|
536
|
+
state.R0 = R0;
|
|
537
|
+
state.R1 = R1;
|
|
538
|
+
state.R2 = R2;
|
|
539
|
+
// Intel E8 call translation post-processing
|
|
540
|
+
if (state.framesRead++ < 32768 && state.intelFilesize !== 0) {
|
|
541
|
+
if (outLen <= 6 || !state.intelStarted) {
|
|
542
|
+
state.intelCurpos += outLen;
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
let dataPos = 0;
|
|
546
|
+
const dataEnd = outLen - 10;
|
|
547
|
+
let curpos = state.intelCurpos;
|
|
548
|
+
const filesize = state.intelFilesize;
|
|
549
|
+
state.intelCurpos = curpos + outLen;
|
|
550
|
+
while (dataPos < dataEnd) {
|
|
551
|
+
if (outData[dataPos++] !== 0xe8) {
|
|
552
|
+
curpos++;
|
|
553
|
+
continue;
|
|
554
|
+
}
|
|
555
|
+
// Read signed 32-bit LE integer
|
|
556
|
+
const absOff = (outData[dataPos] | (outData[dataPos + 1] << 8) | (outData[dataPos + 2] << 16) | (outData[dataPos + 3] << 24));
|
|
557
|
+
if (absOff >= -curpos && absOff < filesize) {
|
|
558
|
+
const relOff = absOff >= 0 ? absOff - curpos : absOff + filesize;
|
|
559
|
+
outData[dataPos] = (relOff) & 0xff;
|
|
560
|
+
outData[dataPos + 1] = (relOff >> 8) & 0xff;
|
|
561
|
+
outData[dataPos + 2] = (relOff >> 16) & 0xff;
|
|
562
|
+
outData[dataPos + 3] = (relOff >> 24) & 0xff;
|
|
563
|
+
}
|
|
564
|
+
dataPos += 4;
|
|
565
|
+
curpos += 5;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
return DECR_OK;
|
|
570
|
+
}
|
|
571
|
+
//# sourceMappingURL=lzx.js.map
|
package/dist/lzx.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lzx.js","sourceRoot":"","sources":["../src/lzx.ts"],"names":[],"mappings":"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"}
|
package/dist/reader.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChmReader interface and built-in implementations.
|
|
3
|
+
* Provides random-access reads over a CHM file without loading the entire file into memory.
|
|
4
|
+
*/
|
|
5
|
+
export interface ChmReader {
|
|
6
|
+
read(offset: bigint, length: number): Promise<Uint8Array>;
|
|
7
|
+
close?(): void | Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
/** In-memory reader backed by a Uint8Array. Works in any environment. */
|
|
10
|
+
export declare function chmReaderFromBuffer(data: Uint8Array): ChmReader;
|
|
11
|
+
/** Node.js file reader using fs.promises. Only works in Node.js. */
|
|
12
|
+
export declare function chmReaderFromFile(path: string): ChmReader;
|
|
13
|
+
//# sourceMappingURL=reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAQ/D;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CA0BzD"}
|
package/dist/reader.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChmReader interface and built-in implementations.
|
|
3
|
+
* Provides random-access reads over a CHM file without loading the entire file into memory.
|
|
4
|
+
*/
|
|
5
|
+
/** In-memory reader backed by a Uint8Array. Works in any environment. */
|
|
6
|
+
export function chmReaderFromBuffer(data) {
|
|
7
|
+
return {
|
|
8
|
+
read(offset, length) {
|
|
9
|
+
const start = Number(offset);
|
|
10
|
+
const end = Math.min(start + length, data.length);
|
|
11
|
+
return Promise.resolve(data.slice(start, end));
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** Node.js file reader using fs.promises. Only works in Node.js. */
|
|
16
|
+
export function chmReaderFromFile(path) {
|
|
17
|
+
// We use a lazy-open approach: open the file handle on first read.
|
|
18
|
+
let handlePromise = null;
|
|
19
|
+
function getHandle() {
|
|
20
|
+
if (!handlePromise) {
|
|
21
|
+
handlePromise = import('fs/promises').then((fs) => fs.open(path, 'r'));
|
|
22
|
+
}
|
|
23
|
+
return handlePromise;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
async read(offset, length) {
|
|
27
|
+
const handle = await getHandle();
|
|
28
|
+
const buf = Buffer.alloc(length);
|
|
29
|
+
const { bytesRead } = await handle.read(buf, 0, length, Number(offset));
|
|
30
|
+
return new Uint8Array(buf.buffer, 0, bytesRead);
|
|
31
|
+
},
|
|
32
|
+
async close() {
|
|
33
|
+
if (handlePromise) {
|
|
34
|
+
const handle = await handlePromise;
|
|
35
|
+
handlePromise = null;
|
|
36
|
+
await handle.close();
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=reader.js.map
|