You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2026/07/31 15:20:49 UTC
(commons-compress) 05/19: Sort members
This is an automated email from the ASF dual-hosted git repository.
garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-compress.git
commit 774c85b72025c77618d8f4fb01af17f473d82d78
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Fri Jul 31 10:30:31 2026 -0400
Sort members
---
...stractLhStaticHuffmanCompressorInputStream.java | 218 ++++++++++-----------
1 file changed, 109 insertions(+), 109 deletions(-)
diff --git a/src/main/java/org/apache/commons/compress/compressors/lha/AbstractLhStaticHuffmanCompressorInputStream.java b/src/main/java/org/apache/commons/compress/compressors/lha/AbstractLhStaticHuffmanCompressorInputStream.java
index 47339c919..3940f9011 100644
--- a/src/main/java/org/apache/commons/compress/compressors/lha/AbstractLhStaticHuffmanCompressorInputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/lha/AbstractLhStaticHuffmanCompressorInputStream.java
@@ -94,6 +94,55 @@ public void close() throws IOException {
}
}
+ /**
+ * Fill the sliding dictionary with more data.
+ *
+ * @throws IOException if an I/O error occurs
+ */
+ private void fillBuffer() throws IOException {
+ if (this.blockSize == -1) {
+ // End of stream
+ return;
+ } else if (this.blockSize == 0) {
+ // Start to read the next block
+
+ // Read the block size (number of commands to read)
+ this.blockSize = (int) bin.readBits(16);
+ if (this.blockSize == -1) {
+ // End of stream
+ return;
+ }
+
+ final BinaryTree commandDecodingTree = readCommandDecodingTree();
+
+ this.commandTree = readCommandTree(commandDecodingTree);
+
+ this.distanceTree = readDistanceTree();
+ }
+
+ this.blockSize--;
+
+ final int command = commandTree.read(bin);
+ if (command == -1) {
+ throw new CompressorException("Unexpected end of stream");
+ } else if (command < NUMBER_OF_LITERAL_CODES) {
+ // Literal command, just write the byte to the buffer
+ buffer.put(command);
+ } else {
+ // Copy command, read the distance and calculate the length from the command
+ final int distance = readDistance();
+ final int length = command - NUMBER_OF_LITERAL_CODES + getCopyThreshold();
+
+ // Copy the data from the sliding dictionary and add to the buffer
+ buffer.copy(distance + 1, length);
+ }
+ }
+
+ @Override
+ public long getCompressedCount() {
+ return bin.getBytesRead();
+ }
+
/**
* Gets the threshold for copying data from the sliding dictionary. This is the minimum
* possible number of bytes that will be part of a copy command.
@@ -127,15 +176,6 @@ int getDictionarySize() {
*/
abstract int getDistanceBits();
- /**
- * Gets the maximum number of distance codes in the distance tree.
- *
- * @return the maximum number of distance codes
- */
- int getMaxNumberOfDistanceCodes() {
- return getDictionaryBits() + 1;
- }
-
/**
* Gets the maximum match length for the copy command.
*
@@ -155,9 +195,13 @@ int getMaxNumberOfCommands() {
return NUMBER_OF_LITERAL_CODES + getMaxMatchLength() - getCopyThreshold() + 1;
}
- @Override
- public long getCompressedCount() {
- return bin.getBytesRead();
+ /**
+ * Gets the maximum number of distance codes in the distance tree.
+ *
+ * @return the maximum number of distance codes
+ */
+ int getMaxNumberOfDistanceCodes() {
+ return getDictionaryBits() + 1;
}
@Override
@@ -180,47 +224,47 @@ public int read() throws IOException {
}
/**
- * Fill the sliding dictionary with more data.
+ * Read the specified number of bits from the underlying stream throwing CompressorException
+ * if the end of the stream is reached before reading the requested number of bits.
*
- * @throws IOException if an I/O error occurs
+ * @param count the number of bits to read
+ * @return the bits concatenated as an int using the stream's byte order
+ * @throws IOException if an I/O error occurs.
*/
- private void fillBuffer() throws IOException {
- if (this.blockSize == -1) {
- // End of stream
- return;
- } else if (this.blockSize == 0) {
- // Start to read the next block
+ private int readBits(final int count) throws IOException {
+ final long value = bin.readBits(count);
+ if (value < 0) {
+ throw new CompressorException("Unexpected end of stream");
+ }
- // Read the block size (number of commands to read)
- this.blockSize = (int) bin.readBits(16);
- if (this.blockSize == -1) {
- // End of stream
- return;
- }
+ return (int) value;
+ }
- final BinaryTree commandDecodingTree = readCommandDecodingTree();
+ /**
+ * Read code length (depth in tree). Usually 0-7 but could be higher and if so,
+ * count the number of following consecutive one bits and add to the length.
+ *
+ * @return code length
+ * @throws IOException if an I/O error occurs
+ */
+ int readCodeLength() throws IOException {
+ int len = readBits(CODE_LENGTH_BITS);
+ if (len == 0x07) {
+ int bit = bin.readBit();
+ while (bit == 1) {
+ if (++len > MAX_CODE_LENGTH) {
+ throw new CompressorException("Code length overflow");
+ }
- this.commandTree = readCommandTree(commandDecodingTree);
+ bit = bin.readBit();
+ }
- this.distanceTree = readDistanceTree();
+ if (bit == -1) {
+ throw new CompressorException("Unexpected end of stream");
+ }
}
- this.blockSize--;
-
- final int command = commandTree.read(bin);
- if (command == -1) {
- throw new CompressorException("Unexpected end of stream");
- } else if (command < NUMBER_OF_LITERAL_CODES) {
- // Literal command, just write the byte to the buffer
- buffer.put(command);
- } else {
- // Copy command, read the distance and calculate the length from the command
- final int distance = readDistance();
- final int length = command - NUMBER_OF_LITERAL_CODES + getCopyThreshold();
-
- // Copy the data from the sliding dictionary and add to the buffer
- buffer.copy(distance + 1, length);
- }
+ return len;
}
/**
@@ -255,33 +299,6 @@ BinaryTree readCommandDecodingTree() throws IOException {
}
}
- /**
- * Read code length (depth in tree). Usually 0-7 but could be higher and if so,
- * count the number of following consecutive one bits and add to the length.
- *
- * @return code length
- * @throws IOException if an I/O error occurs
- */
- int readCodeLength() throws IOException {
- int len = readBits(CODE_LENGTH_BITS);
- if (len == 0x07) {
- int bit = bin.readBit();
- while (bit == 1) {
- if (++len > MAX_CODE_LENGTH) {
- throw new CompressorException("Code length overflow");
- }
-
- bit = bin.readBit();
- }
-
- if (bit == -1) {
- throw new CompressorException("Unexpected end of stream");
- }
- }
-
- return len;
- }
-
/**
* Read the command tree which is used to decode the commands (literals or copy commands).
*
@@ -325,32 +342,6 @@ BinaryTree readCommandTree(final BinaryTree commandDecodingTree) throws IOExcept
}
}
- /**
- * Read the distance tree which is used to decode the distance of the copy command.
- *
- * @return the distance tree
- * @throws IOException if an I/O error occurs
- */
- private BinaryTree readDistanceTree() throws IOException {
- // Number of code lengths to read
- final int numCodeLengths = readBits(getDistanceBits());
-
- if (numCodeLengths > getMaxNumberOfDistanceCodes()) {
- throw new CompressorException("Code length table has invalid size (%d > %d)", numCodeLengths, getMaxNumberOfDistanceCodes());
- } else if (numCodeLengths == 0) {
- // If numCodeLengths is zero, we read a single code length of getDistanceBits() bits and use as root of the tree
- return new BinaryTree(readBits(getDistanceBits()));
- } else {
- // Read all code lengths
- final int[] codeLengths = new int[numCodeLengths];
- for (int index = 0; index < numCodeLengths; index++) {
- codeLengths[index] = readCodeLength();
- }
-
- return new BinaryTree(codeLengths);
- }
- }
-
/**
* Read the distance by first decoding the number of bits to read from the distance tree
* and then reading the actual distance value from the bit input stream.
@@ -377,19 +368,28 @@ private int readDistance() throws IOException {
}
/**
- * Read the specified number of bits from the underlying stream throwing CompressorException
- * if the end of the stream is reached before reading the requested number of bits.
+ * Read the distance tree which is used to decode the distance of the copy command.
*
- * @param count the number of bits to read
- * @return the bits concatenated as an int using the stream's byte order
- * @throws IOException if an I/O error occurs.
+ * @return the distance tree
+ * @throws IOException if an I/O error occurs
*/
- private int readBits(final int count) throws IOException {
- final long value = bin.readBits(count);
- if (value < 0) {
- throw new CompressorException("Unexpected end of stream");
- }
+ private BinaryTree readDistanceTree() throws IOException {
+ // Number of code lengths to read
+ final int numCodeLengths = readBits(getDistanceBits());
- return (int) value;
+ if (numCodeLengths > getMaxNumberOfDistanceCodes()) {
+ throw new CompressorException("Code length table has invalid size (%d > %d)", numCodeLengths, getMaxNumberOfDistanceCodes());
+ } else if (numCodeLengths == 0) {
+ // If numCodeLengths is zero, we read a single code length of getDistanceBits() bits and use as root of the tree
+ return new BinaryTree(readBits(getDistanceBits()));
+ } else {
+ // Read all code lengths
+ final int[] codeLengths = new int[numCodeLengths];
+ for (int index = 0; index < numCodeLengths; index++) {
+ codeLengths[index] = readCodeLength();
+ }
+
+ return new BinaryTree(codeLengths);
+ }
}
}