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
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor-based binary reader using DataView with little-endian reads.
|
|
3
|
+
* Replaces all _unmarshal_* functions from chm_lib.c.
|
|
4
|
+
*/
|
|
5
|
+
export class BufferReader {
|
|
6
|
+
view;
|
|
7
|
+
_offset;
|
|
8
|
+
constructor(buffer, offset = 0) {
|
|
9
|
+
this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
10
|
+
this._offset = offset;
|
|
11
|
+
}
|
|
12
|
+
get offset() {
|
|
13
|
+
return this._offset;
|
|
14
|
+
}
|
|
15
|
+
get remaining() {
|
|
16
|
+
return this.view.byteLength - this._offset;
|
|
17
|
+
}
|
|
18
|
+
readUint8() {
|
|
19
|
+
if (this._offset + 1 > this.view.byteLength)
|
|
20
|
+
throw new RangeError(`BufferReader: read past end (offset=${this._offset}, need 1)`);
|
|
21
|
+
const val = this.view.getUint8(this._offset);
|
|
22
|
+
this._offset += 1;
|
|
23
|
+
return val;
|
|
24
|
+
}
|
|
25
|
+
readInt16LE() {
|
|
26
|
+
if (this._offset + 2 > this.view.byteLength)
|
|
27
|
+
throw new RangeError(`BufferReader: read past end (offset=${this._offset}, need 2)`);
|
|
28
|
+
const val = this.view.getInt16(this._offset, true);
|
|
29
|
+
this._offset += 2;
|
|
30
|
+
return val;
|
|
31
|
+
}
|
|
32
|
+
readUint16LE() {
|
|
33
|
+
if (this._offset + 2 > this.view.byteLength)
|
|
34
|
+
throw new RangeError(`BufferReader: read past end (offset=${this._offset}, need 2)`);
|
|
35
|
+
const val = this.view.getUint16(this._offset, true);
|
|
36
|
+
this._offset += 2;
|
|
37
|
+
return val;
|
|
38
|
+
}
|
|
39
|
+
readInt32LE() {
|
|
40
|
+
if (this._offset + 4 > this.view.byteLength)
|
|
41
|
+
throw new RangeError(`BufferReader: read past end (offset=${this._offset}, need 4)`);
|
|
42
|
+
const val = this.view.getInt32(this._offset, true);
|
|
43
|
+
this._offset += 4;
|
|
44
|
+
return val;
|
|
45
|
+
}
|
|
46
|
+
readUint32LE() {
|
|
47
|
+
if (this._offset + 4 > this.view.byteLength)
|
|
48
|
+
throw new RangeError(`BufferReader: read past end (offset=${this._offset}, need 4)`);
|
|
49
|
+
const val = this.view.getUint32(this._offset, true);
|
|
50
|
+
this._offset += 4;
|
|
51
|
+
return val;
|
|
52
|
+
}
|
|
53
|
+
readBigInt64LE() {
|
|
54
|
+
if (this._offset + 8 > this.view.byteLength)
|
|
55
|
+
throw new RangeError(`BufferReader: read past end (offset=${this._offset}, need 8)`);
|
|
56
|
+
const val = this.view.getBigInt64(this._offset, true);
|
|
57
|
+
this._offset += 8;
|
|
58
|
+
return val;
|
|
59
|
+
}
|
|
60
|
+
readBigUint64LE() {
|
|
61
|
+
if (this._offset + 8 > this.view.byteLength)
|
|
62
|
+
throw new RangeError(`BufferReader: read past end (offset=${this._offset}, need 8)`);
|
|
63
|
+
const val = this.view.getBigUint64(this._offset, true);
|
|
64
|
+
this._offset += 8;
|
|
65
|
+
return val;
|
|
66
|
+
}
|
|
67
|
+
readBytes(count) {
|
|
68
|
+
if (this._offset + count > this.view.byteLength)
|
|
69
|
+
throw new RangeError(`BufferReader: read past end (offset=${this._offset}, need ${count})`);
|
|
70
|
+
const result = new Uint8Array(this.view.buffer, this.view.byteOffset + this._offset, count);
|
|
71
|
+
this._offset += count;
|
|
72
|
+
// Return a copy so the caller owns the data
|
|
73
|
+
return result.slice();
|
|
74
|
+
}
|
|
75
|
+
/** Read a fixed-length ASCII string */
|
|
76
|
+
readAscii(count) {
|
|
77
|
+
const bytes = this.readBytes(count);
|
|
78
|
+
return String.fromCharCode(...bytes);
|
|
79
|
+
}
|
|
80
|
+
skip(count) {
|
|
81
|
+
if (this._offset + count > this.view.byteLength)
|
|
82
|
+
throw new RangeError(`BufferReader: skip past end (offset=${this._offset}, skip ${count})`);
|
|
83
|
+
this._offset += count;
|
|
84
|
+
}
|
|
85
|
+
/** Read a LEB128 compressed word (variable-length integer used by CHM PMGL entries) */
|
|
86
|
+
readCWord() {
|
|
87
|
+
let accum = 0n;
|
|
88
|
+
let temp;
|
|
89
|
+
while ((temp = this.readUint8()) >= 0x80) {
|
|
90
|
+
accum <<= 7n;
|
|
91
|
+
accum += BigInt(temp & 0x7f);
|
|
92
|
+
}
|
|
93
|
+
return (accum << 7n) + BigInt(temp);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=buffer-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer-reader.js","sourceRoot":"","sources":["../src/buffer-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ChmReader } from './reader.js';
|
|
2
|
+
import { ChmUnitInfo } from './types.js';
|
|
3
|
+
export declare class ChmFile {
|
|
4
|
+
private reader;
|
|
5
|
+
private dirOffset;
|
|
6
|
+
private dirLen;
|
|
7
|
+
private dataOffset;
|
|
8
|
+
private indexRoot;
|
|
9
|
+
private indexHead;
|
|
10
|
+
private blockLen;
|
|
11
|
+
private compressionEnabled;
|
|
12
|
+
private rtUnit;
|
|
13
|
+
private cnUnit;
|
|
14
|
+
private resetTable;
|
|
15
|
+
private windowSize;
|
|
16
|
+
private resetInterval;
|
|
17
|
+
private resetBlkCount;
|
|
18
|
+
private lzxState;
|
|
19
|
+
private lzxLastBlock;
|
|
20
|
+
private cacheBlocks;
|
|
21
|
+
private cacheBlockIndices;
|
|
22
|
+
private cacheNumBlocks;
|
|
23
|
+
private constructor();
|
|
24
|
+
static open(reader: ChmReader): Promise<ChmFile>;
|
|
25
|
+
private init;
|
|
26
|
+
close(): void;
|
|
27
|
+
setCacheSize(n: number): void;
|
|
28
|
+
private fetchBytes;
|
|
29
|
+
/** Parse a PMGL entry from a BufferReader, return null if at end */
|
|
30
|
+
private parsePmglEntry;
|
|
31
|
+
/** Walk PMGI index page to find the leaf block that would contain objPath */
|
|
32
|
+
private findInPmgi;
|
|
33
|
+
/** Search PMGL leaf page for exact entry matching objPath. Returns offset into page or -1. */
|
|
34
|
+
private findInPmgl;
|
|
35
|
+
/** Resolve a path to its ChmUnitInfo, or null if not found */
|
|
36
|
+
resolve(objPath: string): Promise<ChmUnitInfo | null>;
|
|
37
|
+
/** Retrieve (part of) an object's data */
|
|
38
|
+
retrieve(ui: ChmUnitInfo, offset?: bigint, length?: bigint): Promise<Uint8Array>;
|
|
39
|
+
/** Get the compressed block bounds */
|
|
40
|
+
private getCmpBlockBounds;
|
|
41
|
+
/** Decompress one block into the cache slot. Must call in-order. */
|
|
42
|
+
private decompressOneBlock;
|
|
43
|
+
/** Decompress a single block into cache, return its data.
|
|
44
|
+
*
|
|
45
|
+
* Matches the C _chm_decompress_block logic:
|
|
46
|
+
* - Compute blockAlign = block % resetBlkCount
|
|
47
|
+
* - If lzxLastBlock is between block-blockAlign and block, reduce blockAlign
|
|
48
|
+
* - Decompress all preceding blocks in the reset window that haven't been done yet
|
|
49
|
+
*/
|
|
50
|
+
private decompressBlock;
|
|
51
|
+
/** Decompress a region from compressed space */
|
|
52
|
+
private decompressRegion;
|
|
53
|
+
/** Enumerate all entries in the archive */
|
|
54
|
+
enumerate(what?: number): AsyncGenerator<ChmUnitInfo>;
|
|
55
|
+
/** Enumerate entries under a directory prefix */
|
|
56
|
+
enumerateDir(prefix: string, what?: number): AsyncGenerator<ChmUnitInfo>;
|
|
57
|
+
/** Read the /#SYSTEM file as raw bytes for higher-level parsing */
|
|
58
|
+
getSystemRaw(): Promise<Uint8Array | null>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=chm-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chm-file.d.ts","sourceRoot":"","sources":["../src/chm-file.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAA+C,MAAM,YAAY,CAAC;AAWtF,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAa;IAG7B,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,aAAa,CAAa;IAGlC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,YAAY,CAAc;IAGlC,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,iBAAiB,CAAW;IACpC,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO;WAOM,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;YAMxC,IAAI;IAyDlB,KAAK,IAAI,IAAI;IAMb,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;YAqBf,UAAU;IAIxB,oEAAoE;IACpE,OAAO,CAAC,cAAc;IAWtB,6EAA6E;IAC7E,OAAO,CAAC,UAAU;IAmBlB,8FAA8F;IAC9F,OAAO,CAAC,UAAU;IA6BlB,8DAA8D;IACxD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAuB3D,0CAA0C;IACpC,QAAQ,CACZ,EAAE,EAAE,WAAW,EACf,MAAM,GAAE,MAAW,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC;IAsBtB,sCAAsC;YACxB,iBAAiB;IAwB/B,oEAAoE;YACtD,kBAAkB;IAkBhC;;;;;;OAMG;YACW,eAAe;IA4C7B,gDAAgD;YAClC,gBAAgB;IAgC9B,2CAA2C;IACpC,SAAS,CAAC,IAAI,GAAE,MAA8B,GAAG,cAAc,CAAC,WAAW,CAAC;IA4BnF,iDAAiD;IAC1C,YAAY,CACjB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,MAA8B,GACnC,cAAc,CAAC,WAAW,CAAC;IA0B9B,mEAAmE;IAC7D,YAAY,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAKjD"}
|
package/dist/chm-file.js
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { BufferReader } from './buffer-reader.js';
|
|
2
|
+
import { unmarshalItsfHeader, unmarshalItspHeader, unmarshalPmglHeader, unmarshalPmgiHeader, unmarshalLzxcResetTable, unmarshalLzxcControlData, } from './headers.js';
|
|
3
|
+
import { LZXState, lzxDecompress, DECR_OK } from './lzx.js';
|
|
4
|
+
import { ChmSpace, ChmEnumerateFlags } from './types.js';
|
|
5
|
+
const CHMU_RESET_TABLE = '::DataSpace/Storage/MSCompressed/Transform/' +
|
|
6
|
+
'{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/' +
|
|
7
|
+
'InstanceData/ResetTable';
|
|
8
|
+
const CHMU_LZXC_CONTROLDATA = '::DataSpace/Storage/MSCompressed/ControlData';
|
|
9
|
+
const CHMU_CONTENT = '::DataSpace/Storage/MSCompressed/Content';
|
|
10
|
+
const CHM_MAX_BLOCKS_CACHED = 5;
|
|
11
|
+
export class ChmFile {
|
|
12
|
+
reader;
|
|
13
|
+
dirOffset = 0n;
|
|
14
|
+
dirLen = 0n;
|
|
15
|
+
dataOffset = 0n;
|
|
16
|
+
indexRoot = 0;
|
|
17
|
+
indexHead = 0;
|
|
18
|
+
blockLen = 0;
|
|
19
|
+
// Compression state
|
|
20
|
+
compressionEnabled = false;
|
|
21
|
+
rtUnit;
|
|
22
|
+
cnUnit;
|
|
23
|
+
resetTable;
|
|
24
|
+
windowSize = 0;
|
|
25
|
+
resetInterval = 0;
|
|
26
|
+
resetBlkCount = 0;
|
|
27
|
+
// LZX decompressor state
|
|
28
|
+
lzxState = null;
|
|
29
|
+
lzxLastBlock = -1;
|
|
30
|
+
// Block cache
|
|
31
|
+
cacheBlocks;
|
|
32
|
+
cacheBlockIndices;
|
|
33
|
+
cacheNumBlocks;
|
|
34
|
+
constructor(reader) {
|
|
35
|
+
this.reader = reader;
|
|
36
|
+
this.cacheNumBlocks = CHM_MAX_BLOCKS_CACHED;
|
|
37
|
+
this.cacheBlocks = new Array(CHM_MAX_BLOCKS_CACHED).fill(null);
|
|
38
|
+
this.cacheBlockIndices = new Array(CHM_MAX_BLOCKS_CACHED).fill(0n);
|
|
39
|
+
}
|
|
40
|
+
static async open(reader) {
|
|
41
|
+
const f = new ChmFile(reader);
|
|
42
|
+
await f.init();
|
|
43
|
+
return f;
|
|
44
|
+
}
|
|
45
|
+
async init() {
|
|
46
|
+
// Read and parse ITSF header
|
|
47
|
+
const itsfBuf = await this.reader.read(0n, 0x60);
|
|
48
|
+
const itsf = unmarshalItsfHeader(itsfBuf);
|
|
49
|
+
this.dirOffset = itsf.dirOffset;
|
|
50
|
+
this.dirLen = itsf.dirLen;
|
|
51
|
+
this.dataOffset = itsf.dataOffset;
|
|
52
|
+
// Read and parse ITSP header
|
|
53
|
+
const itspBuf = await this.reader.read(itsf.dirOffset, 0x54);
|
|
54
|
+
const itsp = unmarshalItspHeader(itspBuf);
|
|
55
|
+
this.dirOffset += BigInt(itsp.headerLen);
|
|
56
|
+
this.dirLen -= BigInt(itsp.headerLen);
|
|
57
|
+
this.indexRoot = itsp.indexRoot <= -1 ? itsp.indexHead : itsp.indexRoot;
|
|
58
|
+
this.indexHead = itsp.indexHead;
|
|
59
|
+
this.blockLen = itsp.blockLen;
|
|
60
|
+
// Try to set up compression
|
|
61
|
+
try {
|
|
62
|
+
const rtUnit = await this.resolve(CHMU_RESET_TABLE);
|
|
63
|
+
const cnUnit = await this.resolve(CHMU_CONTENT);
|
|
64
|
+
const uiLzxc = await this.resolve(CHMU_LZXC_CONTROLDATA);
|
|
65
|
+
if (rtUnit && rtUnit.space !== ChmSpace.Compressed &&
|
|
66
|
+
cnUnit && cnUnit.space !== ChmSpace.Compressed &&
|
|
67
|
+
uiLzxc && uiLzxc.space !== ChmSpace.Compressed) {
|
|
68
|
+
// Read reset table
|
|
69
|
+
const rtBuf = await this.fetchBytes(this.dataOffset + rtUnit.start, 0x28);
|
|
70
|
+
const resetTable = unmarshalLzxcResetTable(rtBuf);
|
|
71
|
+
// Read control data
|
|
72
|
+
const ctlBuf = await this.fetchBytes(this.dataOffset + uiLzxc.start, Number(uiLzxc.length));
|
|
73
|
+
const ctlData = unmarshalLzxcControlData(ctlBuf);
|
|
74
|
+
this.rtUnit = rtUnit;
|
|
75
|
+
this.cnUnit = cnUnit;
|
|
76
|
+
this.resetTable = resetTable;
|
|
77
|
+
this.windowSize = ctlData.windowSize;
|
|
78
|
+
this.resetInterval = ctlData.resetInterval;
|
|
79
|
+
this.resetBlkCount = (ctlData.resetInterval / (ctlData.windowSize / 2)) * ctlData.windowsPerReset;
|
|
80
|
+
this.compressionEnabled = true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Compression not available or not needed
|
|
85
|
+
this.compressionEnabled = false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
close() {
|
|
89
|
+
if (this.reader.close)
|
|
90
|
+
this.reader.close();
|
|
91
|
+
this.lzxState = null;
|
|
92
|
+
this.cacheBlocks.fill(null);
|
|
93
|
+
}
|
|
94
|
+
setCacheSize(n) {
|
|
95
|
+
if (n === this.cacheNumBlocks)
|
|
96
|
+
return;
|
|
97
|
+
const newBlocks = new Array(n).fill(null);
|
|
98
|
+
const newIndices = new Array(n).fill(0n);
|
|
99
|
+
for (let i = 0; i < this.cacheNumBlocks; i++) {
|
|
100
|
+
if (this.cacheBlocks[i]) {
|
|
101
|
+
const newSlot = Number(this.cacheBlockIndices[i] % BigInt(n));
|
|
102
|
+
if (!newBlocks[newSlot]) {
|
|
103
|
+
newBlocks[newSlot] = this.cacheBlocks[i];
|
|
104
|
+
newIndices[newSlot] = this.cacheBlockIndices[i];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
this.cacheBlocks = newBlocks;
|
|
109
|
+
this.cacheBlockIndices = newIndices;
|
|
110
|
+
this.cacheNumBlocks = n;
|
|
111
|
+
}
|
|
112
|
+
async fetchBytes(offset, length) {
|
|
113
|
+
return this.reader.read(offset, length);
|
|
114
|
+
}
|
|
115
|
+
/** Parse a PMGL entry from a BufferReader, return null if at end */
|
|
116
|
+
parsePmglEntry(r) {
|
|
117
|
+
if (r.remaining === 0)
|
|
118
|
+
return null;
|
|
119
|
+
const strLen = r.readCWord();
|
|
120
|
+
const pathBytes = r.readBytes(Number(strLen));
|
|
121
|
+
const path = new TextDecoder('utf-8').decode(pathBytes);
|
|
122
|
+
const space = Number(r.readCWord());
|
|
123
|
+
const start = r.readCWord();
|
|
124
|
+
const length = r.readCWord();
|
|
125
|
+
return { start, length, space, flags: 0, path };
|
|
126
|
+
}
|
|
127
|
+
/** Walk PMGI index page to find the leaf block that would contain objPath */
|
|
128
|
+
findInPmgi(pageBuf, objPath) {
|
|
129
|
+
const header = unmarshalPmgiHeader(pageBuf.subarray(0, 8));
|
|
130
|
+
const end = pageBuf.length - header.freeSpace;
|
|
131
|
+
const r = new BufferReader(pageBuf, 8);
|
|
132
|
+
let page = -1;
|
|
133
|
+
while (r.offset < end) {
|
|
134
|
+
const strLen = Number(r.readCWord());
|
|
135
|
+
const pathBytes = r.readBytes(strLen);
|
|
136
|
+
const path = new TextDecoder('utf-8').decode(pathBytes);
|
|
137
|
+
if (path > objPath)
|
|
138
|
+
return page;
|
|
139
|
+
page = Number(r.readCWord());
|
|
140
|
+
}
|
|
141
|
+
return page;
|
|
142
|
+
}
|
|
143
|
+
/** Search PMGL leaf page for exact entry matching objPath. Returns offset into page or -1. */
|
|
144
|
+
findInPmgl(pageBuf, objPath) {
|
|
145
|
+
const header = unmarshalPmglHeader(pageBuf.subarray(0, 0x14));
|
|
146
|
+
const end = pageBuf.length - header.freeSpace;
|
|
147
|
+
const r = new BufferReader(pageBuf, 0x14);
|
|
148
|
+
while (r.offset < end) {
|
|
149
|
+
const entryStart = r.offset;
|
|
150
|
+
void entryStart;
|
|
151
|
+
const strLen = Number(r.readCWord());
|
|
152
|
+
const pathBytes = r.readBytes(strLen);
|
|
153
|
+
const path = new TextDecoder('utf-8').decode(pathBytes);
|
|
154
|
+
// Case-insensitive comparison per C original (strcasecmp)
|
|
155
|
+
if (path.toLowerCase() === objPath.toLowerCase()) {
|
|
156
|
+
const space = Number(r.readCWord());
|
|
157
|
+
const start = r.readCWord();
|
|
158
|
+
const length = r.readCWord();
|
|
159
|
+
return { start, length, space, flags: 0, path };
|
|
160
|
+
}
|
|
161
|
+
// Skip the 3 cwords (space, start, length)
|
|
162
|
+
r.readCWord();
|
|
163
|
+
r.readCWord();
|
|
164
|
+
r.readCWord();
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
/** Resolve a path to its ChmUnitInfo, or null if not found */
|
|
169
|
+
async resolve(objPath) {
|
|
170
|
+
let curPage = this.indexRoot;
|
|
171
|
+
while (curPage !== -1) {
|
|
172
|
+
const pageBuf = await this.fetchBytes(this.dirOffset + BigInt(curPage) * BigInt(this.blockLen), this.blockLen);
|
|
173
|
+
const sig = String.fromCharCode(pageBuf[0], pageBuf[1], pageBuf[2], pageBuf[3]);
|
|
174
|
+
if (sig === 'PMGL') {
|
|
175
|
+
return this.findInPmgl(pageBuf, objPath);
|
|
176
|
+
}
|
|
177
|
+
else if (sig === 'PMGI') {
|
|
178
|
+
curPage = this.findInPmgi(pageBuf, objPath);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
/** Retrieve (part of) an object's data */
|
|
187
|
+
async retrieve(ui, offset = 0n, length) {
|
|
188
|
+
if (offset < 0n || offset >= ui.length)
|
|
189
|
+
return new Uint8Array(0);
|
|
190
|
+
const len = length !== undefined
|
|
191
|
+
? (offset + length > ui.length ? ui.length - offset : length)
|
|
192
|
+
: ui.length - offset;
|
|
193
|
+
if (len <= 0n)
|
|
194
|
+
return new Uint8Array(0);
|
|
195
|
+
if (ui.space === ChmSpace.Uncompressed) {
|
|
196
|
+
return this.fetchBytes(this.dataOffset + ui.start + offset, Number(len));
|
|
197
|
+
}
|
|
198
|
+
// Compressed
|
|
199
|
+
if (!this.compressionEnabled)
|
|
200
|
+
return new Uint8Array(0);
|
|
201
|
+
return this.decompressRegion(ui.start + offset, len);
|
|
202
|
+
}
|
|
203
|
+
/** Get the compressed block bounds */
|
|
204
|
+
async getCmpBlockBounds(block) {
|
|
205
|
+
const tableBase = this.dataOffset + this.rtUnit.start + BigInt(this.resetTable.tableOffset);
|
|
206
|
+
const startBuf = await this.fetchBytes(tableBase + block * 8n, 8);
|
|
207
|
+
const startR = new BufferReader(startBuf);
|
|
208
|
+
const rawStart = startR.readBigUint64LE();
|
|
209
|
+
let rawEnd;
|
|
210
|
+
if (block < BigInt(this.resetTable.blockCount - 1)) {
|
|
211
|
+
const endBuf = await this.fetchBytes(tableBase + block * 8n + 8n, 8);
|
|
212
|
+
const endR = new BufferReader(endBuf);
|
|
213
|
+
rawEnd = endR.readBigUint64LE();
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
rawEnd = this.resetTable.compressedLen;
|
|
217
|
+
}
|
|
218
|
+
const len = rawEnd - rawStart;
|
|
219
|
+
const start = rawStart + this.dataOffset + this.cnUnit.start;
|
|
220
|
+
return { start, len };
|
|
221
|
+
}
|
|
222
|
+
/** Decompress one block into the cache slot. Must call in-order. */
|
|
223
|
+
async decompressOneBlock(blockIdx) {
|
|
224
|
+
const blockLen = Number(this.resetTable.blockLen);
|
|
225
|
+
const slot = blockIdx % this.cacheNumBlocks;
|
|
226
|
+
if (!this.cacheBlocks[slot]) {
|
|
227
|
+
this.cacheBlocks[slot] = new Uint8Array(blockLen);
|
|
228
|
+
}
|
|
229
|
+
this.cacheBlockIndices[slot] = BigInt(blockIdx);
|
|
230
|
+
const ubuf = this.cacheBlocks[slot];
|
|
231
|
+
const { start, len } = await this.getCmpBlockBounds(BigInt(blockIdx));
|
|
232
|
+
const cbuf = await this.fetchBytes(start, Number(len));
|
|
233
|
+
const res = lzxDecompress(this.lzxState, cbuf, ubuf, Number(len), blockLen);
|
|
234
|
+
if (res !== DECR_OK)
|
|
235
|
+
throw new Error(`LZX decompression failed for block ${blockIdx}: code ${res}`);
|
|
236
|
+
this.lzxLastBlock = blockIdx;
|
|
237
|
+
}
|
|
238
|
+
/** Decompress a single block into cache, return its data.
|
|
239
|
+
*
|
|
240
|
+
* Matches the C _chm_decompress_block logic:
|
|
241
|
+
* - Compute blockAlign = block % resetBlkCount
|
|
242
|
+
* - If lzxLastBlock is between block-blockAlign and block, reduce blockAlign
|
|
243
|
+
* - Decompress all preceding blocks in the reset window that haven't been done yet
|
|
244
|
+
*/
|
|
245
|
+
async decompressBlock(block) {
|
|
246
|
+
const blockIdx = Number(block);
|
|
247
|
+
// Lazy-init LZX state
|
|
248
|
+
if (!this.lzxState) {
|
|
249
|
+
// Compute windowBits from windowSize (must be power of 2 in [2^15..2^21])
|
|
250
|
+
let windowBits = 0;
|
|
251
|
+
let ws = this.windowSize;
|
|
252
|
+
while (ws > 1) {
|
|
253
|
+
ws >>>= 1;
|
|
254
|
+
windowBits++;
|
|
255
|
+
}
|
|
256
|
+
this.lzxState = new LZXState(windowBits);
|
|
257
|
+
this.lzxLastBlock = -1;
|
|
258
|
+
}
|
|
259
|
+
// blockAlign: how many blocks into the current reset interval
|
|
260
|
+
let blockAlign = blockIdx % this.resetBlkCount;
|
|
261
|
+
// If lzxLastBlock is within [block-blockAlign, block], we can resume from there
|
|
262
|
+
if (blockIdx - blockAlign <= this.lzxLastBlock && blockIdx >= this.lzxLastBlock) {
|
|
263
|
+
blockAlign = blockIdx - this.lzxLastBlock;
|
|
264
|
+
}
|
|
265
|
+
if (blockAlign !== 0) {
|
|
266
|
+
// Decompress all preceding blocks in this reset interval
|
|
267
|
+
for (let i = blockAlign; i > 0; i--) {
|
|
268
|
+
const curBlockIdx = blockIdx - i;
|
|
269
|
+
if (this.lzxLastBlock !== curBlockIdx) {
|
|
270
|
+
if (curBlockIdx % this.resetBlkCount === 0) {
|
|
271
|
+
this.lzxState.reset();
|
|
272
|
+
}
|
|
273
|
+
await this.decompressOneBlock(curBlockIdx);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// At start of reset interval
|
|
279
|
+
if (blockIdx % this.resetBlkCount === 0) {
|
|
280
|
+
this.lzxState.reset();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Decompress the target block
|
|
284
|
+
await this.decompressOneBlock(blockIdx);
|
|
285
|
+
return this.cacheBlocks[blockIdx % this.cacheNumBlocks];
|
|
286
|
+
}
|
|
287
|
+
/** Decompress a region from compressed space */
|
|
288
|
+
async decompressRegion(start, len) {
|
|
289
|
+
if (len <= 0n)
|
|
290
|
+
return new Uint8Array(0);
|
|
291
|
+
const blockLen = this.resetTable.blockLen;
|
|
292
|
+
const result = new Uint8Array(Number(len));
|
|
293
|
+
let written = 0n;
|
|
294
|
+
let remaining = len;
|
|
295
|
+
let pos = start;
|
|
296
|
+
while (remaining > 0n) {
|
|
297
|
+
const nBlock = pos / blockLen;
|
|
298
|
+
const nOffset = pos % blockLen;
|
|
299
|
+
let nLen = remaining;
|
|
300
|
+
if (nLen > blockLen - nOffset)
|
|
301
|
+
nLen = blockLen - nOffset;
|
|
302
|
+
// Check cache first
|
|
303
|
+
const slot = Number(nBlock % BigInt(this.cacheNumBlocks));
|
|
304
|
+
if (this.cacheBlocks[slot] !== null && this.cacheBlockIndices[slot] === nBlock) {
|
|
305
|
+
result.set(this.cacheBlocks[slot].subarray(Number(nOffset), Number(nOffset + nLen)), Number(written));
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
const ubuf = await this.decompressBlock(nBlock);
|
|
309
|
+
result.set(ubuf.subarray(Number(nOffset), Number(nOffset + nLen)), Number(written));
|
|
310
|
+
}
|
|
311
|
+
written += nLen;
|
|
312
|
+
remaining -= nLen;
|
|
313
|
+
pos += nLen;
|
|
314
|
+
}
|
|
315
|
+
return result;
|
|
316
|
+
}
|
|
317
|
+
/** Enumerate all entries in the archive */
|
|
318
|
+
async *enumerate(what = ChmEnumerateFlags.All) {
|
|
319
|
+
let curPage = this.indexHead;
|
|
320
|
+
while (curPage !== -1) {
|
|
321
|
+
const pageBuf = await this.fetchBytes(this.dirOffset + BigInt(curPage) * BigInt(this.blockLen), this.blockLen);
|
|
322
|
+
const header = unmarshalPmglHeader(pageBuf.subarray(0, 0x14));
|
|
323
|
+
const end = pageBuf.length - header.freeSpace;
|
|
324
|
+
const r = new BufferReader(pageBuf, 0x14);
|
|
325
|
+
while (r.offset < end) {
|
|
326
|
+
const entry = this.parsePmglEntry(r);
|
|
327
|
+
if (!entry)
|
|
328
|
+
break;
|
|
329
|
+
entry.flags = computeFlags(entry.path);
|
|
330
|
+
if (matchesFilter(entry.flags, what)) {
|
|
331
|
+
yield entry;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
curPage = header.blockNext;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/** Enumerate entries under a directory prefix */
|
|
338
|
+
async *enumerateDir(prefix, what = ChmEnumerateFlags.All) {
|
|
339
|
+
// Normalize prefix to end with /
|
|
340
|
+
let pfx = prefix;
|
|
341
|
+
if (pfx.length > 0 && !pfx.endsWith('/'))
|
|
342
|
+
pfx += '/';
|
|
343
|
+
let started = false;
|
|
344
|
+
for await (const entry of this.enumerate(ChmEnumerateFlags.All)) {
|
|
345
|
+
if (!started) {
|
|
346
|
+
// Look for the directory entry itself
|
|
347
|
+
if (entry.length === 0n && entry.path.toLowerCase().startsWith(pfx.toLowerCase())) {
|
|
348
|
+
started = true;
|
|
349
|
+
if (entry.path.length === pfx.length)
|
|
350
|
+
continue; // skip the dir entry itself
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
if (!entry.path.toLowerCase().startsWith(pfx.toLowerCase()))
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
if (matchesFilter(entry.flags, what)) {
|
|
361
|
+
yield entry;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/** Read the /#SYSTEM file as raw bytes for higher-level parsing */
|
|
366
|
+
async getSystemRaw() {
|
|
367
|
+
const ui = await this.resolve('/#SYSTEM');
|
|
368
|
+
if (!ui)
|
|
369
|
+
return null;
|
|
370
|
+
return this.retrieve(ui);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
function computeFlags(path) {
|
|
374
|
+
let flags = 0;
|
|
375
|
+
const lastChar = path[path.length - 1];
|
|
376
|
+
if (lastChar === '/') {
|
|
377
|
+
flags |= ChmEnumerateFlags.Dirs;
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
flags |= ChmEnumerateFlags.Files;
|
|
381
|
+
}
|
|
382
|
+
if (path[0] === '/') {
|
|
383
|
+
if (path.length > 1 && (path[1] === '#' || path[1] === '$')) {
|
|
384
|
+
flags |= ChmEnumerateFlags.Special;
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
flags |= ChmEnumerateFlags.Normal;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
flags |= ChmEnumerateFlags.Meta;
|
|
392
|
+
}
|
|
393
|
+
return flags;
|
|
394
|
+
}
|
|
395
|
+
function matchesFilter(flags, what) {
|
|
396
|
+
const typeBits = what & 0x7;
|
|
397
|
+
const filterBits = what & 0xf8;
|
|
398
|
+
if (!(typeBits & flags))
|
|
399
|
+
return false;
|
|
400
|
+
if (filterBits && !(filterBits & flags))
|
|
401
|
+
return false;
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=chm-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chm-file.js","sourceRoot":"","sources":["../src/chm-file.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|