7z-iterator 1.4.0 → 2.0.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/dist/cjs/index.d.cts +3 -3
- package/dist/cjs/index.d.ts +3 -3
- package/dist/cjs/index.js +7 -38
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/nextEntry.js +1 -2
- package/dist/cjs/nextEntry.js.map +1 -1
- package/dist/cjs/sevenz/codecs/index.js +52 -30
- package/dist/cjs/sevenz/codecs/index.js.map +1 -1
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.js +4 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/nextEntry.js +1 -2
- package/dist/esm/nextEntry.js.map +1 -1
- package/dist/esm/sevenz/codecs/index.js +32 -10
- package/dist/esm/sevenz/codecs/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/cjs/lzma/Lzma2ChunkParser.d.cts +0 -73
- package/dist/cjs/lzma/Lzma2ChunkParser.d.ts +0 -73
- package/dist/cjs/lzma/Lzma2ChunkParser.js +0 -148
- package/dist/cjs/lzma/Lzma2ChunkParser.js.map +0 -1
- package/dist/cjs/lzma/index.d.cts +0 -31
- package/dist/cjs/lzma/index.d.ts +0 -31
- package/dist/cjs/lzma/index.js +0 -83
- package/dist/cjs/lzma/index.js.map +0 -1
- package/dist/cjs/lzma/stream/transforms.d.cts +0 -46
- package/dist/cjs/lzma/stream/transforms.d.ts +0 -46
- package/dist/cjs/lzma/stream/transforms.js +0 -209
- package/dist/cjs/lzma/stream/transforms.js.map +0 -1
- package/dist/cjs/lzma/sync/Lzma2Decoder.d.cts +0 -63
- package/dist/cjs/lzma/sync/Lzma2Decoder.d.ts +0 -63
- package/dist/cjs/lzma/sync/Lzma2Decoder.js +0 -231
- package/dist/cjs/lzma/sync/Lzma2Decoder.js.map +0 -1
- package/dist/cjs/lzma/sync/LzmaDecoder.d.cts +0 -97
- package/dist/cjs/lzma/sync/LzmaDecoder.d.ts +0 -97
- package/dist/cjs/lzma/sync/LzmaDecoder.js +0 -580
- package/dist/cjs/lzma/sync/LzmaDecoder.js.map +0 -1
- package/dist/cjs/lzma/sync/RangeDecoder.d.cts +0 -69
- package/dist/cjs/lzma/sync/RangeDecoder.d.ts +0 -69
- package/dist/cjs/lzma/sync/RangeDecoder.js +0 -162
- package/dist/cjs/lzma/sync/RangeDecoder.js.map +0 -1
- package/dist/cjs/lzma/types.d.cts +0 -117
- package/dist/cjs/lzma/types.d.ts +0 -117
- package/dist/cjs/lzma/types.js +0 -264
- package/dist/cjs/lzma/types.js.map +0 -1
- package/dist/cjs/sevenz/codecs/Bcj.d.cts +0 -16
- package/dist/cjs/sevenz/codecs/Bcj.d.ts +0 -16
- package/dist/cjs/sevenz/codecs/Bcj.js +0 -183
- package/dist/cjs/sevenz/codecs/Bcj.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjArm.d.cts +0 -21
- package/dist/cjs/sevenz/codecs/BcjArm.d.ts +0 -21
- package/dist/cjs/sevenz/codecs/BcjArm.js +0 -104
- package/dist/cjs/sevenz/codecs/BcjArm.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjArm64.d.cts +0 -21
- package/dist/cjs/sevenz/codecs/BcjArm64.d.ts +0 -21
- package/dist/cjs/sevenz/codecs/BcjArm64.js +0 -65
- package/dist/cjs/sevenz/codecs/BcjArm64.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjArmt.d.cts +0 -19
- package/dist/cjs/sevenz/codecs/BcjArmt.d.ts +0 -19
- package/dist/cjs/sevenz/codecs/BcjArmt.js +0 -76
- package/dist/cjs/sevenz/codecs/BcjArmt.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjIa64.d.cts +0 -15
- package/dist/cjs/sevenz/codecs/BcjIa64.d.ts +0 -15
- package/dist/cjs/sevenz/codecs/BcjIa64.js +0 -141
- package/dist/cjs/sevenz/codecs/BcjIa64.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjPpc.d.cts +0 -20
- package/dist/cjs/sevenz/codecs/BcjPpc.d.ts +0 -20
- package/dist/cjs/sevenz/codecs/BcjPpc.js +0 -64
- package/dist/cjs/sevenz/codecs/BcjPpc.js.map +0 -1
- package/dist/cjs/sevenz/codecs/BcjSparc.d.cts +0 -19
- package/dist/cjs/sevenz/codecs/BcjSparc.d.ts +0 -19
- package/dist/cjs/sevenz/codecs/BcjSparc.js +0 -69
- package/dist/cjs/sevenz/codecs/BcjSparc.js.map +0 -1
- package/dist/cjs/sevenz/codecs/Delta.d.cts +0 -16
- package/dist/cjs/sevenz/codecs/Delta.d.ts +0 -16
- package/dist/cjs/sevenz/codecs/Delta.js +0 -74
- package/dist/cjs/sevenz/codecs/Delta.js.map +0 -1
- package/dist/cjs/sevenz/codecs/Lzma.d.cts +0 -17
- package/dist/cjs/sevenz/codecs/Lzma.d.ts +0 -17
- package/dist/cjs/sevenz/codecs/Lzma.js +0 -40
- package/dist/cjs/sevenz/codecs/Lzma.js.map +0 -1
- package/dist/cjs/sevenz/codecs/Lzma2.d.cts +0 -20
- package/dist/cjs/sevenz/codecs/Lzma2.d.ts +0 -20
- package/dist/cjs/sevenz/codecs/Lzma2.js +0 -42
- package/dist/cjs/sevenz/codecs/Lzma2.js.map +0 -1
- package/dist/cjs/xz/Decoder.d.cts +0 -25
- package/dist/cjs/xz/Decoder.d.ts +0 -25
- package/dist/cjs/xz/Decoder.js +0 -194
- package/dist/cjs/xz/Decoder.js.map +0 -1
- package/dist/esm/lzma/Lzma2ChunkParser.d.ts +0 -73
- package/dist/esm/lzma/Lzma2ChunkParser.js +0 -137
- package/dist/esm/lzma/Lzma2ChunkParser.js.map +0 -1
- package/dist/esm/lzma/index.d.ts +0 -31
- package/dist/esm/lzma/index.js +0 -44
- package/dist/esm/lzma/index.js.map +0 -1
- package/dist/esm/lzma/stream/transforms.d.ts +0 -46
- package/dist/esm/lzma/stream/transforms.js +0 -189
- package/dist/esm/lzma/stream/transforms.js.map +0 -1
- package/dist/esm/lzma/sync/Lzma2Decoder.d.ts +0 -63
- package/dist/esm/lzma/sync/Lzma2Decoder.js +0 -211
- package/dist/esm/lzma/sync/Lzma2Decoder.js.map +0 -1
- package/dist/esm/lzma/sync/LzmaDecoder.d.ts +0 -97
- package/dist/esm/lzma/sync/LzmaDecoder.js +0 -543
- package/dist/esm/lzma/sync/LzmaDecoder.js.map +0 -1
- package/dist/esm/lzma/sync/RangeDecoder.d.ts +0 -69
- package/dist/esm/lzma/sync/RangeDecoder.js +0 -132
- package/dist/esm/lzma/sync/RangeDecoder.js.map +0 -1
- package/dist/esm/lzma/types.d.ts +0 -117
- package/dist/esm/lzma/types.js +0 -154
- package/dist/esm/lzma/types.js.map +0 -1
- package/dist/esm/sevenz/codecs/Bcj.d.ts +0 -16
- package/dist/esm/sevenz/codecs/Bcj.js +0 -175
- package/dist/esm/sevenz/codecs/Bcj.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjArm.d.ts +0 -21
- package/dist/esm/sevenz/codecs/BcjArm.js +0 -101
- package/dist/esm/sevenz/codecs/BcjArm.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjArm64.d.ts +0 -21
- package/dist/esm/sevenz/codecs/BcjArm64.js +0 -57
- package/dist/esm/sevenz/codecs/BcjArm64.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjArmt.d.ts +0 -19
- package/dist/esm/sevenz/codecs/BcjArmt.js +0 -66
- package/dist/esm/sevenz/codecs/BcjArmt.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjIa64.d.ts +0 -15
- package/dist/esm/sevenz/codecs/BcjIa64.js +0 -127
- package/dist/esm/sevenz/codecs/BcjIa64.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjPpc.d.ts +0 -20
- package/dist/esm/sevenz/codecs/BcjPpc.js +0 -55
- package/dist/esm/sevenz/codecs/BcjPpc.js.map +0 -1
- package/dist/esm/sevenz/codecs/BcjSparc.d.ts +0 -19
- package/dist/esm/sevenz/codecs/BcjSparc.js +0 -59
- package/dist/esm/sevenz/codecs/BcjSparc.js.map +0 -1
- package/dist/esm/sevenz/codecs/Delta.d.ts +0 -16
- package/dist/esm/sevenz/codecs/Delta.js +0 -66
- package/dist/esm/sevenz/codecs/Delta.js.map +0 -1
- package/dist/esm/sevenz/codecs/Lzma.d.ts +0 -17
- package/dist/esm/sevenz/codecs/Lzma.js +0 -33
- package/dist/esm/sevenz/codecs/Lzma.js.map +0 -1
- package/dist/esm/sevenz/codecs/Lzma2.d.ts +0 -20
- package/dist/esm/sevenz/codecs/Lzma2.js +0 -38
- package/dist/esm/sevenz/codecs/Lzma2.js.map +0 -1
- package/dist/esm/xz/Decoder.d.ts +0 -25
- package/dist/esm/xz/Decoder.js +0 -185
- package/dist/esm/xz/Decoder.js.map +0 -1
package/dist/cjs/lzma/types.js
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LZMA Types and Constants
|
|
3
|
-
*
|
|
4
|
-
* Shared types, constants, and state transition functions for LZMA decoding.
|
|
5
|
-
* Based on the LZMA SDK specification.
|
|
6
|
-
*/ // LZMA State Machine Constants
|
|
7
|
-
"use strict";
|
|
8
|
-
Object.defineProperty(exports, "__esModule", {
|
|
9
|
-
value: true
|
|
10
|
-
});
|
|
11
|
-
function _export(target, all) {
|
|
12
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
_export(exports, {
|
|
18
|
-
get LZMA2_CONTROL () {
|
|
19
|
-
return LZMA2_CONTROL;
|
|
20
|
-
},
|
|
21
|
-
get getLenToPosState () {
|
|
22
|
-
return getLenToPosState;
|
|
23
|
-
},
|
|
24
|
-
get initBitModels () {
|
|
25
|
-
return initBitModels;
|
|
26
|
-
},
|
|
27
|
-
get kAlignMask () {
|
|
28
|
-
return kAlignMask;
|
|
29
|
-
},
|
|
30
|
-
get kAlignTableSize () {
|
|
31
|
-
return kAlignTableSize;
|
|
32
|
-
},
|
|
33
|
-
get kBitModelTotal () {
|
|
34
|
-
return kBitModelTotal;
|
|
35
|
-
},
|
|
36
|
-
get kDicLogSizeMin () {
|
|
37
|
-
return kDicLogSizeMin;
|
|
38
|
-
},
|
|
39
|
-
get kEndPosModelIndex () {
|
|
40
|
-
return kEndPosModelIndex;
|
|
41
|
-
},
|
|
42
|
-
get kMatchMaxLen () {
|
|
43
|
-
return kMatchMaxLen;
|
|
44
|
-
},
|
|
45
|
-
get kMatchMinLen () {
|
|
46
|
-
return kMatchMinLen;
|
|
47
|
-
},
|
|
48
|
-
get kNumAlignBits () {
|
|
49
|
-
return kNumAlignBits;
|
|
50
|
-
},
|
|
51
|
-
get kNumBitModelTotalBits () {
|
|
52
|
-
return kNumBitModelTotalBits;
|
|
53
|
-
},
|
|
54
|
-
get kNumFullDistances () {
|
|
55
|
-
return kNumFullDistances;
|
|
56
|
-
},
|
|
57
|
-
get kNumHighLenBits () {
|
|
58
|
-
return kNumHighLenBits;
|
|
59
|
-
},
|
|
60
|
-
get kNumLenSymbols () {
|
|
61
|
-
return kNumLenSymbols;
|
|
62
|
-
},
|
|
63
|
-
get kNumLenToPosStates () {
|
|
64
|
-
return kNumLenToPosStates;
|
|
65
|
-
},
|
|
66
|
-
get kNumLenToPosStatesBits () {
|
|
67
|
-
return kNumLenToPosStatesBits;
|
|
68
|
-
},
|
|
69
|
-
get kNumLitContextBitsMax () {
|
|
70
|
-
return kNumLitContextBitsMax;
|
|
71
|
-
},
|
|
72
|
-
get kNumLitPosStatesBitsEncodingMax () {
|
|
73
|
-
return kNumLitPosStatesBitsEncodingMax;
|
|
74
|
-
},
|
|
75
|
-
get kNumLowLenBits () {
|
|
76
|
-
return kNumLowLenBits;
|
|
77
|
-
},
|
|
78
|
-
get kNumLowLenSymbols () {
|
|
79
|
-
return kNumLowLenSymbols;
|
|
80
|
-
},
|
|
81
|
-
get kNumMidLenBits () {
|
|
82
|
-
return kNumMidLenBits;
|
|
83
|
-
},
|
|
84
|
-
get kNumMidLenSymbols () {
|
|
85
|
-
return kNumMidLenSymbols;
|
|
86
|
-
},
|
|
87
|
-
get kNumMoveBits () {
|
|
88
|
-
return kNumMoveBits;
|
|
89
|
-
},
|
|
90
|
-
get kNumPosModels () {
|
|
91
|
-
return kNumPosModels;
|
|
92
|
-
},
|
|
93
|
-
get kNumPosSlotBits () {
|
|
94
|
-
return kNumPosSlotBits;
|
|
95
|
-
},
|
|
96
|
-
get kNumPosStatesBitsEncodingMax () {
|
|
97
|
-
return kNumPosStatesBitsEncodingMax;
|
|
98
|
-
},
|
|
99
|
-
get kNumPosStatesBitsMax () {
|
|
100
|
-
return kNumPosStatesBitsMax;
|
|
101
|
-
},
|
|
102
|
-
get kNumPosStatesEncodingMax () {
|
|
103
|
-
return kNumPosStatesEncodingMax;
|
|
104
|
-
},
|
|
105
|
-
get kNumPosStatesMax () {
|
|
106
|
-
return kNumPosStatesMax;
|
|
107
|
-
},
|
|
108
|
-
get kNumRepDistances () {
|
|
109
|
-
return kNumRepDistances;
|
|
110
|
-
},
|
|
111
|
-
get kNumStates () {
|
|
112
|
-
return kNumStates;
|
|
113
|
-
},
|
|
114
|
-
get kProbInitValue () {
|
|
115
|
-
return kProbInitValue;
|
|
116
|
-
},
|
|
117
|
-
get kStartPosModelIndex () {
|
|
118
|
-
return kStartPosModelIndex;
|
|
119
|
-
},
|
|
120
|
-
get lzma2IsUncompressed () {
|
|
121
|
-
return lzma2IsUncompressed;
|
|
122
|
-
},
|
|
123
|
-
get lzma2NeedsNewProps () {
|
|
124
|
-
return lzma2NeedsNewProps;
|
|
125
|
-
},
|
|
126
|
-
get lzma2NeedsResetProbs () {
|
|
127
|
-
return lzma2NeedsResetProbs;
|
|
128
|
-
},
|
|
129
|
-
get parseLzma2DictionarySize () {
|
|
130
|
-
return parseLzma2DictionarySize;
|
|
131
|
-
},
|
|
132
|
-
get parseProperties () {
|
|
133
|
-
return parseProperties;
|
|
134
|
-
},
|
|
135
|
-
get stateIsCharState () {
|
|
136
|
-
return stateIsCharState;
|
|
137
|
-
},
|
|
138
|
-
get stateUpdateChar () {
|
|
139
|
-
return stateUpdateChar;
|
|
140
|
-
},
|
|
141
|
-
get stateUpdateMatch () {
|
|
142
|
-
return stateUpdateMatch;
|
|
143
|
-
},
|
|
144
|
-
get stateUpdateRep () {
|
|
145
|
-
return stateUpdateRep;
|
|
146
|
-
},
|
|
147
|
-
get stateUpdateShortRep () {
|
|
148
|
-
return stateUpdateShortRep;
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
var kNumRepDistances = 4;
|
|
152
|
-
var kNumStates = 12;
|
|
153
|
-
var kNumPosSlotBits = 6;
|
|
154
|
-
var kDicLogSizeMin = 0;
|
|
155
|
-
var kNumLenToPosStatesBits = 2;
|
|
156
|
-
var kNumLenToPosStates = 1 << kNumLenToPosStatesBits; // 4
|
|
157
|
-
var kMatchMinLen = 2;
|
|
158
|
-
var kNumLowLenBits = 3;
|
|
159
|
-
var kNumMidLenBits = 3;
|
|
160
|
-
var kNumHighLenBits = 8;
|
|
161
|
-
var kNumLowLenSymbols = 1 << kNumLowLenBits; // 8
|
|
162
|
-
var kNumMidLenSymbols = 1 << kNumMidLenBits; // 8
|
|
163
|
-
var kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + (1 << kNumHighLenBits); // 272
|
|
164
|
-
var kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; // 273
|
|
165
|
-
var kNumAlignBits = 4;
|
|
166
|
-
var kAlignTableSize = 1 << kNumAlignBits; // 16
|
|
167
|
-
var kAlignMask = kAlignTableSize - 1; // 15
|
|
168
|
-
var kStartPosModelIndex = 4;
|
|
169
|
-
var kEndPosModelIndex = 14;
|
|
170
|
-
var kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; // 10
|
|
171
|
-
var kNumFullDistances = 1 << (kEndPosModelIndex >>> 1); // 128
|
|
172
|
-
var kNumLitPosStatesBitsEncodingMax = 4;
|
|
173
|
-
var kNumLitContextBitsMax = 8;
|
|
174
|
-
var kNumPosStatesBitsMax = 4;
|
|
175
|
-
var kNumPosStatesMax = 1 << kNumPosStatesBitsMax; // 16
|
|
176
|
-
var kNumPosStatesBitsEncodingMax = 4;
|
|
177
|
-
var kNumPosStatesEncodingMax = 1 << kNumPosStatesBitsEncodingMax; // 16
|
|
178
|
-
var kNumBitModelTotalBits = 11;
|
|
179
|
-
var kBitModelTotal = 1 << kNumBitModelTotalBits; // 2048
|
|
180
|
-
var kNumMoveBits = 5;
|
|
181
|
-
var kProbInitValue = kBitModelTotal >>> 1; // 1024
|
|
182
|
-
function stateUpdateChar(state) {
|
|
183
|
-
if (state < 4) return 0;
|
|
184
|
-
if (state < 10) return state - 3;
|
|
185
|
-
return state - 6;
|
|
186
|
-
}
|
|
187
|
-
function stateUpdateMatch(state) {
|
|
188
|
-
return state < 7 ? 7 : 10;
|
|
189
|
-
}
|
|
190
|
-
function stateUpdateRep(state) {
|
|
191
|
-
return state < 7 ? 8 : 11;
|
|
192
|
-
}
|
|
193
|
-
function stateUpdateShortRep(state) {
|
|
194
|
-
return state < 7 ? 9 : 11;
|
|
195
|
-
}
|
|
196
|
-
function stateIsCharState(state) {
|
|
197
|
-
return state < 7;
|
|
198
|
-
}
|
|
199
|
-
function getLenToPosState(len) {
|
|
200
|
-
len -= kMatchMinLen;
|
|
201
|
-
return len < kNumLenToPosStates ? len : kNumLenToPosStates - 1;
|
|
202
|
-
}
|
|
203
|
-
function initBitModels(probs, count) {
|
|
204
|
-
if (probs === null) {
|
|
205
|
-
if (count === undefined) {
|
|
206
|
-
throw new Error('count required when probs is null');
|
|
207
|
-
}
|
|
208
|
-
probs = new Uint16Array(count);
|
|
209
|
-
}
|
|
210
|
-
for(var i = 0; i < probs.length; i++){
|
|
211
|
-
probs[i] = kProbInitValue;
|
|
212
|
-
}
|
|
213
|
-
return probs;
|
|
214
|
-
}
|
|
215
|
-
function parseProperties(properties) {
|
|
216
|
-
if (properties.length < 5) {
|
|
217
|
-
throw new Error('LZMA properties must be at least 5 bytes');
|
|
218
|
-
}
|
|
219
|
-
var d = properties[0] & 0xff;
|
|
220
|
-
var lc = d % 9;
|
|
221
|
-
var remainder = ~~(d / 9);
|
|
222
|
-
var lp = remainder % 5;
|
|
223
|
-
var pb = ~~(remainder / 5);
|
|
224
|
-
if (lc > kNumLitContextBitsMax || lp > 4 || pb > kNumPosStatesBitsMax) {
|
|
225
|
-
throw new Error('Invalid LZMA properties');
|
|
226
|
-
}
|
|
227
|
-
var dictionarySize = 0;
|
|
228
|
-
for(var i = 0; i < 4; i++){
|
|
229
|
-
dictionarySize |= (properties[1 + i] & 0xff) << i * 8;
|
|
230
|
-
}
|
|
231
|
-
return {
|
|
232
|
-
lc: lc,
|
|
233
|
-
lp: lp,
|
|
234
|
-
pb: pb,
|
|
235
|
-
dictionarySize: dictionarySize
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
var LZMA2_CONTROL = {
|
|
239
|
-
END: 0x00,
|
|
240
|
-
UNCOMPRESSED_RESET_DIC: 0x01,
|
|
241
|
-
UNCOMPRESSED: 0x02,
|
|
242
|
-
LZMA_RESET_STATE_NEW_PROP: 0xe0
|
|
243
|
-
};
|
|
244
|
-
function lzma2NeedsNewProps(control) {
|
|
245
|
-
return control >= 0xe0;
|
|
246
|
-
}
|
|
247
|
-
function lzma2NeedsResetProbs(control) {
|
|
248
|
-
return control >= 0xa0;
|
|
249
|
-
}
|
|
250
|
-
function lzma2IsUncompressed(control) {
|
|
251
|
-
return control < 0x80;
|
|
252
|
-
}
|
|
253
|
-
function parseLzma2DictionarySize(prop) {
|
|
254
|
-
if (prop > 40) {
|
|
255
|
-
throw new Error('Invalid LZMA2 dictionary size property');
|
|
256
|
-
}
|
|
257
|
-
if (prop === 40) {
|
|
258
|
-
return 0xffffffff;
|
|
259
|
-
}
|
|
260
|
-
var base = 2 | prop & 1;
|
|
261
|
-
var exp = (prop >>> 1) + 11;
|
|
262
|
-
return base << exp;
|
|
263
|
-
}
|
|
264
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/lzma/types.ts"],"sourcesContent":["/**\n * LZMA Types and Constants\n *\n * Shared types, constants, and state transition functions for LZMA decoding.\n * Based on the LZMA SDK specification.\n */\n\n// LZMA State Machine Constants\nexport const kNumRepDistances = 4;\nexport const kNumStates = 12;\n\n// Position slot constants\nexport const kNumPosSlotBits = 6;\nexport const kDicLogSizeMin = 0;\nexport const kNumLenToPosStatesBits = 2;\nexport const kNumLenToPosStates = 1 << kNumLenToPosStatesBits; // 4\n\n// Match length constants\nexport const kMatchMinLen = 2;\nexport const kNumLowLenBits = 3;\nexport const kNumMidLenBits = 3;\nexport const kNumHighLenBits = 8;\nexport const kNumLowLenSymbols = 1 << kNumLowLenBits; // 8\nexport const kNumMidLenSymbols = 1 << kNumMidLenBits; // 8\nexport const kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + (1 << kNumHighLenBits); // 272\nexport const kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; // 273\n\n// Alignment constants\nexport const kNumAlignBits = 4;\nexport const kAlignTableSize = 1 << kNumAlignBits; // 16\nexport const kAlignMask = kAlignTableSize - 1; // 15\n\n// Position model constants\nexport const kStartPosModelIndex = 4;\nexport const kEndPosModelIndex = 14;\nexport const kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; // 10\nexport const kNumFullDistances = 1 << (kEndPosModelIndex >>> 1); // 128\n\n// Literal/pos state constants\nexport const kNumLitPosStatesBitsEncodingMax = 4;\nexport const kNumLitContextBitsMax = 8;\nexport const kNumPosStatesBitsMax = 4;\nexport const kNumPosStatesMax = 1 << kNumPosStatesBitsMax; // 16\nexport const kNumPosStatesBitsEncodingMax = 4;\nexport const kNumPosStatesEncodingMax = 1 << kNumPosStatesBitsEncodingMax; // 16\n\n// Range coder probability constants\nexport const kNumBitModelTotalBits = 11;\nexport const kBitModelTotal = 1 << kNumBitModelTotalBits; // 2048\nexport const kNumMoveBits = 5;\nexport const kProbInitValue = kBitModelTotal >>> 1; // 1024\n\n/**\n * State transition: after literal byte\n */\nexport function stateUpdateChar(state: number): number {\n if (state < 4) return 0;\n if (state < 10) return state - 3;\n return state - 6;\n}\n\n/**\n * State transition: after match\n */\nexport function stateUpdateMatch(state: number): number {\n return state < 7 ? 7 : 10;\n}\n\n/**\n * State transition: after rep (repeated match)\n */\nexport function stateUpdateRep(state: number): number {\n return state < 7 ? 8 : 11;\n}\n\n/**\n * State transition: after short rep\n */\nexport function stateUpdateShortRep(state: number): number {\n return state < 7 ? 9 : 11;\n}\n\n/**\n * Check if state indicates previous symbol was a character (literal)\n */\nexport function stateIsCharState(state: number): boolean {\n return state < 7;\n}\n\n/**\n * Get length-to-position state index\n */\nexport function getLenToPosState(len: number): number {\n len -= kMatchMinLen;\n return len < kNumLenToPosStates ? len : kNumLenToPosStates - 1;\n}\n\n/**\n * Initialize probability array with default values\n * @param probs - Array to initialize (or null to create new)\n * @param count - Number of probabilities\n * @returns Initialized probability array\n */\nexport function initBitModels(probs: Uint16Array | null, count?: number): Uint16Array {\n if (probs === null) {\n if (count === undefined) {\n throw new Error('count required when probs is null');\n }\n probs = new Uint16Array(count);\n }\n for (let i = 0; i < probs.length; i++) {\n probs[i] = kProbInitValue;\n }\n return probs;\n}\n\n/**\n * LZMA properties parsed from the 5-byte header\n */\nexport interface LzmaProperties {\n /** Literal context bits (0-8) */\n lc: number;\n /** Literal pos bits (0-4) */\n lp: number;\n /** Pos bits (0-4) */\n pb: number;\n /** Dictionary size in bytes */\n dictionarySize: number;\n}\n\n/**\n * Parse LZMA properties from a 5-byte buffer\n */\nexport function parseProperties(properties: Buffer | Uint8Array): LzmaProperties {\n if (properties.length < 5) {\n throw new Error('LZMA properties must be at least 5 bytes');\n }\n\n const d = properties[0] & 0xff;\n const lc = d % 9;\n const remainder = ~~(d / 9);\n const lp = remainder % 5;\n const pb = ~~(remainder / 5);\n\n if (lc > kNumLitContextBitsMax || lp > 4 || pb > kNumPosStatesBitsMax) {\n throw new Error('Invalid LZMA properties');\n }\n\n let dictionarySize = 0;\n for (let i = 0; i < 4; i++) {\n dictionarySize |= (properties[1 + i] & 0xff) << (i * 8);\n }\n\n return { lc, lp, pb, dictionarySize };\n}\n\n/**\n * LZMA2 control byte meanings\n */\nexport const LZMA2_CONTROL = {\n END: 0x00,\n UNCOMPRESSED_RESET_DIC: 0x01,\n UNCOMPRESSED: 0x02,\n LZMA_RESET_STATE_NEW_PROP: 0xe0,\n} as const;\n\n/**\n * Check if LZMA2 control byte indicates reset state (new properties)\n */\nexport function lzma2NeedsNewProps(control: number): boolean {\n return control >= 0xe0;\n}\n\n/**\n * Check if LZMA2 control byte indicates reset probabilities\n */\nexport function lzma2NeedsResetProbs(control: number): boolean {\n return control >= 0xa0;\n}\n\n/**\n * Check if LZMA2 control byte indicates uncompressed chunk\n */\nexport function lzma2IsUncompressed(control: number): boolean {\n return control < 0x80;\n}\n\n/**\n * Parse LZMA2 dictionary size from property byte\n */\nexport function parseLzma2DictionarySize(prop: number): number {\n if (prop > 40) {\n throw new Error('Invalid LZMA2 dictionary size property');\n }\n if (prop === 40) {\n return 0xffffffff;\n }\n const base = 2 | (prop & 1);\n const exp = (prop >>> 1) + 11;\n return base << exp;\n}\n\n/**\n * Output sink interface for fast streaming decode\n * Can be a Buffer (with write method) or a stream with write() method\n */\nexport interface OutputSink {\n write(buffer: Buffer): void;\n}\n"],"names":["LZMA2_CONTROL","getLenToPosState","initBitModels","kAlignMask","kAlignTableSize","kBitModelTotal","kDicLogSizeMin","kEndPosModelIndex","kMatchMaxLen","kMatchMinLen","kNumAlignBits","kNumBitModelTotalBits","kNumFullDistances","kNumHighLenBits","kNumLenSymbols","kNumLenToPosStates","kNumLenToPosStatesBits","kNumLitContextBitsMax","kNumLitPosStatesBitsEncodingMax","kNumLowLenBits","kNumLowLenSymbols","kNumMidLenBits","kNumMidLenSymbols","kNumMoveBits","kNumPosModels","kNumPosSlotBits","kNumPosStatesBitsEncodingMax","kNumPosStatesBitsMax","kNumPosStatesEncodingMax","kNumPosStatesMax","kNumRepDistances","kNumStates","kProbInitValue","kStartPosModelIndex","lzma2IsUncompressed","lzma2NeedsNewProps","lzma2NeedsResetProbs","parseLzma2DictionarySize","parseProperties","stateIsCharState","stateUpdateChar","stateUpdateMatch","stateUpdateRep","stateUpdateShortRep","state","len","probs","count","undefined","Error","Uint16Array","i","length","properties","d","lc","remainder","lp","pb","dictionarySize","END","UNCOMPRESSED_RESET_DIC","UNCOMPRESSED","LZMA_RESET_STATE_NEW_PROP","control","prop","base","exp"],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Transform } from 'extract-base-iterator';
|
|
2
|
-
/**
|
|
3
|
-
* Decode BCJ (x86) filtered data (synchronous, for buffered use)
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* @param input - BCJ filtered data
|
|
7
|
-
* @param _properties - Unused for BCJ
|
|
8
|
-
* @param _unpackSize - Unused for BCJ
|
|
9
|
-
* @returns Unfiltered data
|
|
10
|
-
*/
|
|
11
|
-
export declare function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
12
|
-
/**
|
|
13
|
-
* Create a streaming BCJ decoder Transform.
|
|
14
|
-
* Processes data chunk by chunk, buffering incomplete instructions.
|
|
15
|
-
*/
|
|
16
|
-
export declare function createBcjDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform>;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Transform } from 'extract-base-iterator';
|
|
2
|
-
/**
|
|
3
|
-
* Decode BCJ (x86) filtered data (synchronous, for buffered use)
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* @param input - BCJ filtered data
|
|
7
|
-
* @param _properties - Unused for BCJ
|
|
8
|
-
* @param _unpackSize - Unused for BCJ
|
|
9
|
-
* @returns Unfiltered data
|
|
10
|
-
*/
|
|
11
|
-
export declare function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
12
|
-
/**
|
|
13
|
-
* Create a streaming BCJ decoder Transform.
|
|
14
|
-
* Processes data chunk by chunk, buffering incomplete instructions.
|
|
15
|
-
*/
|
|
16
|
-
export declare function createBcjDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform>;
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
// BCJ (x86) filter codec - converts x86 CALL/JMP relative addresses
|
|
2
|
-
// This is a simple filter that makes executables more compressible by LZMA
|
|
3
|
-
//
|
|
4
|
-
// BCJ transforms relative addresses in x86 CALL (0xE8) and JMP (0xE9) instructions
|
|
5
|
-
// to absolute addresses, which creates more repetitive patterns for compression.
|
|
6
|
-
//
|
|
7
|
-
// Reference: https://github.com/jljusten/LZMA-SDK/blob/master/C/Bra86.c
|
|
8
|
-
//
|
|
9
|
-
// This implementation uses true streaming - processes data chunk by chunk
|
|
10
|
-
// while buffering incomplete instructions across chunk boundaries.
|
|
11
|
-
"use strict";
|
|
12
|
-
Object.defineProperty(exports, "__esModule", {
|
|
13
|
-
value: true
|
|
14
|
-
});
|
|
15
|
-
function _export(target, all) {
|
|
16
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
_export(exports, {
|
|
22
|
-
get createBcjDecoder () {
|
|
23
|
-
return createBcjDecoder;
|
|
24
|
-
},
|
|
25
|
-
get decodeBcj () {
|
|
26
|
-
return decodeBcj;
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
var _extractbaseiterator = require("extract-base-iterator");
|
|
30
|
-
function decodeBcj(input, _properties, _unpackSize) {
|
|
31
|
-
// BCJ filter state
|
|
32
|
-
var pos = 0;
|
|
33
|
-
var prevMask = 0;
|
|
34
|
-
var output = (0, _extractbaseiterator.bufferFrom)(input); // Copy since we modify in place
|
|
35
|
-
while(pos < output.length - 4){
|
|
36
|
-
var b = output[pos];
|
|
37
|
-
// Check for CALL (0xE8) or JMP (0xE9) opcode
|
|
38
|
-
if (b !== 0xe8 && b !== 0xe9) {
|
|
39
|
-
pos++;
|
|
40
|
-
prevMask = 0;
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
// Check mask to avoid false positives in data
|
|
44
|
-
var offset = pos + 5;
|
|
45
|
-
if (offset > output.length) {
|
|
46
|
-
break;
|
|
47
|
-
}
|
|
48
|
-
// Skip if in masked region (previous conversion affected this area)
|
|
49
|
-
if ((prevMask & 1) !== 0) {
|
|
50
|
-
prevMask = prevMask >> 1 | 4;
|
|
51
|
-
pos++;
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
// Read the 32-bit address (little-endian)
|
|
55
|
-
var addr = output[pos + 1] | output[pos + 2] << 8 | output[pos + 3] << 16 | output[pos + 4] << 24 >>> 0;
|
|
56
|
-
// Check if this looks like a converted address
|
|
57
|
-
// High byte should be 0x00 or 0xFF for typical code
|
|
58
|
-
var highByte = output[pos + 4];
|
|
59
|
-
if (highByte === 0x00 || highByte === 0xff) {
|
|
60
|
-
// Convert absolute to relative
|
|
61
|
-
var newAddr = void 0;
|
|
62
|
-
if (highByte === 0x00) {
|
|
63
|
-
// Positive offset - subtract position
|
|
64
|
-
newAddr = addr - pos;
|
|
65
|
-
} else {
|
|
66
|
-
// Negative offset (0xFF high byte)
|
|
67
|
-
newAddr = addr + pos;
|
|
68
|
-
}
|
|
69
|
-
// Write back as little-endian
|
|
70
|
-
output[pos + 1] = newAddr & 0xff;
|
|
71
|
-
output[pos + 2] = newAddr >>> 8 & 0xff;
|
|
72
|
-
output[pos + 3] = newAddr >>> 16 & 0xff;
|
|
73
|
-
output[pos + 4] = newAddr >>> 24 & 0xff;
|
|
74
|
-
pos += 5;
|
|
75
|
-
prevMask = 0;
|
|
76
|
-
} else {
|
|
77
|
-
pos++;
|
|
78
|
-
prevMask = 0;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return output;
|
|
82
|
-
}
|
|
83
|
-
function createBcjDecoder(_properties, _unpackSize) {
|
|
84
|
-
// State that persists across chunks
|
|
85
|
-
var globalPos = 0; // Position in the overall stream
|
|
86
|
-
var prevMask = 0;
|
|
87
|
-
var pending = null; // Bytes pending from previous chunk
|
|
88
|
-
var transform = new _extractbaseiterator.Transform({
|
|
89
|
-
transform: function(chunk, _encoding, callback) {
|
|
90
|
-
// Combine pending bytes with new chunk
|
|
91
|
-
var data;
|
|
92
|
-
if (pending && pending.length > 0) {
|
|
93
|
-
data = Buffer.concat([
|
|
94
|
-
pending,
|
|
95
|
-
chunk
|
|
96
|
-
]);
|
|
97
|
-
} else {
|
|
98
|
-
data = chunk;
|
|
99
|
-
}
|
|
100
|
-
// We need at least 5 bytes to process an instruction
|
|
101
|
-
// Keep the last 4 bytes as pending in case an instruction spans chunks
|
|
102
|
-
var safeEnd = data.length - 4;
|
|
103
|
-
if (safeEnd <= 0) {
|
|
104
|
-
// Not enough data yet, keep it all pending
|
|
105
|
-
pending = data;
|
|
106
|
-
callback(null, (0, _extractbaseiterator.allocBuffer)(0));
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
var output = (0, _extractbaseiterator.bufferFrom)(data.slice(0, safeEnd)); // Copy the portion we'll process
|
|
110
|
-
pending = data.slice(safeEnd); // Keep last 4 bytes for next chunk
|
|
111
|
-
var localPos = 0;
|
|
112
|
-
while(localPos < output.length){
|
|
113
|
-
var b = output[localPos];
|
|
114
|
-
// Check for CALL (0xE8) or JMP (0xE9) opcode
|
|
115
|
-
if (b !== 0xe8 && b !== 0xe9) {
|
|
116
|
-
localPos++;
|
|
117
|
-
globalPos++;
|
|
118
|
-
prevMask = 0;
|
|
119
|
-
continue;
|
|
120
|
-
}
|
|
121
|
-
// Check if we have enough bytes for the full instruction
|
|
122
|
-
if (localPos + 5 > output.length + pending.length) {
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
// Skip if in masked region
|
|
126
|
-
if ((prevMask & 1) !== 0) {
|
|
127
|
-
prevMask = prevMask >> 1 | 4;
|
|
128
|
-
localPos++;
|
|
129
|
-
globalPos++;
|
|
130
|
-
continue;
|
|
131
|
-
}
|
|
132
|
-
// Get the 4 address bytes (might span into pending)
|
|
133
|
-
var addr = void 0;
|
|
134
|
-
var highByte = void 0;
|
|
135
|
-
if (localPos + 5 <= output.length) {
|
|
136
|
-
addr = output[localPos + 1] | output[localPos + 2] << 8 | output[localPos + 3] << 16 | output[localPos + 4] << 24 >>> 0;
|
|
137
|
-
highByte = output[localPos + 4];
|
|
138
|
-
} else {
|
|
139
|
-
// Address spans output and pending - shouldn't happen with safeEnd
|
|
140
|
-
localPos++;
|
|
141
|
-
globalPos++;
|
|
142
|
-
prevMask = 0;
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
if (highByte === 0x00 || highByte === 0xff) {
|
|
146
|
-
// Convert absolute to relative
|
|
147
|
-
var newAddr = void 0;
|
|
148
|
-
if (highByte === 0x00) {
|
|
149
|
-
newAddr = addr - globalPos;
|
|
150
|
-
} else {
|
|
151
|
-
newAddr = addr + globalPos;
|
|
152
|
-
}
|
|
153
|
-
// Write back as little-endian
|
|
154
|
-
output[localPos + 1] = newAddr & 0xff;
|
|
155
|
-
output[localPos + 2] = newAddr >>> 8 & 0xff;
|
|
156
|
-
output[localPos + 3] = newAddr >>> 16 & 0xff;
|
|
157
|
-
output[localPos + 4] = newAddr >>> 24 & 0xff;
|
|
158
|
-
localPos += 5;
|
|
159
|
-
globalPos += 5;
|
|
160
|
-
prevMask = 0;
|
|
161
|
-
} else {
|
|
162
|
-
localPos++;
|
|
163
|
-
globalPos++;
|
|
164
|
-
prevMask = 0;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
callback(null, output);
|
|
168
|
-
},
|
|
169
|
-
flush: function flush(callback) {
|
|
170
|
-
// Output any remaining pending bytes
|
|
171
|
-
if (pending && pending.length > 0) {
|
|
172
|
-
// Process the final bytes - no need to worry about spanning
|
|
173
|
-
var output = (0, _extractbaseiterator.bufferFrom)(pending);
|
|
174
|
-
// Don't convert anything in the final bytes since we can't know
|
|
175
|
-
// if they're complete instructions
|
|
176
|
-
this.push(output);
|
|
177
|
-
}
|
|
178
|
-
callback(null);
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
return transform;
|
|
182
|
-
}
|
|
183
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Bcj.ts"],"sourcesContent":["// BCJ (x86) filter codec - converts x86 CALL/JMP relative addresses\n// This is a simple filter that makes executables more compressible by LZMA\n//\n// BCJ transforms relative addresses in x86 CALL (0xE8) and JMP (0xE9) instructions\n// to absolute addresses, which creates more repetitive patterns for compression.\n//\n// Reference: https://github.com/jljusten/LZMA-SDK/blob/master/C/Bra86.c\n//\n// This implementation uses true streaming - processes data chunk by chunk\n// while buffering incomplete instructions across chunk boundaries.\n\nimport { allocBuffer, bufferFrom, Transform } from 'extract-base-iterator';\n\n/**\n * Decode BCJ (x86) filtered data (synchronous, for buffered use)\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * @param input - BCJ filtered data\n * @param _properties - Unused for BCJ\n * @param _unpackSize - Unused for BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n // BCJ filter state\n let pos = 0;\n let prevMask = 0;\n const output = bufferFrom(input); // Copy since we modify in place\n\n while (pos < output.length - 4) {\n const b = output[pos];\n\n // Check for CALL (0xE8) or JMP (0xE9) opcode\n if (b !== 0xe8 && b !== 0xe9) {\n pos++;\n prevMask = 0;\n continue;\n }\n\n // Check mask to avoid false positives in data\n const offset = pos + 5;\n if (offset > output.length) {\n break;\n }\n\n // Skip if in masked region (previous conversion affected this area)\n if ((prevMask & 1) !== 0) {\n prevMask = (prevMask >> 1) | 4;\n pos++;\n continue;\n }\n\n // Read the 32-bit address (little-endian)\n const addr = output[pos + 1] | (output[pos + 2] << 8) | (output[pos + 3] << 16) | ((output[pos + 4] << 24) >>> 0);\n\n // Check if this looks like a converted address\n // High byte should be 0x00 or 0xFF for typical code\n const highByte = output[pos + 4];\n\n if (highByte === 0x00 || highByte === 0xff) {\n // Convert absolute to relative\n let newAddr: number;\n if (highByte === 0x00) {\n // Positive offset - subtract position\n newAddr = addr - pos;\n } else {\n // Negative offset (0xFF high byte)\n newAddr = addr + pos;\n }\n\n // Write back as little-endian\n output[pos + 1] = newAddr & 0xff;\n output[pos + 2] = (newAddr >>> 8) & 0xff;\n output[pos + 3] = (newAddr >>> 16) & 0xff;\n output[pos + 4] = (newAddr >>> 24) & 0xff;\n\n pos += 5;\n prevMask = 0;\n } else {\n pos++;\n prevMask = 0;\n }\n }\n\n return output;\n}\n\n/**\n * Create a streaming BCJ decoder Transform.\n * Processes data chunk by chunk, buffering incomplete instructions.\n */\nexport function createBcjDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform> {\n // State that persists across chunks\n let globalPos = 0; // Position in the overall stream\n let prevMask = 0;\n let pending: Buffer | null = null; // Bytes pending from previous chunk\n\n const transform = new Transform({\n transform: (chunk: Buffer, _encoding: string, callback: (err?: Error | null, data?: Buffer) => void) => {\n // Combine pending bytes with new chunk\n let data: Buffer;\n if (pending && pending.length > 0) {\n data = Buffer.concat([pending, chunk]);\n } else {\n data = chunk;\n }\n\n // We need at least 5 bytes to process an instruction\n // Keep the last 4 bytes as pending in case an instruction spans chunks\n const safeEnd = data.length - 4;\n if (safeEnd <= 0) {\n // Not enough data yet, keep it all pending\n pending = data;\n callback(null, allocBuffer(0));\n return;\n }\n\n const output = bufferFrom(data.slice(0, safeEnd)); // Copy the portion we'll process\n pending = data.slice(safeEnd); // Keep last 4 bytes for next chunk\n\n let localPos = 0;\n while (localPos < output.length) {\n const b = output[localPos];\n\n // Check for CALL (0xE8) or JMP (0xE9) opcode\n if (b !== 0xe8 && b !== 0xe9) {\n localPos++;\n globalPos++;\n prevMask = 0;\n continue;\n }\n\n // Check if we have enough bytes for the full instruction\n if (localPos + 5 > output.length + pending.length) {\n // Not enough bytes - need to wait for more data\n // This shouldn't happen with our safeEnd calculation, but be safe\n break;\n }\n\n // Skip if in masked region\n if ((prevMask & 1) !== 0) {\n prevMask = (prevMask >> 1) | 4;\n localPos++;\n globalPos++;\n continue;\n }\n\n // Get the 4 address bytes (might span into pending)\n let addr: number;\n let highByte: number;\n if (localPos + 5 <= output.length) {\n addr = output[localPos + 1] | (output[localPos + 2] << 8) | (output[localPos + 3] << 16) | ((output[localPos + 4] << 24) >>> 0);\n highByte = output[localPos + 4];\n } else {\n // Address spans output and pending - shouldn't happen with safeEnd\n localPos++;\n globalPos++;\n prevMask = 0;\n continue;\n }\n\n if (highByte === 0x00 || highByte === 0xff) {\n // Convert absolute to relative\n let newAddr: number;\n if (highByte === 0x00) {\n newAddr = addr - globalPos;\n } else {\n newAddr = addr + globalPos;\n }\n\n // Write back as little-endian\n output[localPos + 1] = newAddr & 0xff;\n output[localPos + 2] = (newAddr >>> 8) & 0xff;\n output[localPos + 3] = (newAddr >>> 16) & 0xff;\n output[localPos + 4] = (newAddr >>> 24) & 0xff;\n\n localPos += 5;\n globalPos += 5;\n prevMask = 0;\n } else {\n localPos++;\n globalPos++;\n prevMask = 0;\n }\n }\n\n callback(null, output);\n },\n flush: function (this: InstanceType<typeof Transform>, callback: (err?: Error | null) => void) {\n // Output any remaining pending bytes\n if (pending && pending.length > 0) {\n // Process the final bytes - no need to worry about spanning\n const output = bufferFrom(pending);\n // Don't convert anything in the final bytes since we can't know\n // if they're complete instructions\n this.push(output);\n }\n callback(null);\n },\n });\n\n return transform;\n}\n"],"names":["createBcjDecoder","decodeBcj","input","_properties","_unpackSize","pos","prevMask","output","bufferFrom","length","b","offset","addr","highByte","newAddr","globalPos","pending","transform","Transform","chunk","_encoding","callback","data","Buffer","concat","safeEnd","allocBuffer","slice","localPos","flush","push"],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Transform } from 'extract-base-iterator';
|
|
2
|
-
/**
|
|
3
|
-
* Decode ARM BCJ filtered data (synchronous, for buffered use)
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* ARM BL instruction format:
|
|
7
|
-
* - 4 bytes aligned
|
|
8
|
-
* - Byte pattern: XX XX XX EB (where EB = 0xEB opcode for BL)
|
|
9
|
-
* - Lower 24 bits are signed offset (in words, not bytes)
|
|
10
|
-
*
|
|
11
|
-
* @param input - ARM BCJ filtered data
|
|
12
|
-
* @param _properties - Unused for ARM BCJ
|
|
13
|
-
* @param _unpackSize - Unused for ARM BCJ
|
|
14
|
-
* @returns Unfiltered data
|
|
15
|
-
*/
|
|
16
|
-
export declare function decodeBcjArm(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
17
|
-
/**
|
|
18
|
-
* Create a streaming ARM BCJ decoder Transform.
|
|
19
|
-
* Processes data in 4-byte aligned chunks.
|
|
20
|
-
*/
|
|
21
|
-
export declare function createBcjArmDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform>;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Transform } from 'extract-base-iterator';
|
|
2
|
-
/**
|
|
3
|
-
* Decode ARM BCJ filtered data (synchronous, for buffered use)
|
|
4
|
-
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
-
*
|
|
6
|
-
* ARM BL instruction format:
|
|
7
|
-
* - 4 bytes aligned
|
|
8
|
-
* - Byte pattern: XX XX XX EB (where EB = 0xEB opcode for BL)
|
|
9
|
-
* - Lower 24 bits are signed offset (in words, not bytes)
|
|
10
|
-
*
|
|
11
|
-
* @param input - ARM BCJ filtered data
|
|
12
|
-
* @param _properties - Unused for ARM BCJ
|
|
13
|
-
* @param _unpackSize - Unused for ARM BCJ
|
|
14
|
-
* @returns Unfiltered data
|
|
15
|
-
*/
|
|
16
|
-
export declare function decodeBcjArm(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
17
|
-
/**
|
|
18
|
-
* Create a streaming ARM BCJ decoder Transform.
|
|
19
|
-
* Processes data in 4-byte aligned chunks.
|
|
20
|
-
*/
|
|
21
|
-
export declare function createBcjArmDecoder(_properties?: Buffer, _unpackSize?: number): InstanceType<typeof Transform>;
|