1
1
// https://gist.github.com/ultraviolet-jordan/2ded15754aee4fa82caacb0c7c77d866
2
2
3
+ @final
3
4
class BZip2State {
4
- // generated from 1 << i, except for 32
5
- // prettier-ignore
6
- static readonly MASKS : StaticArray < i32 > = [
7
- 0x00000000 , 0x00000001 , 0x00000003 , 0x00000007 ,
8
- 0x0000000f , 0x0000001f , 0x0000003f , 0x0000007f ,
9
- 0x000000ff , 0x000001ff , 0x000003ff , 0x000007ff ,
10
- 0x00000fff , 0x00001fff , 0x00003fff , 0x00007fff ,
11
- 0x0000ffff , 0x0001ffff , 0x0003ffff , 0x0007ffff ,
12
- 0x000fffff , 0x001fffff , 0x003fffff , 0x007fffff ,
13
- 0x00ffffff , 0x01ffffff , 0x03ffffff , 0x07ffffff ,
14
- 0x0fffffff , 0x1fffffff , 0x3fffffff , - 0x80000000
15
- ] ;
16
-
17
- static readonly MTFA_SIZE : i16 = 4096 ;
18
- static readonly MTFL_SIZE : i8 = 16 ;
19
- static readonly BZ_MAX_ALPHA_SIZE : i16 = 258 ;
20
- static readonly BZ_MAX_CODE_LEN : i8 = 23 ;
5
+ @inline static readonly MTFA_SIZE : i16 = 4096 ;
6
+ @inline static readonly MTFL_SIZE : i8 = 16 ;
7
+ @inline static readonly BZ_MAX_ALPHA_SIZE : i16 = 258 ;
8
+ @inline static readonly BZ_MAX_CODE_LEN : i8 = 23 ;
21
9
// static readonly anInt732: i32 = 1; // TODO
22
- static readonly BZ_N_GROUPS : i8 = 6 ;
23
- static readonly BZ_G_SIZE : i8 = 50 ;
24
- static readonly BZ_MAX_SELECTORS : i16 = 18002 ; // (2 + (900000 / BZip2State.BZ_G_SIZE));
10
+ @ inline static readonly BZ_N_GROUPS : i8 = 6 ;
11
+ @ inline static readonly BZ_G_SIZE : i8 = 50 ;
12
+ @ inline static readonly BZ_MAX_SELECTORS : i16 = 18002 ; // (2 + (900000 / BZip2State.BZ_G_SIZE));
25
13
// static readonly anInt735: i32 = 4; // TODO
26
14
27
- static readonly BZ_RUNA : i8 = 0 ;
28
- static readonly BZ_RUNB : i8 = 1 ;
15
+ @ inline static readonly BZ_RUNA : i8 = 0 ;
16
+ @ inline static readonly BZ_RUNB : i8 = 1 ;
29
17
30
18
static tt : StaticArray < i32 > = new StaticArray < i32 > ( 100_000 ) ;
31
19
32
- stream : Int8Array = new Int8Array ( 0 ) ;
33
- decompressed : Int8Array = new Int8Array ( 0 ) ;
20
+ stream : StaticArray < i8 > = new StaticArray ( 0 ) ;
21
+ decompressed : StaticArray < i8 > = new StaticArray ( 0 ) ;
34
22
next_in : i32 = 0 ;
35
23
avail_in : i32 = 0 ;
36
24
total_in_lo32 : i32 = 0 ;
@@ -70,14 +58,12 @@ class BZip2State {
70
58
readonly minLens : StaticArray < i32 > = new StaticArray < i32 > ( BZip2State . BZ_N_GROUPS ) ;
71
59
}
72
60
73
- export function newBzip2State ( ) : BZip2State {
74
- return new BZip2State ( ) ;
75
- }
61
+ const state : BZip2State = new BZip2State ( ) ;
76
62
77
- export function read ( length : i32 , stream : Int8Array , avail_in : i32 , next_in : i32 , state : BZip2State ) : Int8Array {
63
+ export function read ( length : i32 , stream : StaticArray < i8 > , avail_in : i32 , next_in : i32 ) : StaticArray < i8 > {
78
64
state . stream = stream ;
79
65
state . next_in = next_in ;
80
- state . decompressed = new Int8Array ( length ) ;
66
+ state . decompressed = new StaticArray ( length ) ;
81
67
state . next_out = 0 ;
82
68
state . avail_in = avail_in ;
83
69
state . avail_out = length ;
@@ -88,12 +74,12 @@ export function read(length: i32, stream: Int8Array, avail_in: i32, next_in: i32
88
74
state . total_out_lo32 = 0 ;
89
75
state . total_out_hi32 = 0 ;
90
76
state . currBlockNo = 0 ;
91
- decompress ( state ) ;
77
+ decompress ( ) ;
92
78
// return length - state.avail_out;
93
79
return state . decompressed ;
94
80
}
95
81
96
- function decompress ( state : BZip2State ) : void {
82
+ function decompress ( ) : void {
97
83
let gMinlen : i32 = 0 ;
98
84
let gLimit : StaticArray < i32 > = [ ] ;
99
85
let gBase : StaticArray < i32 > = [ ] ;
@@ -106,43 +92,43 @@ function decompress(state: BZip2State): void {
106
92
107
93
let reading : bool = true ;
108
94
while ( reading ) {
109
- let uc : u8 = getByte ( state ) ;
95
+ let uc : u8 = getByte ( ) ;
110
96
if ( uc === 0x17 ) {
111
97
// 23
112
98
return ;
113
99
}
114
100
115
101
// uc checks originally broke the loop and returned an error in libbzip2
116
- uc = getByte ( state ) ;
117
- uc = getByte ( state ) ;
118
- uc = getByte ( state ) ;
119
- uc = getByte ( state ) ;
120
- uc = getByte ( state ) ;
102
+ uc = getByte ( ) ;
103
+ uc = getByte ( ) ;
104
+ uc = getByte ( ) ;
105
+ uc = getByte ( ) ;
106
+ uc = getByte ( ) ;
121
107
122
108
state . currBlockNo ++ ;
123
109
124
- uc = getByte ( state ) ;
125
- uc = getByte ( state ) ;
126
- uc = getByte ( state ) ;
127
- uc = getByte ( state ) ;
110
+ uc = getByte ( ) ;
111
+ uc = getByte ( ) ;
112
+ uc = getByte ( ) ;
113
+ uc = getByte ( ) ;
128
114
129
- uc = getBit ( state ) ;
115
+ uc = getBit ( ) ;
130
116
state . blockRandomized = uc !== 0 ;
131
117
if ( state . blockRandomized ) {
132
118
// console.log('PANIC! RANDOMISED BLOCK!');
133
119
}
134
120
135
121
state . origPtr = 0 ;
136
- uc = getByte ( state ) ;
122
+ uc = getByte ( ) ;
137
123
state . origPtr = ( state . origPtr << 8 ) | ( uc & 0xff ) ;
138
- uc = getByte ( state ) ;
124
+ uc = getByte ( ) ;
139
125
state . origPtr = ( state . origPtr << 8 ) | ( uc & 0xff ) ;
140
- uc = getByte ( state ) ;
126
+ uc = getByte ( ) ;
141
127
state . origPtr = ( state . origPtr << 8 ) | ( uc & 0xff ) ;
142
128
143
129
// Receive the mapping table
144
130
for ( let i : i32 = 0 ; i < 16 ; i ++ ) {
145
- uc = getBit ( state ) ;
131
+ uc = getBit ( ) ;
146
132
unchecked ( ( state . inUse16 [ i ] = uc === 1 ) ) ;
147
133
}
148
134
@@ -153,23 +139,23 @@ function decompress(state: BZip2State): void {
153
139
for ( let i : i32 = 0 ; i < 16 ; i ++ ) {
154
140
if ( unchecked ( state . inUse16 [ i ] ) ) {
155
141
for ( let j : i32 = 0 ; j < 16 ; j ++ ) {
156
- uc = getBit ( state ) ;
142
+ uc = getBit ( ) ;
157
143
if ( uc === 1 ) {
158
144
unchecked ( ( state . inUse [ i * 16 + j ] = true ) ) ;
159
145
}
160
146
}
161
147
}
162
148
}
163
- makeMaps ( state ) ;
149
+ makeMaps ( ) ;
164
150
const alphaSize : i32 = state . nInUse + 2 ;
165
151
166
- const nGroups : i32 = getBits ( 3 , state ) ;
167
- const nSelectors : i32 = getBits ( 15 , state ) ;
152
+ const nGroups : i32 = getBits ( 3 ) ;
153
+ const nSelectors : i32 = getBits ( 15 ) ;
168
154
for ( let i : i32 = 0 ; i < nSelectors ; i ++ ) {
169
155
let j : i32 = 0 ;
170
156
// eslint-disable-next-line no-constant-condition
171
157
while ( true ) {
172
- uc = getBit ( state ) ;
158
+ uc = getBit ( ) ;
173
159
if ( uc === 0 ) {
174
160
break ;
175
161
}
@@ -198,17 +184,17 @@ function decompress(state: BZip2State): void {
198
184
199
185
// Now the coding tables
200
186
for ( let t : i32 = 0 ; t < nGroups ; t ++ ) {
201
- let curr : i32 = getBits ( 5 , state ) ;
187
+ let curr : i32 = getBits ( 5 ) ;
202
188
203
189
for ( let i : i32 = 0 ; i < alphaSize ; i ++ ) {
204
190
// eslint-disable-next-line no-constant-condition
205
191
while ( true ) {
206
- uc = getBit ( state ) ;
192
+ uc = getBit ( ) ;
207
193
if ( uc === 0 ) {
208
194
break ;
209
195
}
210
196
211
- uc = getBit ( state ) ;
197
+ uc = getBit ( ) ;
212
198
if ( uc === 0 ) {
213
199
curr ++ ;
214
200
} else {
@@ -279,9 +265,9 @@ function decompress(state: BZip2State): void {
279
265
let zn : i32 = gMinlen ;
280
266
let zvec : i32 ;
281
267
let zj : u8 ;
282
- for ( zvec = getBits ( gMinlen , state ) ; zvec > unchecked ( gLimit [ zn ] ) ; zvec = ( zvec << 1 ) | zj ) {
268
+ for ( zvec = getBits ( gMinlen ) ; zvec > unchecked ( gLimit [ zn ] ) ; zvec = ( zvec << 1 ) | zj ) {
283
269
zn ++ ;
284
- zj = getBit ( state ) ;
270
+ zj = getBit ( ) ;
285
271
}
286
272
287
273
let nextSym : i32 = unchecked ( gPerm [ zvec - unchecked ( gBase [ zn ] ) ] ) ;
@@ -310,9 +296,9 @@ function decompress(state: BZip2State): void {
310
296
311
297
gPos -- ;
312
298
zn = gMinlen ;
313
- for ( zvec = getBits ( gMinlen , state ) ; zvec > unchecked ( gLimit [ zn ] ) ; zvec = ( zvec << 1 ) | zj ) {
299
+ for ( zvec = getBits ( gMinlen ) ; zvec > unchecked ( gLimit [ zn ] ) ; zvec = ( zvec << 1 ) | zj ) {
314
300
zn ++ ;
315
- zj = getBit ( state ) ;
301
+ zj = getBit ( ) ;
316
302
}
317
303
318
304
nextSym = unchecked ( gPerm [ zvec - unchecked ( gBase [ zn ] ) ] ) ;
@@ -407,9 +393,9 @@ function decompress(state: BZip2State): void {
407
393
408
394
gPos -- ;
409
395
zn = gMinlen ;
410
- for ( zvec = getBits ( gMinlen , state ) ; zvec > unchecked ( gLimit [ zn ] ) ; zvec = ( zvec << 1 ) | zj ) {
396
+ for ( zvec = getBits ( gMinlen ) ; zvec > unchecked ( gLimit [ zn ] ) ; zvec = ( zvec << 1 ) | zj ) {
411
397
zn ++ ;
412
- zj = getBit ( state ) ;
398
+ zj = getBit ( ) ;
413
399
}
414
400
nextSym = unchecked ( gPerm [ zvec - unchecked ( gBase [ zn ] ) ] ) ;
415
401
}
@@ -448,12 +434,13 @@ function decompress(state: BZip2State): void {
448
434
state . c_nblock_used ++ ;
449
435
450
436
state . save_nblock = nblock ;
451
- finish ( state ) ;
437
+ finish ( ) ;
452
438
reading = state . c_nblock_used === state . save_nblock + 1 && state . state_out_len === 0 ;
453
439
}
454
440
}
455
441
456
- function getBits ( n : i32 , state : BZip2State ) : i32 {
442
+ // macro: GET_BITS
443
+ function getBits ( n : i32 ) : i32 {
457
444
while ( state . bsLive < n ) {
458
445
state . bsBuff = ( state . bsBuff << 8 ) | ( unchecked ( state . stream [ state . next_in ] ) & 0xff ) ;
459
446
state . bsLive += 8 ;
@@ -465,20 +452,23 @@ function getBits(n: i32, state: BZip2State): i32 {
465
452
}
466
453
}
467
454
468
- const value : i32 = ( state . bsBuff >> ( state . bsLive - n ) ) & unchecked ( BZip2State . MASKS [ n ] ) ;
455
+ const value : i32 = state . bsBuff >> state . bsLive - n & ( 1 << n ) - 1 ;
469
456
state . bsLive -= n ;
470
457
return value ;
471
458
}
472
459
473
- function getBit ( state : BZip2State ) : u8 {
474
- return < u8 > getBits ( 1 , state ) ;
460
+ // macro: GET_BIT
461
+ function getBit ( ) : u8 {
462
+ return < u8 > getBits ( 1 ) ;
475
463
}
476
464
477
- function getByte ( state : BZip2State ) : u8 {
478
- return < u8 > getBits ( 8 , state ) ;
465
+ // macro: GET_UCHAR
466
+ function getByte ( ) : u8 {
467
+ return < u8 > getBits ( 8 ) ;
479
468
}
480
469
481
- function makeMaps ( state : BZip2State ) : void {
470
+ // makeMaps_d
471
+ function makeMaps ( ) : void {
482
472
state . nInUse = 0 ;
483
473
484
474
for ( let i : i32 = 0 ; i < 256 ; i ++ ) {
@@ -489,6 +479,7 @@ function makeMaps(state: BZip2State): void {
489
479
}
490
480
}
491
481
482
+ // BZ2_hbCreateDecodeTables
492
483
function createDecodeTables ( limit : StaticArray < i32 > , base : StaticArray < i32 > , perm : StaticArray < i32 > , length : StaticArray < u8 > , minLen : i32 , maxLen : i32 , alphaSize : i32 ) : void {
493
484
let pp : i32 = 0 ;
494
485
@@ -530,14 +521,14 @@ function createDecodeTables(limit: StaticArray<i32>, base: StaticArray<i32>, per
530
521
}
531
522
532
523
// unRLE_obuf_to_output_FAST
533
- function finish ( state : BZip2State ) : void {
524
+ function finish ( ) : void {
534
525
let c_state_out_ch : u8 = < u8 > state . state_out_ch ;
535
526
let c_state_out_len : i32 = state . state_out_len ;
536
527
let c_nblock_used : i32 = state . c_nblock_used ;
537
528
let c_k0 : i32 = state . k0 ;
538
529
const c_tt : StaticArray < i32 > = BZip2State . tt ;
539
530
let c_tPos : i32 = state . tPos ;
540
- const cs_decompressed : Int8Array = state . decompressed ;
531
+ const cs_decompressed : StaticArray < i8 > = state . decompressed ;
541
532
let cs_next_out : i32 = state . next_out ;
542
533
let cs_avail_out : i32 = state . avail_out ;
543
534
const avail_out_INIT : i32 = cs_avail_out ;
0 commit comments