Skip to content

Commit 200f379

Browse files
eustascopybara-github
authored andcommitted
prepare java decoder for transpilation to Kotlin
PiperOrigin-RevId: 601023149
1 parent d5e697b commit 200f379

File tree

3 files changed

+47
-37
lines changed

3 files changed

+47
-37
lines changed

java/org/brotli/dec/Decode.java

+23-17
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ private static void decodeMetaBlockLength(State s) {
351351
if (sizeBytes == 0) {
352352
return;
353353
}
354-
for (int i = 0; i < sizeBytes; i++) {
354+
for (int i = 0; i < sizeBytes; ++i) {
355355
BitReader.fillBitWindow(s);
356356
final int bits = BitReader.readFewBits(s, 8);
357357
if (bits == 0 && i + 1 == sizeBytes && sizeBytes > 1) {
@@ -360,7 +360,7 @@ private static void decodeMetaBlockLength(State s) {
360360
s.metaBlockLength |= bits << (i * 8);
361361
}
362362
} else {
363-
for (int i = 0; i < sizeNibbles; i++) {
363+
for (int i = 0; i < sizeNibbles; ++i) {
364364
BitReader.fillBitWindow(s);
365365
final int bits = BitReader.readFewBits(s, 4);
366366
if (bits == 0 && i + 1 == sizeNibbles && sizeNibbles > 4) {
@@ -405,18 +405,19 @@ private static int readBlockLength(int[] tableGroup, int tableIdx, State s) {
405405

406406
private static void moveToFront(int[] v, int index) {
407407
final int value = v[index];
408-
for (; index > 0; index--) {
408+
while (index > 0) {
409409
v[index] = v[index - 1];
410+
index--;
410411
}
411412
v[0] = value;
412413
}
413414

414415
private static void inverseMoveToFrontTransform(byte[] v, int vLen) {
415416
final int[] mtf = new int[256];
416-
for (int i = 0; i < 256; i++) {
417+
for (int i = 0; i < 256; ++i) {
417418
mtf[i] = i;
418419
}
419-
for (int i = 0; i < vLen; i++) {
420+
for (int i = 0; i < vLen; ++i) {
420421
final int index = v[i] & 0xFF;
421422
v[i] = (byte) mtf[index];
422423
if (index != 0) {
@@ -470,7 +471,7 @@ private static void readHuffmanCodeLengths(
470471
if (symbol + repeatDelta > numSymbols) {
471472
throw new BrotliRuntimeException("symbol + repeatDelta > numSymbols"); // COV_NF_LINE
472473
}
473-
for (int i = 0; i < repeatDelta; i++) {
474+
for (int i = 0; i < repeatDelta; ++i) {
474475
codeLengths[symbol++] = repeatCodeLen;
475476
}
476477
if (repeatCodeLen != 0) {
@@ -507,7 +508,7 @@ private static int readSimpleHuffmanCode(int alphabetSizeMax, int alphabetSizeLi
507508
final int maxBits = 1 + log2floor(alphabetSizeMax - 1);
508509

509510
final int numSymbols = BitReader.readFewBits(s, 2) + 1;
510-
for (int i = 0; i < numSymbols; i++) {
511+
for (int i = 0; i < numSymbols; ++i) {
511512
BitReader.fillBitWindow(s);
512513
final int symbol = BitReader.readFewBits(s, maxBits);
513514
if (symbol >= alphabetSizeLimit) {
@@ -569,7 +570,7 @@ private static int readComplexHuffmanCode(int alphabetSizeLimit, int skip,
569570
final int[] codeLengthCodeLengths = new int[CODE_LENGTH_CODES];
570571
int space = 32;
571572
int numCodes = 0;
572-
for (int i = skip; i < CODE_LENGTH_CODES && space > 0; i++) {
573+
for (int i = skip; i < CODE_LENGTH_CODES; ++i) {
573574
final int codeLenIdx = CODE_LENGTH_CODE_ORDER[i];
574575
BitReader.fillBitWindow(s);
575576
final int p = BitReader.peekBits(s) & 15;
@@ -580,6 +581,7 @@ private static int readComplexHuffmanCode(int alphabetSizeLimit, int skip,
580581
if (v != 0) {
581582
space -= (32 >> v);
582583
numCodes++;
584+
if (space <= 0) break;
583585
}
584586
}
585587
if (space != 0 && numCodes != 1) {
@@ -630,7 +632,8 @@ private static int decodeContextMap(int contextMapSize, byte[] contextMap, State
630632
final int[] table = new int[tableSize + 1];
631633
final int tableIdx = table.length - 1;
632634
readHuffmanCode(alphabetSize, alphabetSize, table, tableIdx, s);
633-
for (int i = 0; i < contextMapSize; ) {
635+
int i = 0;
636+
while (i < contextMapSize) {
634637
BitReader.readMoreInput(s);
635638
BitReader.fillBitWindow(s);
636639
final int code = readSymbol(table, tableIdx, s);
@@ -829,22 +832,24 @@ private static void readMetablockHuffmanCodesAndContextMaps(State s) {
829832
s.numDirectDistanceCodes = BitReader.readFewBits(s, 4) << s.distancePostfixBits;
830833
// TODO(eustas): Reuse?
831834
s.contextModes = new byte[s.numLiteralBlockTypes];
832-
for (int i = 0; i < s.numLiteralBlockTypes;) {
835+
int i = 0;
836+
while (i < s.numLiteralBlockTypes) {
833837
/* Ensure that less than 256 bits read between readMoreInput. */
834838
final int limit = Math.min(i + 96, s.numLiteralBlockTypes);
835-
for (; i < limit; ++i) {
839+
while (i < limit) {
836840
BitReader.fillBitWindow(s);
837841
s.contextModes[i] = (byte) BitReader.readFewBits(s, 2);
842+
i++;
838843
}
839844
BitReader.readMoreInput(s);
840845
}
841846

842847
// TODO(eustas): Reuse?
843-
s.contextMap = new byte[s.numLiteralBlockTypes << LITERAL_CONTEXT_BITS];
844-
final int numLiteralTrees = decodeContextMap(s.numLiteralBlockTypes << LITERAL_CONTEXT_BITS,
845-
s.contextMap, s);
848+
final int contextMapLength = s.numLiteralBlockTypes << LITERAL_CONTEXT_BITS;
849+
s.contextMap = new byte[contextMapLength];
850+
final int numLiteralTrees = decodeContextMap(contextMapLength, s.contextMap, s);
846851
s.trivialLiteralContext = 1;
847-
for (int j = 0; j < s.numLiteralBlockTypes << LITERAL_CONTEXT_BITS; j++) {
852+
for (int j = 0; j < contextMapLength; ++j) {
848853
if (s.contextMap[j] != j >> LITERAL_CONTEXT_BITS) {
849854
s.trivialLiteralContext = 0;
850855
break;
@@ -1253,7 +1258,8 @@ static void decompress(State s) {
12531258
final int dstEnd = dst + copyLength;
12541259
if ((srcEnd < ringBufferMask) && (dstEnd < ringBufferMask)) {
12551260
if (copyLength < 12 || (srcEnd > dst && dstEnd > src)) {
1256-
for (int k = 0; k < copyLength; k += 4) {
1261+
final int numQuads = (copyLength + 3) >> 2;
1262+
for (int k = 0; k < numQuads; ++k) {
12571263
ringBuffer[dst++] = ringBuffer[src++];
12581264
ringBuffer[dst++] = ringBuffer[src++];
12591265
ringBuffer[dst++] = ringBuffer[src++];
@@ -1266,7 +1272,7 @@ static void decompress(State s) {
12661272
s.metaBlockLength -= copyLength;
12671273
s.pos += copyLength;
12681274
} else {
1269-
for (; s.j < s.copyLength;) {
1275+
while (s.j < s.copyLength) {
12701276
ringBuffer[s.pos] =
12711277
ringBuffer[(s.pos - s.distance) & ringBufferMask];
12721278
s.metaBlockLength--;

java/org/brotli/dec/DictionaryData.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ private static void unpackDictionaryData(ByteBuffer dictionary, String data0, St
4343

4444
// Toggle high bit using run-length delta encoded "skipFlip".
4545
int offset = 0;
46-
final int n = skipFlip.length();
47-
for (int i = 0; i < n; i += 2) {
48-
final int skip = skipFlip.charAt(i) - 36;
49-
final int flip = skipFlip.charAt(i + 1) - 36;
46+
final int n = skipFlip.length() >> 1;
47+
for (int i = 0; i < n; ++i) {
48+
final int skip = skipFlip.charAt(2 * i) - 36;
49+
final int flip = skipFlip.charAt(2 * i + 1) - 36;
5050
for (int j = 0; j < skip; ++j) {
5151
dict[offset] ^= 3;
5252
offset++;

java/org/brotli/dec/Huffman.java

+20-16
Original file line numberDiff line numberDiff line change
@@ -64,28 +64,26 @@ private static int nextTableBitSize(int[] count, int len, int rootBits) {
6464
static int buildHuffmanTable(int[] tableGroup, int tableIdx, int rootBits, int[] codeLengths,
6565
int codeLengthsSize) {
6666
final int tableOffset = tableGroup[tableIdx];
67-
int key; // Reversed prefix code.
6867
final int[] sorted = new int[codeLengthsSize]; // Symbols sorted by code length.
6968
// TODO(eustas): fill with zeroes?
7069
final int[] count = new int[MAX_LENGTH + 1]; // Number of codes of each length.
7170
final int[] offset = new int[MAX_LENGTH + 1]; // Offsets in sorted table for each length.
72-
int symbol;
7371

7472
// Build histogram of code lengths.
75-
for (symbol = 0; symbol < codeLengthsSize; symbol++) {
76-
count[codeLengths[symbol]]++;
73+
for (int sym = 0; sym < codeLengthsSize; ++sym) {
74+
count[codeLengths[sym]]++;
7775
}
7876

7977
// Generate offsets into sorted symbol table by code length.
8078
offset[1] = 0;
81-
for (int len = 1; len < MAX_LENGTH; len++) {
79+
for (int len = 1; len < MAX_LENGTH; ++len) {
8280
offset[len + 1] = offset[len] + count[len];
8381
}
8482

8583
// Sort symbols by length, by symbol order within each length.
86-
for (symbol = 0; symbol < codeLengthsSize; symbol++) {
87-
if (codeLengths[symbol] != 0) {
88-
sorted[offset[codeLengths[symbol]]++] = symbol;
84+
for (int sym = 0; sym < codeLengthsSize; ++sym) {
85+
if (codeLengths[sym] != 0) {
86+
sorted[offset[codeLengths[sym]]++] = sym;
8987
}
9088
}
9189

@@ -95,29 +93,34 @@ static int buildHuffmanTable(int[] tableGroup, int tableIdx, int rootBits, int[]
9593

9694
// Special case code with only one value.
9795
if (offset[MAX_LENGTH] == 1) {
98-
for (key = 0; key < totalSize; key++) {
99-
tableGroup[tableOffset + key] = sorted[0];
96+
for (int k = 0; k < totalSize; ++k) {
97+
tableGroup[tableOffset + k] = sorted[0];
10098
}
10199
return totalSize;
102100
}
103101

104102
// Fill in root table.
105-
key = 0;
106-
symbol = 0;
107-
for (int len = 1, step = 2; len <= rootBits; len++, step <<= 1) {
108-
for (; count[len] > 0; count[len]--) {
103+
int key = 0; // Reversed prefix code.
104+
int symbol = 0;
105+
int step = 1;
106+
for (int len = 1; len <= rootBits; ++len) {
107+
step <<= 1;
108+
while (count[len] > 0) {
109109
replicateValue(tableGroup, tableOffset + key, step, tableSize,
110110
len << 16 | sorted[symbol++]);
111111
key = getNextKey(key, len);
112+
count[len]--;
112113
}
113114
}
114115

115116
// Fill in 2nd level tables and add pointers to root table.
116117
final int mask = totalSize - 1;
117118
int low = -1;
118119
int currentOffset = tableOffset;
119-
for (int len = rootBits + 1, step = 2; len <= MAX_LENGTH; len++, step <<= 1) {
120-
for (; count[len] > 0; count[len]--) {
120+
step = 1;
121+
for (int len = rootBits + 1; len <= MAX_LENGTH; ++len) {
122+
step <<= 1;
123+
while (count[len] > 0) {
121124
if ((key & mask) != low) {
122125
currentOffset += tableSize;
123126
tableBits = nextTableBitSize(count, len, rootBits);
@@ -130,6 +133,7 @@ static int buildHuffmanTable(int[] tableGroup, int tableIdx, int rootBits, int[]
130133
replicateValue(tableGroup, currentOffset + (key >> rootBits), step, tableSize,
131134
(len - rootBits) << 16 | sorted[symbol++]);
132135
key = getNextKey(key, len);
136+
count[len]--;
133137
}
134138
}
135139
return totalSize;

0 commit comments

Comments
 (0)