diff --git a/proposal/myrmidon/src/main/org/apache/tools/bzip2/BZip2Constants.java b/proposal/myrmidon/src/java/org/apache/aut/bzip2/BZip2Constants.java similarity index 99% rename from proposal/myrmidon/src/main/org/apache/tools/bzip2/BZip2Constants.java rename to proposal/myrmidon/src/java/org/apache/aut/bzip2/BZip2Constants.java index c98de15e0..ff27224d3 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/bzip2/BZip2Constants.java +++ b/proposal/myrmidon/src/java/org/apache/aut/bzip2/BZip2Constants.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.bzip2; +package org.apache.aut.bzip2; /** * Base class for both the compress and decompress classes. Holds common arrays, diff --git a/proposal/myrmidon/src/main/org/apache/tools/bzip2/CBZip2InputStream.java b/proposal/myrmidon/src/java/org/apache/aut/bzip2/CBZip2InputStream.java similarity index 99% rename from proposal/myrmidon/src/main/org/apache/tools/bzip2/CBZip2InputStream.java rename to proposal/myrmidon/src/java/org/apache/aut/bzip2/CBZip2InputStream.java index 616c5130c..c5ac4011c 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/bzip2/CBZip2InputStream.java +++ b/proposal/myrmidon/src/java/org/apache/aut/bzip2/CBZip2InputStream.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.bzip2; +package org.apache.aut.bzip2; import java.io.IOException; import java.io.InputStream; diff --git a/proposal/myrmidon/src/todo/org/apache/tools/bzip2/CBZip2OutputStream.java b/proposal/myrmidon/src/java/org/apache/aut/bzip2/CBZip2OutputStream.java similarity index 99% rename from proposal/myrmidon/src/todo/org/apache/tools/bzip2/CBZip2OutputStream.java rename to proposal/myrmidon/src/java/org/apache/aut/bzip2/CBZip2OutputStream.java index f266edf49..93960bd29 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/bzip2/CBZip2OutputStream.java +++ b/proposal/myrmidon/src/java/org/apache/aut/bzip2/CBZip2OutputStream.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.bzip2; +package org.apache.aut.bzip2; import java.io.IOException; import java.io.OutputStream; diff --git a/proposal/myrmidon/src/todo/org/apache/tools/bzip2/CRC.java b/proposal/myrmidon/src/java/org/apache/aut/bzip2/CRC.java similarity index 99% rename from proposal/myrmidon/src/todo/org/apache/tools/bzip2/CRC.java rename to proposal/myrmidon/src/java/org/apache/aut/bzip2/CRC.java index b35667df5..f484a2b95 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/bzip2/CRC.java +++ b/proposal/myrmidon/src/java/org/apache/aut/bzip2/CRC.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.bzip2; +package org.apache.aut.bzip2; /** * A simple class the hold and calculate the CRC for sanity checking of the diff --git a/proposal/myrmidon/src/main/org/apache/tools/tar/TarBuffer.java b/proposal/myrmidon/src/java/org/apache/aut/tar/TarBuffer.java similarity index 99% rename from proposal/myrmidon/src/main/org/apache/tools/tar/TarBuffer.java rename to proposal/myrmidon/src/java/org/apache/aut/tar/TarBuffer.java index db2c0fa96..e9c3ebef8 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/tar/TarBuffer.java +++ b/proposal/myrmidon/src/java/org/apache/aut/tar/TarBuffer.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.tar; +package org.apache.aut.tar; import java.io.IOException; import java.io.InputStream; diff --git a/proposal/myrmidon/src/main/org/apache/tools/tar/TarConstants.java b/proposal/myrmidon/src/java/org/apache/aut/tar/TarConstants.java similarity index 98% rename from proposal/myrmidon/src/main/org/apache/tools/tar/TarConstants.java rename to proposal/myrmidon/src/java/org/apache/aut/tar/TarConstants.java index 70e09a5ce..ef2b9d519 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/tar/TarConstants.java +++ b/proposal/myrmidon/src/java/org/apache/aut/tar/TarConstants.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.tar; +package org.apache.aut.tar; /** * This interface contains all the definitions used in the package. diff --git a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarEntry.java b/proposal/myrmidon/src/java/org/apache/aut/tar/TarEntry.java similarity index 99% rename from proposal/myrmidon/src/todo/org/apache/tools/tar/TarEntry.java rename to proposal/myrmidon/src/java/org/apache/aut/tar/TarEntry.java index 6568134e4..da09bce5a 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarEntry.java +++ b/proposal/myrmidon/src/java/org/apache/aut/tar/TarEntry.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.tar; +package org.apache.aut.tar; import java.io.File; import java.util.Date; diff --git a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarInputStream.java b/proposal/myrmidon/src/java/org/apache/aut/tar/TarInputStream.java similarity index 99% rename from proposal/myrmidon/src/todo/org/apache/tools/tar/TarInputStream.java rename to proposal/myrmidon/src/java/org/apache/aut/tar/TarInputStream.java index f657f5d1b..b2cfc6b81 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarInputStream.java +++ b/proposal/myrmidon/src/java/org/apache/aut/tar/TarInputStream.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.tar; +package org.apache.aut.tar; import java.io.FilterInputStream; import java.io.IOException; diff --git a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarOutputStream.java b/proposal/myrmidon/src/java/org/apache/aut/tar/TarOutputStream.java similarity index 99% rename from proposal/myrmidon/src/todo/org/apache/tools/tar/TarOutputStream.java rename to proposal/myrmidon/src/java/org/apache/aut/tar/TarOutputStream.java index dc00c63e8..e59e046c0 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarOutputStream.java +++ b/proposal/myrmidon/src/java/org/apache/aut/tar/TarOutputStream.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.tar; +package org.apache.aut.tar; import java.io.FilterOutputStream; import java.io.IOException; diff --git a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarUtils.java b/proposal/myrmidon/src/java/org/apache/aut/tar/TarUtils.java similarity index 99% rename from proposal/myrmidon/src/todo/org/apache/tools/tar/TarUtils.java rename to proposal/myrmidon/src/java/org/apache/aut/tar/TarUtils.java index 4f5395017..bbf72d127 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarUtils.java +++ b/proposal/myrmidon/src/java/org/apache/aut/tar/TarUtils.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.tar; +package org.apache.aut.tar; /** * This class provides static utility methods to work with byte streams. diff --git a/proposal/myrmidon/src/todo/org/apache/tools/zip/AsiExtraField.java b/proposal/myrmidon/src/java/org/apache/aut/zip/AsiExtraField.java similarity index 99% rename from proposal/myrmidon/src/todo/org/apache/tools/zip/AsiExtraField.java rename to proposal/myrmidon/src/java/org/apache/aut/zip/AsiExtraField.java index 121b94d7c..100c6ea7e 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/zip/AsiExtraField.java +++ b/proposal/myrmidon/src/java/org/apache/aut/zip/AsiExtraField.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.zip; +package org.apache.aut.zip; import java.util.zip.CRC32; import java.util.zip.ZipException; diff --git a/proposal/myrmidon/src/todo/org/apache/tools/zip/ExtraFieldUtils.java b/proposal/myrmidon/src/java/org/apache/aut/zip/ExtraFieldUtils.java similarity index 99% rename from proposal/myrmidon/src/todo/org/apache/tools/zip/ExtraFieldUtils.java rename to proposal/myrmidon/src/java/org/apache/aut/zip/ExtraFieldUtils.java index 969ab692f..59888e46b 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/zip/ExtraFieldUtils.java +++ b/proposal/myrmidon/src/java/org/apache/aut/zip/ExtraFieldUtils.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.zip; +package org.apache.aut.zip; import java.util.ArrayList; import java.util.Hashtable; diff --git a/proposal/myrmidon/src/main/org/apache/tools/zip/UnixStat.java b/proposal/myrmidon/src/java/org/apache/aut/zip/UnixStat.java similarity index 97% rename from proposal/myrmidon/src/main/org/apache/tools/zip/UnixStat.java rename to proposal/myrmidon/src/java/org/apache/aut/zip/UnixStat.java index adc1c790d..4d4579eb4 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/zip/UnixStat.java +++ b/proposal/myrmidon/src/java/org/apache/aut/zip/UnixStat.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.zip; +package org.apache.aut.zip; /** * Constants from stat.h on Unix systems. diff --git a/proposal/myrmidon/src/todo/org/apache/tools/zip/UnrecognizedExtraField.java b/proposal/myrmidon/src/java/org/apache/aut/zip/UnrecognizedExtraField.java similarity index 98% rename from proposal/myrmidon/src/todo/org/apache/tools/zip/UnrecognizedExtraField.java rename to proposal/myrmidon/src/java/org/apache/aut/zip/UnrecognizedExtraField.java index 4bdf29d20..0de625781 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/zip/UnrecognizedExtraField.java +++ b/proposal/myrmidon/src/java/org/apache/aut/zip/UnrecognizedExtraField.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.zip; +package org.apache.aut.zip; /** * Simple placeholder for all those extra fields we don't want to deal with.
diff --git a/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipEntry.java b/proposal/myrmidon/src/java/org/apache/aut/zip/ZipEntry.java similarity index 99% rename from proposal/myrmidon/src/todo/org/apache/tools/zip/ZipEntry.java rename to proposal/myrmidon/src/java/org/apache/aut/zip/ZipEntry.java index ba4f5373f..20fc6c585 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipEntry.java +++ b/proposal/myrmidon/src/java/org/apache/aut/zip/ZipEntry.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.zip; +package org.apache.aut.zip; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; diff --git a/proposal/myrmidon/src/main/org/apache/tools/zip/ZipExtraField.java b/proposal/myrmidon/src/java/org/apache/aut/zip/ZipExtraField.java similarity index 98% rename from proposal/myrmidon/src/main/org/apache/tools/zip/ZipExtraField.java rename to proposal/myrmidon/src/java/org/apache/aut/zip/ZipExtraField.java index a9dccde08..63a7f4387 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/zip/ZipExtraField.java +++ b/proposal/myrmidon/src/java/org/apache/aut/zip/ZipExtraField.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.zip; +package org.apache.aut.zip; import java.util.zip.ZipException; diff --git a/proposal/myrmidon/src/main/org/apache/tools/zip/ZipLong.java b/proposal/myrmidon/src/java/org/apache/aut/zip/ZipLong.java similarity index 98% rename from proposal/myrmidon/src/main/org/apache/tools/zip/ZipLong.java rename to proposal/myrmidon/src/java/org/apache/aut/zip/ZipLong.java index c7ce56869..73296db23 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/zip/ZipLong.java +++ b/proposal/myrmidon/src/java/org/apache/aut/zip/ZipLong.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.zip; +package org.apache.aut.zip; /** * Utility class that represents a four byte integer with conversion rules for diff --git a/proposal/myrmidon/src/main/org/apache/tools/zip/ZipOutputStream.java b/proposal/myrmidon/src/java/org/apache/aut/zip/ZipOutputStream.java similarity index 99% rename from proposal/myrmidon/src/main/org/apache/tools/zip/ZipOutputStream.java rename to proposal/myrmidon/src/java/org/apache/aut/zip/ZipOutputStream.java index 09c994388..2bbb64bde 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/zip/ZipOutputStream.java +++ b/proposal/myrmidon/src/java/org/apache/aut/zip/ZipOutputStream.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.zip; +package org.apache.aut.zip; import java.io.IOException; import java.io.OutputStream; diff --git a/proposal/myrmidon/src/main/org/apache/tools/zip/ZipShort.java b/proposal/myrmidon/src/java/org/apache/aut/zip/ZipShort.java similarity index 98% rename from proposal/myrmidon/src/main/org/apache/tools/zip/ZipShort.java rename to proposal/myrmidon/src/java/org/apache/aut/zip/ZipShort.java index e22a7096f..383d5be87 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/zip/ZipShort.java +++ b/proposal/myrmidon/src/java/org/apache/aut/zip/ZipShort.java @@ -5,7 +5,7 @@ * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ -package org.apache.tools.zip; +package org.apache.aut.zip; /** * Utility class that represents a two byte integer with conversion rules for diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Ear.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Ear.java index 805853e92..1381a6163 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Ear.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Ear.java @@ -11,7 +11,7 @@ import java.io.File; import java.io.IOException; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.types.ZipFileSet; -import org.apache.tools.zip.ZipOutputStream; +import org.apache.aut.zip.ZipOutputStream; /** * Creates a EAR archive. Based on WAR task diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Tar.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Tar.java index 7619da363..875cf090b 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Tar.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Tar.java @@ -19,9 +19,9 @@ import org.apache.tools.ant.types.EnumeratedAttribute; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.util.mappers.MergingMapper; import org.apache.tools.ant.types.SourceFileScanner; -import org.apache.tools.tar.TarConstants; -import org.apache.tools.tar.TarEntry; -import org.apache.tools.tar.TarOutputStream; +import org.apache.aut.tar.TarConstants; +import org.apache.aut.tar.TarEntry; +import org.apache.aut.tar.TarOutputStream; /** * Creates a TAR archive. diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Untar.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Untar.java index ddaf2346e..5bbe268a2 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Untar.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Untar.java @@ -11,8 +11,8 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.myrmidon.api.TaskException; -import org.apache.tools.tar.TarEntry; -import org.apache.tools.tar.TarInputStream; +import org.apache.aut.tar.TarEntry; +import org.apache.aut.tar.TarInputStream; /** * Untar a file. Heavily based on the Expand task. diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/War.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/War.java index ea9f8cae1..b73ce6ffd 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/War.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/War.java @@ -11,7 +11,7 @@ import java.io.File; import java.io.IOException; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.types.ZipFileSet; -import org.apache.tools.zip.ZipOutputStream; +import org.apache.aut.zip.ZipOutputStream; /** * Creates a WAR archive. diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Zip.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Zip.java index 89ea3e877..dfd17de51 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Zip.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/Zip.java @@ -28,8 +28,8 @@ import org.apache.tools.ant.types.SourceFileScanner; import org.apache.tools.ant.types.ZipFileSet; import org.apache.tools.ant.types.ZipScanner; import org.apache.tools.ant.util.mappers.MergingMapper; -import org.apache.tools.zip.ZipEntry; -import org.apache.tools.zip.ZipOutputStream; +import org.apache.aut.zip.ZipEntry; +import org.apache.aut.zip.ZipOutputStream; /** * Create a ZIP archive. diff --git a/proposal/myrmidon/src/main/org/apache/tools/bzip2/CBZip2OutputStream.java b/proposal/myrmidon/src/main/org/apache/tools/bzip2/CBZip2OutputStream.java deleted file mode 100644 index f266edf49..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/bzip2/CBZip2OutputStream.java +++ /dev/null @@ -1,1809 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.bzip2; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * An output stream that compresses into the BZip2 format (without the file - * header chars) into another stream. - * - * @author Keiron Liddle TODO: Update to - * BZip2 1.0.1 - */ -public class CBZip2OutputStream extends OutputStream implements BZip2Constants -{ - protected final static int SETMASK = ( 1 << 21 ); - protected final static int CLEARMASK = ( ~SETMASK ); - protected final static int GREATER_ICOST = 15; - protected final static int LESSER_ICOST = 0; - protected final static int SMALL_THRESH = 20; - protected final static int DEPTH_THRESH = 10; - - /* - * If you are ever unlucky/improbable enough - * to get a stack overflow whilst sorting, - * increase the following constant and try - * again. In practice I have never seen the - * stack go above 27 elems, so the following - * limit seems very generous. - */ - protected final static int QSORT_STACK_SIZE = 1000; - CRC mCrc = new CRC(); - - private boolean inUse[] = new boolean[ 256 ]; - - private char seqToUnseq[] = new char[ 256 ]; - private char unseqToSeq[] = new char[ 256 ]; - - private char selector[] = new char[ MAX_SELECTORS ]; - private char selectorMtf[] = new char[ MAX_SELECTORS ]; - - private int mtfFreq[] = new int[ MAX_ALPHA_SIZE ]; - - private int currentChar = -1; - private int runLength = 0; - - boolean closed = false; - - /* - * Knuth's increments seem to work better - * than Incerpi-Sedgewick here. Possibly - * because the number of elems to sort is - * usually small, typically <= 20. - */ - private int incs[] = {1, 4, 13, 40, 121, 364, 1093, 3280, - 9841, 29524, 88573, 265720, - 797161, 2391484}; - - boolean blockRandomised; - - /* - * always: in the range 0 .. 9. - * The current block size is 100000 * this number. - */ - int blockSize100k; - int bsBuff; - int bsLive; - - int bytesIn; - int bytesOut; - - /* - * index of the last char in the block, so - * the block size == last + 1. - */ - int last; - - /* - * index in zptr[] of original string after sorting. - */ - int origPtr; - - private int allowableBlockSize; - - private char block[]; - - private int blockCRC, combinedCRC; - - private OutputStream bsStream; - private boolean firstAttempt; - private int ftab[]; - private int nBlocksRandomised; - private int nInUse; - - private int nMTF; - private int quadrant[]; - private short szptr[]; - private int workDone; - - /* - * Used when sorting. If too many long comparisons - * happen, we stop sorting, randomise the block - * slightly, and try again. - */ - private int workFactor; - private int workLimit; - private int zptr[]; - - public CBZip2OutputStream( OutputStream inStream ) - throws IOException - { - this( inStream, 9 ); - } - - public CBZip2OutputStream( OutputStream inStream, int inBlockSize ) - throws IOException - { - block = null; - quadrant = null; - zptr = null; - ftab = null; - - bsSetStream( inStream ); - - workFactor = 50; - if( inBlockSize > 9 ) - { - inBlockSize = 9; - } - if( inBlockSize < 1 ) - { - inBlockSize = 1; - } - blockSize100k = inBlockSize; - allocateCompressStructures(); - initialize(); - initBlock(); - } - - protected static void hbMakeCodeLengths( char[] len, int[] freq, - int alphaSize, int maxLen ) - { - /* - * Nodes and heap entries run from 1. Entry 0 - * for both the heap and nodes is a sentinel. - */ - int nNodes; - /* - * Nodes and heap entries run from 1. Entry 0 - * for both the heap and nodes is a sentinel. - */ - int nHeap; - /* - * Nodes and heap entries run from 1. Entry 0 - * for both the heap and nodes is a sentinel. - */ - int n1; - /* - * Nodes and heap entries run from 1. Entry 0 - * for both the heap and nodes is a sentinel. - */ - int n2; - /* - * Nodes and heap entries run from 1. Entry 0 - * for both the heap and nodes is a sentinel. - */ - int i; - /* - * Nodes and heap entries run from 1. Entry 0 - * for both the heap and nodes is a sentinel. - */ - int j; - /* - * Nodes and heap entries run from 1. Entry 0 - * for both the heap and nodes is a sentinel. - */ - int k; - boolean tooLong; - - int heap[] = new int[ MAX_ALPHA_SIZE + 2 ]; - int weight[] = new int[ MAX_ALPHA_SIZE * 2 ]; - int parent[] = new int[ MAX_ALPHA_SIZE * 2 ]; - - for( i = 0; i < alphaSize; i++ ) - weight[ i + 1 ] = ( freq[ i ] == 0 ? 1 : freq[ i ] ) << 8; - - while( true ) - { - nNodes = alphaSize; - nHeap = 0; - - heap[ 0 ] = 0; - weight[ 0 ] = 0; - parent[ 0 ] = -2; - - for( i = 1; i <= alphaSize; i++ ) - { - parent[ i ] = -1; - nHeap++; - heap[ nHeap ] = i; - { - int zz; - int tmp; - zz = nHeap; - tmp = heap[ zz ]; - while( weight[ tmp ] < weight[ heap[ zz >> 1 ] ] ) - { - heap[ zz ] = heap[ zz >> 1 ]; - zz >>= 1; - } - heap[ zz ] = tmp; - } - } - if( !( nHeap < ( MAX_ALPHA_SIZE + 2 ) ) ) - panic(); - - while( nHeap > 1 ) - { - n1 = heap[ 1 ]; - heap[ 1 ] = heap[ nHeap ]; - nHeap--; - { - int zz = 0; - int yy = 0; - int tmp = 0; - zz = 1; - tmp = heap[ zz ]; - while( true ) - { - yy = zz << 1; - if( yy > nHeap ) - break; - if( yy < nHeap && - weight[ heap[ yy + 1 ] ] < weight[ heap[ yy ] ] ) - yy++; - if( weight[ tmp ] < weight[ heap[ yy ] ] ) - break; - heap[ zz ] = heap[ yy ]; - zz = yy; - } - heap[ zz ] = tmp; - } - n2 = heap[ 1 ]; - heap[ 1 ] = heap[ nHeap ]; - nHeap--; - { - int zz = 0; - int yy = 0; - int tmp = 0; - zz = 1; - tmp = heap[ zz ]; - while( true ) - { - yy = zz << 1; - if( yy > nHeap ) - break; - if( yy < nHeap && - weight[ heap[ yy + 1 ] ] < weight[ heap[ yy ] ] ) - yy++; - if( weight[ tmp ] < weight[ heap[ yy ] ] ) - break; - heap[ zz ] = heap[ yy ]; - zz = yy; - } - heap[ zz ] = tmp; - } - nNodes++; - parent[ n1 ] = parent[ n2 ] = nNodes; - - weight[ nNodes ] = ( ( weight[ n1 ] & 0xffffff00 ) - + ( weight[ n2 ] & 0xffffff00 ) ) - | ( 1 + ( ( ( weight[ n1 ] & 0x000000ff ) > - ( weight[ n2 ] & 0x000000ff ) ) ? - ( weight[ n1 ] & 0x000000ff ) : - ( weight[ n2 ] & 0x000000ff ) ) ); - - parent[ nNodes ] = -1; - nHeap++; - heap[ nHeap ] = nNodes; - { - int zz = 0; - int tmp = 0; - zz = nHeap; - tmp = heap[ zz ]; - while( weight[ tmp ] < weight[ heap[ zz >> 1 ] ] ) - { - heap[ zz ] = heap[ zz >> 1 ]; - zz >>= 1; - } - heap[ zz ] = tmp; - } - } - if( !( nNodes < ( MAX_ALPHA_SIZE * 2 ) ) ) - panic(); - - tooLong = false; - for( i = 1; i <= alphaSize; i++ ) - { - j = 0; - k = i; - while( parent[ k ] >= 0 ) - { - k = parent[ k ]; - j++; - } - len[ i - 1 ] = (char)j; - if( j > maxLen ) - tooLong = true; - } - - if( !tooLong ) - break; - - for( i = 1; i < alphaSize; i++ ) - { - j = weight[ i ] >> 8; - j = 1 + ( j / 2 ); - weight[ i ] = j << 8; - } - } - } - - private static void panic() - { - System.out.println( "panic" ); - //throw new CError(); - } - - public void close() - throws IOException - { - if( closed ) - return; - - if( runLength > 0 ) - writeRun(); - currentChar = -1; - endBlock(); - endCompression(); - closed = true; - super.close(); - bsStream.close(); - } - - public void finalize() - throws Throwable - { - close(); - } - - public void flush() - throws IOException - { - super.flush(); - bsStream.flush(); - } - - /** - * modified by Oliver Merkel, 010128 - * - * @param bv Description of Parameter - * @exception IOException Description of Exception - */ - public void write( int bv ) - throws IOException - { - int b = ( 256 + bv ) % 256; - if( currentChar != -1 ) - { - if( currentChar == b ) - { - runLength++; - if( runLength > 254 ) - { - writeRun(); - currentChar = -1; - runLength = 0; - } - } - else - { - writeRun(); - runLength = 1; - currentChar = b; - } - } - else - { - currentChar = b; - runLength++; - } - } - - private void allocateCompressStructures() - { - int n = BASE_BLOCK_SIZE * blockSize100k; - block = new char[ ( n + 1 + NUM_OVERSHOOT_BYTES ) ]; - quadrant = new int[ ( n + NUM_OVERSHOOT_BYTES ) ]; - zptr = new int[ n ]; - ftab = new int[ 65537 ]; - - if( block == null || quadrant == null || zptr == null - || ftab == null ) - { - //int totalDraw = (n + 1 + NUM_OVERSHOOT_BYTES) + (n + NUM_OVERSHOOT_BYTES) + n + 65537; - //compressOutOfMemory ( totalDraw, n ); - } - - /* - * The back end needs a place to store the MTF values - * whilst it calculates the coding tables. We could - * put them in the zptr array. However, these values - * will fit in a short, so we overlay szptr at the - * start of zptr, in the hope of reducing the number - * of cache misses induced by the multiple traversals - * of the MTF values when calculating coding tables. - * Seems to improve compression speed by about 1%. - */ - // szptr = zptr; - - szptr = new short[ 2 * n ]; - } - - private void bsFinishedWithStream() - throws IOException - { - while( bsLive > 0 ) - { - int ch = ( bsBuff >> 24 ); - try - { - bsStream.write( ch );// write 8-bit - } - catch( IOException e ) - { - throw e; - } - bsBuff <<= 8; - bsLive -= 8; - bytesOut++; - } - } - - private void bsPutIntVS( int numBits, int c ) - throws IOException - { - bsW( numBits, c ); - } - - private void bsPutUChar( int c ) - throws IOException - { - bsW( 8, c ); - } - - private void bsPutint( int u ) - throws IOException - { - bsW( 8, ( u >> 24 ) & 0xff ); - bsW( 8, ( u >> 16 ) & 0xff ); - bsW( 8, ( u >> 8 ) & 0xff ); - bsW( 8, u & 0xff ); - } - - private void bsSetStream( OutputStream f ) - { - bsStream = f; - bsLive = 0; - bsBuff = 0; - bytesOut = 0; - bytesIn = 0; - } - - private void bsW( int n, int v ) - throws IOException - { - while( bsLive >= 8 ) - { - int ch = ( bsBuff >> 24 ); - try - { - bsStream.write( ch );// write 8-bit - } - catch( IOException e ) - { - throw e; - } - bsBuff <<= 8; - bsLive -= 8; - bytesOut++; - } - bsBuff |= ( v << ( 32 - bsLive - n ) ); - bsLive += n; - } - - private void doReversibleTransformation() - { - int i; - - workLimit = workFactor * last; - workDone = 0; - blockRandomised = false; - firstAttempt = true; - - mainSort(); - - if( workDone > workLimit && firstAttempt ) - { - randomiseBlock(); - workLimit = workDone = 0; - blockRandomised = true; - firstAttempt = false; - mainSort(); - } - - origPtr = -1; - for( i = 0; i <= last; i++ ) - if( zptr[ i ] == 0 ) - { - origPtr = i; - break; - } - ; - - if( origPtr == -1 ) - panic(); - } - - private void endBlock() - throws IOException - { - blockCRC = mCrc.getFinalCRC(); - combinedCRC = ( combinedCRC << 1 ) | ( combinedCRC >>> 31 ); - combinedCRC ^= blockCRC; - - /* - * sort the block and establish posn of original string - */ - doReversibleTransformation(); - - /* - * A 6-byte block header, the value chosen arbitrarily - * as 0x314159265359 :-). A 32 bit value does not really - * give a strong enough guarantee that the value will not - * appear by chance in the compressed datastream. Worst-case - * probability of this event, for a 900k block, is about - * 2.0e-3 for 32 bits, 1.0e-5 for 40 bits and 4.0e-8 for 48 bits. - * For a compressed file of size 100Gb -- about 100000 blocks -- - * only a 48-bit marker will do. NB: normal compression/ - * decompression do *not* rely on these statistical properties. - * They are only important when trying to recover blocks from - * damaged files. - */ - bsPutUChar( 0x31 ); - bsPutUChar( 0x41 ); - bsPutUChar( 0x59 ); - bsPutUChar( 0x26 ); - bsPutUChar( 0x53 ); - bsPutUChar( 0x59 ); - - /* - * Now the block's CRC, so it is in a known place. - */ - bsPutint( blockCRC ); - - /* - * Now a single bit indicating randomisation. - */ - if( blockRandomised ) - { - bsW( 1, 1 ); - nBlocksRandomised++; - } - else - { - bsW( 1, 0 ); - } - - /* - * Finally, block's contents proper. - */ - moveToFrontCodeAndSend(); - } - - private void endCompression() - throws IOException - { - /* - * Now another magic 48-bit number, 0x177245385090, to - * indicate the end of the last block. (sqrt(pi), if - * you want to know. I did want to use e, but it contains - * too much repetition -- 27 18 28 18 28 46 -- for me - * to feel statistically comfortable. Call me paranoid.) - */ - bsPutUChar( 0x17 ); - bsPutUChar( 0x72 ); - bsPutUChar( 0x45 ); - bsPutUChar( 0x38 ); - bsPutUChar( 0x50 ); - bsPutUChar( 0x90 ); - - bsPutint( combinedCRC ); - - bsFinishedWithStream(); - } - - private boolean fullGtU( int i1, int i2 ) - { - int k; - char c1; - char c2; - int s1; - int s2; - - c1 = block[ i1 + 1 ]; - c2 = block[ i2 + 1 ]; - if( c1 != c2 ) - return ( c1 > c2 ); - i1++; - i2++; - - c1 = block[ i1 + 1 ]; - c2 = block[ i2 + 1 ]; - if( c1 != c2 ) - return ( c1 > c2 ); - i1++; - i2++; - - c1 = block[ i1 + 1 ]; - c2 = block[ i2 + 1 ]; - if( c1 != c2 ) - return ( c1 > c2 ); - i1++; - i2++; - - c1 = block[ i1 + 1 ]; - c2 = block[ i2 + 1 ]; - if( c1 != c2 ) - return ( c1 > c2 ); - i1++; - i2++; - - c1 = block[ i1 + 1 ]; - c2 = block[ i2 + 1 ]; - if( c1 != c2 ) - return ( c1 > c2 ); - i1++; - i2++; - - c1 = block[ i1 + 1 ]; - c2 = block[ i2 + 1 ]; - if( c1 != c2 ) - return ( c1 > c2 ); - i1++; - i2++; - - k = last + 1; - - do - { - c1 = block[ i1 + 1 ]; - c2 = block[ i2 + 1 ]; - if( c1 != c2 ) - return ( c1 > c2 ); - s1 = quadrant[ i1 ]; - s2 = quadrant[ i2 ]; - if( s1 != s2 ) - return ( s1 > s2 ); - i1++; - i2++; - - c1 = block[ i1 + 1 ]; - c2 = block[ i2 + 1 ]; - if( c1 != c2 ) - return ( c1 > c2 ); - s1 = quadrant[ i1 ]; - s2 = quadrant[ i2 ]; - if( s1 != s2 ) - return ( s1 > s2 ); - i1++; - i2++; - - c1 = block[ i1 + 1 ]; - c2 = block[ i2 + 1 ]; - if( c1 != c2 ) - return ( c1 > c2 ); - s1 = quadrant[ i1 ]; - s2 = quadrant[ i2 ]; - if( s1 != s2 ) - return ( s1 > s2 ); - i1++; - i2++; - - c1 = block[ i1 + 1 ]; - c2 = block[ i2 + 1 ]; - if( c1 != c2 ) - return ( c1 > c2 ); - s1 = quadrant[ i1 ]; - s2 = quadrant[ i2 ]; - if( s1 != s2 ) - return ( s1 > s2 ); - i1++; - i2++; - - if( i1 > last ) - { - i1 -= last; - i1--; - } - ; - if( i2 > last ) - { - i2 -= last; - i2--; - } - ; - - k -= 4; - workDone++; - } while( k >= 0 ); - - return false; - } - - private void generateMTFValues() - { - char yy[] = new char[ 256 ]; - int i; - int j; - char tmp; - char tmp2; - int zPend; - int wr; - int EOB; - - makeMaps(); - EOB = nInUse + 1; - - for( i = 0; i <= EOB; i++ ) - mtfFreq[ i ] = 0; - - wr = 0; - zPend = 0; - for( i = 0; i < nInUse; i++ ) - yy[ i ] = (char)i; - - for( i = 0; i <= last; i++ ) - { - char ll_i; - - ll_i = unseqToSeq[ block[ zptr[ i ] ] ]; - - j = 0; - tmp = yy[ j ]; - while( ll_i != tmp ) - { - j++; - tmp2 = tmp; - tmp = yy[ j ]; - yy[ j ] = tmp2; - } - ; - yy[ 0 ] = tmp; - - if( j == 0 ) - { - zPend++; - } - else - { - if( zPend > 0 ) - { - zPend--; - while( true ) - { - switch( zPend % 2 ) - { - case 0: - szptr[ wr ] = (short)RUNA; - wr++; - mtfFreq[ RUNA ]++; - break; - case 1: - szptr[ wr ] = (short)RUNB; - wr++; - mtfFreq[ RUNB ]++; - break; - } - ; - if( zPend < 2 ) - break; - zPend = ( zPend - 2 ) / 2; - } - ; - zPend = 0; - } - szptr[ wr ] = (short)( j + 1 ); - wr++; - mtfFreq[ j + 1 ]++; - } - } - - if( zPend > 0 ) - { - zPend--; - while( true ) - { - switch( zPend % 2 ) - { - case 0: - szptr[ wr ] = (short)RUNA; - wr++; - mtfFreq[ RUNA ]++; - break; - case 1: - szptr[ wr ] = (short)RUNB; - wr++; - mtfFreq[ RUNB ]++; - break; - } - if( zPend < 2 ) - break; - zPend = ( zPend - 2 ) / 2; - } - } - - szptr[ wr ] = (short)EOB; - wr++; - mtfFreq[ EOB ]++; - - nMTF = wr; - } - - private void hbAssignCodes( int[] code, char[] length, int minLen, - int maxLen, int alphaSize ) - { - int n; - int vec; - int i; - - vec = 0; - for( n = minLen; n <= maxLen; n++ ) - { - for( i = 0; i < alphaSize; i++ ) - if( length[ i ] == n ) - { - code[ i ] = vec; - vec++; - } - ; - vec <<= 1; - } - } - - private void initBlock() - { - // blockNo++; - mCrc.initialiseCRC(); - last = -1; - // ch = 0; - - for( int i = 0; i < 256; i++ ) - inUse[ i ] = false; - - /* - * 20 is just a paranoia constant - */ - allowableBlockSize = BASE_BLOCK_SIZE * blockSize100k - 20; - } - - private void initialize() - throws IOException - { - bytesIn = 0; - bytesOut = 0; - nBlocksRandomised = 0; - - /* - * Write `magic' bytes h indicating file-format == huffmanised, - * followed by a digit indicating blockSize100k. - */ - bsPutUChar( 'h' ); - bsPutUChar( '0' + blockSize100k ); - - combinedCRC = 0; - } - - private void mainSort() - { - int i; - int j; - int ss; - int sb; - int runningOrder[] = new int[ 256 ]; - int copy[] = new int[ 256 ]; - boolean bigDone[] = new boolean[ 256 ]; - int c1; - int c2; - int numQSorted; - - /* - * In the various block-sized structures, live data runs - * from 0 to last+NUM_OVERSHOOT_BYTES inclusive. First, - * set up the overshoot area for block. - */ - // if (verbosity >= 4) fprintf ( stderr, " sort initialise ...\n" ); - for( i = 0; i < NUM_OVERSHOOT_BYTES; i++ ) - block[ last + i + 2 ] = block[ ( i % ( last + 1 ) ) + 1 ]; - for( i = 0; i <= last + NUM_OVERSHOOT_BYTES; i++ ) - quadrant[ i ] = 0; - - block[ 0 ] = (char)( block[ last + 1 ] ); - - if( last < 4000 ) - { - /* - * Use simpleSort(), since the full sorting mechanism - * has quite a large constant overhead. - */ - for( i = 0; i <= last; i++ ) - zptr[ i ] = i; - firstAttempt = false; - workDone = workLimit = 0; - simpleSort( 0, last, 0 ); - } - else - { - numQSorted = 0; - for( i = 0; i <= 255; i++ ) - bigDone[ i ] = false; - - for( i = 0; i <= 65536; i++ ) - ftab[ i ] = 0; - - c1 = block[ 0 ]; - for( i = 0; i <= last; i++ ) - { - c2 = block[ i + 1 ]; - ftab[ ( c1 << 8 ) + c2 ]++; - c1 = c2; - } - - for( i = 1; i <= 65536; i++ ) - ftab[ i ] += ftab[ i - 1 ]; - - c1 = block[ 1 ]; - for( i = 0; i < last; i++ ) - { - c2 = block[ i + 2 ]; - j = ( c1 << 8 ) + c2; - c1 = c2; - ftab[ j ]--; - zptr[ ftab[ j ] ] = i; - } - - j = ( ( block[ last + 1 ] ) << 8 ) + ( block[ 1 ] ); - ftab[ j ]--; - zptr[ ftab[ j ] ] = last; - - /* - * Now ftab contains the first loc of every small bucket. - * Calculate the running order, from smallest to largest - * big bucket. - */ - for( i = 0; i <= 255; i++ ) - runningOrder[ i ] = i; - { - int vv; - int h = 1; - do - h = 3 * h + 1; - while( h <= 256 ); - do - { - h = h / 3; - for( i = h; i <= 255; i++ ) - { - vv = runningOrder[ i ]; - j = i; - while( ( ftab[ ( ( runningOrder[ j - h ] ) + 1 ) << 8 ] - - ftab[ ( runningOrder[ j - h ] ) << 8 ] ) > - ( ftab[ ( ( vv ) + 1 ) << 8 ] - ftab[ ( vv ) << 8 ] ) ) - { - runningOrder[ j ] = runningOrder[ j - h ]; - j = j - h; - if( j <= ( h - 1 ) ) - break; - } - runningOrder[ j ] = vv; - } - } while( h != 1 ); - } - - /* - * The main sorting loop. - */ - for( i = 0; i <= 255; i++ ) - { - - /* - * Process big buckets, starting with the least full. - */ - ss = runningOrder[ i ]; - - /* - * Complete the big bucket [ss] by quicksorting - * any unsorted small buckets [ss, j]. Hopefully - * previous pointer-scanning phases have already - * completed many of the small buckets [ss, j], so - * we don't have to sort them at all. - */ - for( j = 0; j <= 255; j++ ) - { - sb = ( ss << 8 ) + j; - if( !( ( ftab[ sb ] & SETMASK ) == SETMASK ) ) - { - int lo = ftab[ sb ] & CLEARMASK; - int hi = ( ftab[ sb + 1 ] & CLEARMASK ) - 1; - if( hi > lo ) - { - qSort3( lo, hi, 2 ); - numQSorted += ( hi - lo + 1 ); - if( workDone > workLimit && firstAttempt ) - return; - } - ftab[ sb ] |= SETMASK; - } - } - - /* - * The ss big bucket is now done. Record this fact, - * and update the quadrant descriptors. Remember to - * update quadrants in the overshoot area too, if - * necessary. The "if (i < 255)" test merely skips - * this updating for the last bucket processed, since - * updating for the last bucket is pointless. - */ - bigDone[ ss ] = true; - - if( i < 255 ) - { - int bbStart = ftab[ ss << 8 ] & CLEARMASK; - int bbSize = ( ftab[ ( ss + 1 ) << 8 ] & CLEARMASK ) - bbStart; - int shifts = 0; - - while( ( bbSize >> shifts ) > 65534 ) - shifts++; - - for( j = 0; j < bbSize; j++ ) - { - int a2update = zptr[ bbStart + j ]; - int qVal = ( j >> shifts ); - quadrant[ a2update ] = qVal; - if( a2update < NUM_OVERSHOOT_BYTES ) - quadrant[ a2update + last + 1 ] = qVal; - } - - if( !( ( ( bbSize - 1 ) >> shifts ) <= 65535 ) ) - panic(); - } - - /* - * Now scan this big bucket so as to synthesise the - * sorted order for small buckets [t, ss] for all t != ss. - */ - for( j = 0; j <= 255; j++ ) - copy[ j ] = ftab[ ( j << 8 ) + ss ] & CLEARMASK; - - for( j = ftab[ ss << 8 ] & CLEARMASK; - j < ( ftab[ ( ss + 1 ) << 8 ] & CLEARMASK ); j++ ) - { - c1 = block[ zptr[ j ] ]; - if( !bigDone[ c1 ] ) - { - zptr[ copy[ c1 ] ] = zptr[ j ] == 0 ? last : zptr[ j ] - 1; - copy[ c1 ]++; - } - } - - for( j = 0; j <= 255; j++ ) - ftab[ ( j << 8 ) + ss ] |= SETMASK; - } - } - } - - private void makeMaps() - { - int i; - nInUse = 0; - for( i = 0; i < 256; i++ ) - if( inUse[ i ] ) - { - seqToUnseq[ nInUse ] = (char)i; - unseqToSeq[ i ] = (char)nInUse; - nInUse++; - } - } - - private char med3( char a, char b, char c ) - { - char t; - if( a > b ) - { - t = a; - a = b; - b = t; - } - if( b > c ) - { - t = b; - b = c; - c = t; - } - if( a > b ) - b = a; - return b; - } - - private void moveToFrontCodeAndSend() - throws IOException - { - bsPutIntVS( 24, origPtr ); - generateMTFValues(); - sendMTFValues(); - } - - private void qSort3( int loSt, int hiSt, int dSt ) - { - int unLo; - int unHi; - int ltLo; - int gtHi; - int med; - int n; - int m; - int sp; - int lo; - int hi; - int d; - StackElem[] stack = new StackElem[ QSORT_STACK_SIZE ]; - for( int count = 0; count < QSORT_STACK_SIZE; count++ ) - stack[ count ] = new StackElem(); - - sp = 0; - - stack[ sp ].ll = loSt; - stack[ sp ].hh = hiSt; - stack[ sp ].dd = dSt; - sp++; - - while( sp > 0 ) - { - if( sp >= QSORT_STACK_SIZE ) - panic(); - - sp--; - lo = stack[ sp ].ll; - hi = stack[ sp ].hh; - d = stack[ sp ].dd; - - if( hi - lo < SMALL_THRESH || d > DEPTH_THRESH ) - { - simpleSort( lo, hi, d ); - if( workDone > workLimit && firstAttempt ) - return; - continue; - } - - med = med3( block[ zptr[ lo ] + d + 1 ], - block[ zptr[ hi ] + d + 1 ], - block[ zptr[ ( lo + hi ) >> 1 ] + d + 1 ] ); - - unLo = ltLo = lo; - unHi = gtHi = hi; - - while( true ) - { - while( true ) - { - if( unLo > unHi ) - break; - n = ( (int)block[ zptr[ unLo ] + d + 1 ] ) - med; - if( n == 0 ) - { - int temp = 0; - temp = zptr[ unLo ]; - zptr[ unLo ] = zptr[ ltLo ]; - zptr[ ltLo ] = temp; - ltLo++; - unLo++; - continue; - } - ; - if( n > 0 ) - break; - unLo++; - } - while( true ) - { - if( unLo > unHi ) - break; - n = ( (int)block[ zptr[ unHi ] + d + 1 ] ) - med; - if( n == 0 ) - { - int temp = 0; - temp = zptr[ unHi ]; - zptr[ unHi ] = zptr[ gtHi ]; - zptr[ gtHi ] = temp; - gtHi--; - unHi--; - continue; - } - ; - if( n < 0 ) - break; - unHi--; - } - if( unLo > unHi ) - break; - int temp = 0; - temp = zptr[ unLo ]; - zptr[ unLo ] = zptr[ unHi ]; - zptr[ unHi ] = temp; - unLo++; - unHi--; - } - - if( gtHi < ltLo ) - { - stack[ sp ].ll = lo; - stack[ sp ].hh = hi; - stack[ sp ].dd = d + 1; - sp++; - continue; - } - - n = ( ( ltLo - lo ) < ( unLo - ltLo ) ) ? ( ltLo - lo ) : ( unLo - ltLo ); - vswap( lo, unLo - n, n ); - m = ( ( hi - gtHi ) < ( gtHi - unHi ) ) ? ( hi - gtHi ) : ( gtHi - unHi ); - vswap( unLo, hi - m + 1, m ); - - n = lo + unLo - ltLo - 1; - m = hi - ( gtHi - unHi ) + 1; - - stack[ sp ].ll = lo; - stack[ sp ].hh = n; - stack[ sp ].dd = d; - sp++; - - stack[ sp ].ll = n + 1; - stack[ sp ].hh = m - 1; - stack[ sp ].dd = d + 1; - sp++; - - stack[ sp ].ll = m; - stack[ sp ].hh = hi; - stack[ sp ].dd = d; - sp++; - } - } - - private void randomiseBlock() - { - int i; - int rNToGo = 0; - int rTPos = 0; - for( i = 0; i < 256; i++ ) - inUse[ i ] = false; - - for( i = 0; i <= last; i++ ) - { - if( rNToGo == 0 ) - { - rNToGo = (char)RAND_NUMS[ rTPos ]; - rTPos++; - if( rTPos == 512 ) - rTPos = 0; - } - rNToGo--; - block[ i + 1 ] ^= ( ( rNToGo == 1 ) ? 1 : 0 ); - // handle 16 bit signed numbers - block[ i + 1 ] &= 0xFF; - - inUse[ block[ i + 1 ] ] = true; - } - } - - private void sendMTFValues() - throws IOException - { - char len[][] = new char[ N_GROUPS ][ MAX_ALPHA_SIZE ]; - - int v; - - int t; - - int i; - - int j; - - int gs; - - int ge; - - int totc; - - int bt; - - int bc; - - int iter; - int nSelectors = 0; - int alphaSize; - int minLen; - int maxLen; - int selCtr; - int nGroups; - int nBytes; - - alphaSize = nInUse + 2; - for( t = 0; t < N_GROUPS; t++ ) - for( v = 0; v < alphaSize; v++ ) - len[ t ][ v ] = (char)GREATER_ICOST; - - /* - * Decide how many coding tables to use - */ - if( nMTF <= 0 ) - panic(); - - if( nMTF < 200 ) - nGroups = 2; - else if( nMTF < 600 ) - nGroups = 3; - else if( nMTF < 1200 ) - nGroups = 4; - else if( nMTF < 2400 ) - nGroups = 5; - else - nGroups = 6; - { - /* - * Generate an initial set of coding tables - */ - int nPart; - int remF; - int tFreq; - int aFreq; - - nPart = nGroups; - remF = nMTF; - gs = 0; - while( nPart > 0 ) - { - tFreq = remF / nPart; - ge = gs - 1; - aFreq = 0; - while( aFreq < tFreq && ge < alphaSize - 1 ) - { - ge++; - aFreq += mtfFreq[ ge ]; - } - - if( ge > gs && nPart != nGroups && nPart != 1 - && ( ( nGroups - nPart ) % 2 == 1 ) ) - { - aFreq -= mtfFreq[ ge ]; - ge--; - } - - for( v = 0; v < alphaSize; v++ ) - if( v >= gs && v <= ge ) - len[ nPart - 1 ][ v ] = (char)LESSER_ICOST; - else - len[ nPart - 1 ][ v ] = (char)GREATER_ICOST; - - nPart--; - gs = ge + 1; - remF -= aFreq; - } - } - - int rfreq[][] = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ]; - int fave[] = new int[ N_GROUPS ]; - short cost[] = new short[ N_GROUPS ]; - /* - * Iterate up to N_ITERS times to improve the tables. - */ - for( iter = 0; iter < N_ITERS; iter++ ) - { - for( t = 0; t < nGroups; t++ ) - fave[ t ] = 0; - - for( t = 0; t < nGroups; t++ ) - for( v = 0; v < alphaSize; v++ ) - rfreq[ t ][ v ] = 0; - - nSelectors = 0; - totc = 0; - gs = 0; - while( true ) - { - - /* - * Set group start & end marks. - */ - if( gs >= nMTF ) - break; - ge = gs + G_SIZE - 1; - if( ge >= nMTF ) - ge = nMTF - 1; - - /* - * Calculate the cost of this group as coded - * by each of the coding tables. - */ - for( t = 0; t < nGroups; t++ ) - cost[ t ] = 0; - - if( nGroups == 6 ) - { - short cost0; - short cost1; - short cost2; - short cost3; - short cost4; - short cost5; - cost0 = cost1 = cost2 = cost3 = cost4 = cost5 = 0; - for( i = gs; i <= ge; i++ ) - { - short icv = szptr[ i ]; - cost0 += len[ 0 ][ icv ]; - cost1 += len[ 1 ][ icv ]; - cost2 += len[ 2 ][ icv ]; - cost3 += len[ 3 ][ icv ]; - cost4 += len[ 4 ][ icv ]; - cost5 += len[ 5 ][ icv ]; - } - cost[ 0 ] = cost0; - cost[ 1 ] = cost1; - cost[ 2 ] = cost2; - cost[ 3 ] = cost3; - cost[ 4 ] = cost4; - cost[ 5 ] = cost5; - } - else - { - for( i = gs; i <= ge; i++ ) - { - short icv = szptr[ i ]; - for( t = 0; t < nGroups; t++ ) - cost[ t ] += len[ t ][ icv ]; - } - } - - /* - * Find the coding table which is best for this group, - * and record its identity in the selector table. - */ - bc = 999999999; - bt = -1; - for( t = 0; t < nGroups; t++ ) - if( cost[ t ] < bc ) - { - bc = cost[ t ]; - bt = t; - } - ; - totc += bc; - fave[ bt ]++; - selector[ nSelectors ] = (char)bt; - nSelectors++; - - /* - * Increment the symbol frequencies for the selected table. - */ - for( i = gs; i <= ge; i++ ) - rfreq[ bt ][ szptr[ i ] ]++; - - gs = ge + 1; - } - - /* - * Recompute the tables based on the accumulated frequencies. - */ - for( t = 0; t < nGroups; t++ ) - hbMakeCodeLengths( len[ t ], rfreq[ t ], alphaSize, 20 ); - } - - rfreq = null; - fave = null; - cost = null; - - if( !( nGroups < 8 ) ) - panic(); - if( !( nSelectors < 32768 && nSelectors <= ( 2 + ( 900000 / G_SIZE ) ) ) ) - panic(); - { - /* - * Compute MTF values for the selectors. - */ - char pos[] = new char[ N_GROUPS ]; - char ll_i; - char tmp2; - char tmp; - for( i = 0; i < nGroups; i++ ) - pos[ i ] = (char)i; - for( i = 0; i < nSelectors; i++ ) - { - ll_i = selector[ i ]; - j = 0; - tmp = pos[ j ]; - while( ll_i != tmp ) - { - j++; - tmp2 = tmp; - tmp = pos[ j ]; - pos[ j ] = tmp2; - } - pos[ 0 ] = tmp; - selectorMtf[ i ] = (char)j; - } - } - - int code[][] = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ]; - - /* - * Assign actual codes for the tables. - */ - for( t = 0; t < nGroups; t++ ) - { - minLen = 32; - maxLen = 0; - for( i = 0; i < alphaSize; i++ ) - { - if( len[ t ][ i ] > maxLen ) - maxLen = len[ t ][ i ]; - if( len[ t ][ i ] < minLen ) - minLen = len[ t ][ i ]; - } - if( maxLen > 20 ) - panic(); - if( minLen < 1 ) - panic(); - hbAssignCodes( code[ t ], len[ t ], minLen, maxLen, alphaSize ); - } - { - /* - * Transmit the mapping table. - */ - boolean inUse16[] = new boolean[ 16 ]; - for( i = 0; i < 16; i++ ) - { - inUse16[ i ] = false; - for( j = 0; j < 16; j++ ) - if( inUse[ i * 16 + j ] ) - inUse16[ i ] = true; - } - - nBytes = bytesOut; - for( i = 0; i < 16; i++ ) - if( inUse16[ i ] ) - bsW( 1, 1 ); - else - bsW( 1, 0 ); - - for( i = 0; i < 16; i++ ) - if( inUse16[ i ] ) - for( j = 0; j < 16; j++ ) - if( inUse[ i * 16 + j ] ) - bsW( 1, 1 ); - else - bsW( 1, 0 ); - - } - - /* - * Now the selectors. - */ - nBytes = bytesOut; - bsW( 3, nGroups ); - bsW( 15, nSelectors ); - for( i = 0; i < nSelectors; i++ ) - { - for( j = 0; j < selectorMtf[ i ]; j++ ) - bsW( 1, 1 ); - bsW( 1, 0 ); - } - - /* - * Now the coding tables. - */ - nBytes = bytesOut; - - for( t = 0; t < nGroups; t++ ) - { - int curr = len[ t ][ 0 ]; - bsW( 5, curr ); - for( i = 0; i < alphaSize; i++ ) - { - while( curr < len[ t ][ i ] ) - { - bsW( 2, 2 ); - curr++; - /* - * 10 - */ - } - while( curr > len[ t ][ i ] ) - { - bsW( 2, 3 ); - curr--; - /* - * 11 - */ - } - bsW( 1, 0 ); - } - } - - /* - * And finally, the block data proper - */ - nBytes = bytesOut; - selCtr = 0; - gs = 0; - while( true ) - { - if( gs >= nMTF ) - break; - ge = gs + G_SIZE - 1; - if( ge >= nMTF ) - ge = nMTF - 1; - for( i = gs; i <= ge; i++ ) - { - bsW( len[ selector[ selCtr ] ][ szptr[ i ] ], - code[ selector[ selCtr ] ][ szptr[ i ] ] ); - } - - gs = ge + 1; - selCtr++; - } - if( !( selCtr == nSelectors ) ) - panic(); - } - - private void simpleSort( int lo, int hi, int d ) - { - int i; - int j; - int h; - int bigN; - int hp; - int v; - - bigN = hi - lo + 1; - if( bigN < 2 ) - return; - - hp = 0; - while( incs[ hp ] < bigN ) - hp++; - hp--; - - for( ; hp >= 0; hp-- ) - { - h = incs[ hp ]; - - i = lo + h; - while( true ) - { - /* - * copy 1 - */ - if( i > hi ) - break; - v = zptr[ i ]; - j = i; - while( fullGtU( zptr[ j - h ] + d, v + d ) ) - { - zptr[ j ] = zptr[ j - h ]; - j = j - h; - if( j <= ( lo + h - 1 ) ) - break; - } - zptr[ j ] = v; - i++; - - /* - * copy 2 - */ - if( i > hi ) - break; - v = zptr[ i ]; - j = i; - while( fullGtU( zptr[ j - h ] + d, v + d ) ) - { - zptr[ j ] = zptr[ j - h ]; - j = j - h; - if( j <= ( lo + h - 1 ) ) - break; - } - zptr[ j ] = v; - i++; - - /* - * copy 3 - */ - if( i > hi ) - break; - v = zptr[ i ]; - j = i; - while( fullGtU( zptr[ j - h ] + d, v + d ) ) - { - zptr[ j ] = zptr[ j - h ]; - j = j - h; - if( j <= ( lo + h - 1 ) ) - break; - } - zptr[ j ] = v; - i++; - - if( workDone > workLimit && firstAttempt ) - return; - } - } - } - - private void vswap( int p1, int p2, int n ) - { - int temp = 0; - while( n > 0 ) - { - temp = zptr[ p1 ]; - zptr[ p1 ] = zptr[ p2 ]; - zptr[ p2 ] = temp; - p1++; - p2++; - n--; - } - } - - private void writeRun() - throws IOException - { - if( last < allowableBlockSize ) - { - inUse[ currentChar ] = true; - for( int i = 0; i < runLength; i++ ) - { - mCrc.updateCRC( (char)currentChar ); - } - switch( runLength ) - { - case 1: - last++; - block[ last + 1 ] = (char)currentChar; - break; - case 2: - last++; - block[ last + 1 ] = (char)currentChar; - last++; - block[ last + 1 ] = (char)currentChar; - break; - case 3: - last++; - block[ last + 1 ] = (char)currentChar; - last++; - block[ last + 1 ] = (char)currentChar; - last++; - block[ last + 1 ] = (char)currentChar; - break; - default: - inUse[ runLength - 4 ] = true; - last++; - block[ last + 1 ] = (char)currentChar; - last++; - block[ last + 1 ] = (char)currentChar; - last++; - block[ last + 1 ] = (char)currentChar; - last++; - block[ last + 1 ] = (char)currentChar; - last++; - block[ last + 1 ] = (char)( runLength - 4 ); - break; - } - } - else - { - endBlock(); - initBlock(); - writeRun(); - } - } - - private class StackElem - { - int dd; - int hh; - int ll; - } -} - diff --git a/proposal/myrmidon/src/main/org/apache/tools/bzip2/CRC.java b/proposal/myrmidon/src/main/org/apache/tools/bzip2/CRC.java deleted file mode 100644 index b35667df5..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/bzip2/CRC.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.bzip2; - -/** - * A simple class the hold and calculate the CRC for sanity checking of the - * data. - * - * @author Keiron Liddle - */ -class CRC -{ - private static int CRC32_TABLE[] = new int[] - { - 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, - 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, - 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, - 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, - 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, - 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, - 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, - 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, - 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, - 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, - 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, - 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, - 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, - 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, - 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, - 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, - 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, - 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, - 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, - 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, - 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, - 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, - 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, - 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, - 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, - 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, - 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, - 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, - 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, - 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, - 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, - 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, - 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, - 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, - 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, - 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, - 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, - 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, - 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, - 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, - 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, - 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, - 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, - 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, - 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, - 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, - 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, - 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, - 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, - 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, - 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, - 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, - 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, - 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, - 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, - 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, - 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, - 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, - 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, - 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, - 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, - 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, - 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, - 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 - }; - - private int m_globalCrc; - - protected CRC() - { - initialiseCRC(); - } - - void setGlobalCRC( final int newCrc ) - { - m_globalCrc = newCrc; - } - - int getFinalCRC() - { - return ~m_globalCrc; - } - - int getGlobalCRC() - { - return m_globalCrc; - } - - void initialiseCRC() - { - m_globalCrc = 0xffffffff; - } - - void updateCRC( final int inCh ) - { - int temp = ( m_globalCrc >> 24 ) ^ inCh; - if( temp < 0 ) - { - temp = 256 + temp; - } - m_globalCrc = ( m_globalCrc << 8 ) ^ CRC32_TABLE[ temp ]; - } -} - diff --git a/proposal/myrmidon/src/main/org/apache/tools/tar/TarEntry.java b/proposal/myrmidon/src/main/org/apache/tools/tar/TarEntry.java deleted file mode 100644 index 6568134e4..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/tar/TarEntry.java +++ /dev/null @@ -1,653 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.tar; - -import java.io.File; -import java.util.Date; - -/** - * This class represents an entry in a Tar archive. It consists of the entry's - * header, as well as the entry's File. Entries can be instantiated in one of - * three ways, depending on how they are to be used.
- * - * TarEntries that are created from the header bytes read from an archive are - * instantiated with the TarEntry( byte[] ) constructor. These entries will be - * used when extracting from or listing the contents of an archive. These - * entries have their header filled in using the header bytes. They also set the - * File to null, since they reference an archive entry not a file.
- * - * TarEntries that are created from Files that are to be written into an archive - * are instantiated with the TarEntry( File ) constructor. These entries have - * their header filled in using the File's information. They also keep a - * reference to the File for convenience when writing entries.
- * - * Finally, TarEntries can be constructed from nothing but a name. This allows - * the programmer to construct the entry by hand, for instance when only an - * InputStream is available for writing to the archive, and the header - * information is constructed from other information. In this case the header - * fields are set to defaults and the File is set to null.
- * - * The C structure for a Tar Entry's header is:
- * struct header { - * char name[NAMSIZ]; - * char mode[8]; - * char uid[8]; - * char gid[8]; - * char size[12]; - * char mtime[12]; - * char chksum[8]; - * char linkflag; - * char linkname[NAMSIZ]; - * char magic[8]; - * char uname[TUNMLEN]; - * char gname[TGNMLEN]; - * char devmajor[8]; - * char devminor[8]; - * } header; - *- * - * @author Timothy Gerard Endres time@ice.com - * @author Stefano Mazzocchi - * stefano@apache.org - */ - -public class TarEntry implements TarConstants -{ - /** - * The entry's modification time. - */ - private int checkSum; - /** - * The entry's group name. - */ - private int devMajor; - /** - * The entry's major device number. - */ - private int devMinor; - /** - * The entry's minor device number. - */ - private File file; - /** - * The entry's user id. - */ - private int groupId; - /** - * The entry's user name. - */ - private StringBuffer groupName; - /** - * The entry's checksum. - */ - private byte linkFlag; - /** - * The entry's link flag. - */ - private StringBuffer linkName; - /** - * The entry's link name. - */ - private StringBuffer magic; - /** - * The entry's size. - */ - private long modTime; - /** - * The entry's name. - */ - private int mode; - - private StringBuffer name; - /** - * The entry's group id. - */ - private long size; - /** - * The entry's permission mode. - */ - private int userId; - /** - * The entry's magic tag. - */ - private StringBuffer userName; - - /** - * Construct an entry with only a name. This allows the programmer to - * construct the entry's header "by hand". File is set to null. - * - * @param name Description of Parameter - */ - public TarEntry( String name ) - { - this(); - - boolean isDir = name.endsWith( "/" ); - - this.checkSum = 0; - this.devMajor = 0; - this.devMinor = 0; - this.name = new StringBuffer( name ); - this.mode = isDir ? 040755 : 0100644; - this.linkFlag = isDir ? LF_DIR : LF_NORMAL; - this.userId = 0; - this.groupId = 0; - this.size = 0; - this.checkSum = 0; - this.modTime = ( new Date() ).getTime() / 1000; - this.linkName = new StringBuffer( "" ); - this.userName = new StringBuffer( "" ); - this.groupName = new StringBuffer( "" ); - this.devMajor = 0; - this.devMinor = 0; - - } - - /** - * Construct an entry with a name an a link flag. - * - * @param name Description of Parameter - * @param linkFlag Description of Parameter - */ - public TarEntry( String name, byte linkFlag ) - { - this( name ); - this.linkFlag = linkFlag; - } - - /** - * Construct an entry for a file. File is set to file, and the header is - * constructed from information from the file. - * - * @param file The file that the entry represents. - */ - public TarEntry( File file ) - { - this(); - - this.file = file; - - String name = file.getPath(); - String osname = System.getProperty( "os.name" ); - - if( osname != null ) - { - - // Strip off drive letters! - // REVIEW Would a better check be "(File.separator == '\')"? - String win32Prefix = "Windows"; - String prefix = osname.substring( 0, win32Prefix.length() ); - - if( prefix.equalsIgnoreCase( win32Prefix ) ) - { - if( name.length() > 2 ) - { - char ch1 = name.charAt( 0 ); - char ch2 = name.charAt( 1 ); - - if( ch2 == ':' - && ( ( ch1 >= 'a' && ch1 <= 'z' ) - || ( ch1 >= 'A' && ch1 <= 'Z' ) ) ) - { - name = name.substring( 2 ); - } - } - } - else if( osname.toLowerCase().indexOf( "netware" ) > -1 ) - { - int colon = name.indexOf( ':' ); - if( colon != -1 ) - { - name = name.substring( colon + 1 ); - } - } - } - - name = name.replace( File.separatorChar, '/' ); - - // No absolute pathnames - // Windows (and Posix?) paths can start with "\\NetworkDrive\", - // so we loop on starting /'s. - while( name.startsWith( "/" ) ) - { - name = name.substring( 1 ); - } - - this.linkName = new StringBuffer( "" ); - this.name = new StringBuffer( name ); - - if( file.isDirectory() ) - { - this.mode = 040755; - this.linkFlag = LF_DIR; - - if( this.name.charAt( this.name.length() - 1 ) != '/' ) - { - this.name.append( "/" ); - } - } - else - { - this.mode = 0100644; - this.linkFlag = LF_NORMAL; - } - - this.size = file.length(); - this.modTime = file.lastModified() / 1000; - this.checkSum = 0; - this.devMajor = 0; - this.devMinor = 0; - } - - /** - * Construct an entry from an archive's header bytes. File is set to null. - * - * @param headerBuf The header bytes from a tar archive entry. - */ - public TarEntry( byte[] headerBuf ) - { - this(); - this.parseTarHeader( headerBuf ); - } - - /** - * The entry's file reference - */ - - /** - * Construct an empty entry and prepares the header values. - */ - private TarEntry() - { - this.magic = new StringBuffer( TMAGIC ); - this.name = new StringBuffer(); - this.linkName = new StringBuffer(); - - String user = System.getProperty( "user.name", "" ); - - if( user.length() > 31 ) - { - user = user.substring( 0, 31 ); - } - - this.userId = 0; - this.groupId = 0; - this.userName = new StringBuffer( user ); - this.groupName = new StringBuffer( "" ); - this.file = null; - } - - /** - * Set this entry's group id. - * - * @param groupId This entry's new group id. - */ - public void setGroupId( int groupId ) - { - this.groupId = groupId; - } - - /** - * Set this entry's group name. - * - * @param groupName This entry's new group name. - */ - public void setGroupName( String groupName ) - { - this.groupName = new StringBuffer( groupName ); - } - - /** - * Convenience method to set this entry's group and user ids. - * - * @param userId This entry's new user id. - * @param groupId This entry's new group id. - */ - public void setIds( int userId, int groupId ) - { - this.setUserId( userId ); - this.setGroupId( groupId ); - } - - /** - * Set this entry's modification time. The parameter passed to this method - * is in "Java time". - * - * @param time This entry's new modification time. - */ - public void setModTime( long time ) - { - this.modTime = time / 1000; - } - - /** - * Set this entry's modification time. - * - * @param time This entry's new modification time. - */ - public void setModTime( Date time ) - { - this.modTime = time.getTime() / 1000; - } - - /** - * Set the mode for this entry - * - * @param mode The new Mode value - */ - public void setMode( int mode ) - { - this.mode = mode; - } - - /** - * Set this entry's name. - * - * @param name This entry's new name. - */ - public void setName( String name ) - { - this.name = new StringBuffer( name ); - } - - /** - * Convenience method to set this entry's group and user names. - * - * @param userName This entry's new user name. - * @param groupName This entry's new group name. - */ - public void setNames( String userName, String groupName ) - { - this.setUserName( userName ); - this.setGroupName( groupName ); - } - - /** - * Set this entry's file size. - * - * @param size This entry's new file size. - */ - public void setSize( long size ) - { - this.size = size; - } - - /** - * Set this entry's user id. - * - * @param userId This entry's new user id. - */ - public void setUserId( int userId ) - { - this.userId = userId; - } - - /** - * Set this entry's user name. - * - * @param userName This entry's new user name. - */ - public void setUserName( String userName ) - { - this.userName = new StringBuffer( userName ); - } - - /** - * If this entry represents a file, and the file is a directory, return an - * array of TarEntries for this entry's children. - * - * @return An array of TarEntry's for this entry's children. - */ - public TarEntry[] getDirectoryEntries() - { - if( this.file == null || !this.file.isDirectory() ) - { - return new TarEntry[ 0 ]; - } - - String[] list = this.file.list(); - TarEntry[] result = new TarEntry[ list.length ]; - - for( int i = 0; i < list.length; ++i ) - { - result[ i ] = new TarEntry( new File( this.file, list[ i ] ) ); - } - - return result; - } - - /** - * Get this entry's file. - * - * @return This entry's file. - */ - public File getFile() - { - return this.file; - } - - /** - * Get this entry's group id. - * - * @return This entry's group id. - */ - public int getGroupId() - { - return this.groupId; - } - - /** - * Get this entry's group name. - * - * @return This entry's group name. - */ - public String getGroupName() - { - return this.groupName.toString(); - } - - /** - * Set this entry's modification time. - * - * @return The ModTime value - */ - public Date getModTime() - { - return new Date( this.modTime * 1000 ); - } - - /** - * Get this entry's mode. - * - * @return This entry's mode. - */ - public int getMode() - { - return this.mode; - } - - /** - * Get this entry's name. - * - * @return This entry's name. - */ - public String getName() - { - return this.name.toString(); - } - - /** - * Get this entry's file size. - * - * @return This entry's file size. - */ - public long getSize() - { - return this.size; - } - - /** - * Get this entry's user id. - * - * @return This entry's user id. - */ - public int getUserId() - { - return this.userId; - } - - /** - * Get this entry's user name. - * - * @return This entry's user name. - */ - public String getUserName() - { - return this.userName.toString(); - } - - /** - * Determine if the given entry is a descendant of this entry. Descendancy - * is determined by the name of the descendant starting with this entry's - * name. - * - * @param desc Entry to be checked as a descendent of this. - * @return True if entry is a descendant of this. - */ - public boolean isDescendent( TarEntry desc ) - { - return desc.getName().startsWith( this.getName() ); - } - - /** - * Return whether or not this entry represents a directory. - * - * @return True if this entry is a directory. - */ - public boolean isDirectory() - { - if( this.file != null ) - { - return this.file.isDirectory(); - } - - if( this.linkFlag == LF_DIR ) - { - return true; - } - - if( this.getName().endsWith( "/" ) ) - { - return true; - } - - return false; - } - - /** - * Indicate if this entry is a GNU long name block - * - * @return true if this is a long name extension provided by GNU tar - */ - public boolean isGNULongNameEntry() - { - return linkFlag == LF_GNUTYPE_LONGNAME && - name.toString().equals( GNU_LONGLINK ); - } - - /** - * Determine if the two entries are equal. Equality is determined by the - * header names being equal. - * - * @param it Description of Parameter - * @return it Entry to be checked for equality. - * @return True if the entries are equal. - */ - public boolean equals( TarEntry it ) - { - return this.getName().equals( it.getName() ); - } - - /** - * Parse an entry's header information from a header buffer. - * - * @param header The tar entry header buffer to get information from. - */ - public void parseTarHeader( byte[] header ) - { - int offset = 0; - - this.name = TarUtils.parseName( header, offset, NAMELEN ); - offset += NAMELEN; - this.mode = (int)TarUtils.parseOctal( header, offset, MODELEN ); - offset += MODELEN; - this.userId = (int)TarUtils.parseOctal( header, offset, UIDLEN ); - offset += UIDLEN; - this.groupId = (int)TarUtils.parseOctal( header, offset, GIDLEN ); - offset += GIDLEN; - this.size = TarUtils.parseOctal( header, offset, SIZELEN ); - offset += SIZELEN; - this.modTime = TarUtils.parseOctal( header, offset, MODTIMELEN ); - offset += MODTIMELEN; - this.checkSum = (int)TarUtils.parseOctal( header, offset, CHKSUMLEN ); - offset += CHKSUMLEN; - this.linkFlag = header[ offset++ ]; - this.linkName = TarUtils.parseName( header, offset, NAMELEN ); - offset += NAMELEN; - this.magic = TarUtils.parseName( header, offset, MAGICLEN ); - offset += MAGICLEN; - this.userName = TarUtils.parseName( header, offset, UNAMELEN ); - offset += UNAMELEN; - this.groupName = TarUtils.parseName( header, offset, GNAMELEN ); - offset += GNAMELEN; - this.devMajor = (int)TarUtils.parseOctal( header, offset, DEVLEN ); - offset += DEVLEN; - this.devMinor = (int)TarUtils.parseOctal( header, offset, DEVLEN ); - } - - /** - * Write an entry's header information to a header buffer. - * - * @param outbuf The tar entry header buffer to fill in. - */ - public void writeEntryHeader( byte[] outbuf ) - { - int offset = 0; - - offset = TarUtils.getNameBytes( this.name, outbuf, offset, NAMELEN ); - offset = TarUtils.getOctalBytes( this.mode, outbuf, offset, MODELEN ); - offset = TarUtils.getOctalBytes( this.userId, outbuf, offset, UIDLEN ); - offset = TarUtils.getOctalBytes( this.groupId, outbuf, offset, GIDLEN ); - offset = TarUtils.getLongOctalBytes( this.size, outbuf, offset, SIZELEN ); - offset = TarUtils.getLongOctalBytes( this.modTime, outbuf, offset, MODTIMELEN ); - - int csOffset = offset; - - for( int c = 0; c < CHKSUMLEN; ++c ) - { - outbuf[ offset++ ] = (byte)' '; - } - - outbuf[ offset++ ] = this.linkFlag; - offset = TarUtils.getNameBytes( this.linkName, outbuf, offset, NAMELEN ); - offset = TarUtils.getNameBytes( this.magic, outbuf, offset, MAGICLEN ); - offset = TarUtils.getNameBytes( this.userName, outbuf, offset, UNAMELEN ); - offset = TarUtils.getNameBytes( this.groupName, outbuf, offset, GNAMELEN ); - offset = TarUtils.getOctalBytes( this.devMajor, outbuf, offset, DEVLEN ); - offset = TarUtils.getOctalBytes( this.devMinor, outbuf, offset, DEVLEN ); - - while( offset < outbuf.length ) - { - outbuf[ offset++ ] = 0; - } - - long checkSum = TarUtils.computeCheckSum( outbuf ); - - TarUtils.getCheckSumOctalBytes( checkSum, outbuf, csOffset, CHKSUMLEN ); - } -} diff --git a/proposal/myrmidon/src/main/org/apache/tools/tar/TarInputStream.java b/proposal/myrmidon/src/main/org/apache/tools/tar/TarInputStream.java deleted file mode 100644 index f657f5d1b..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/tar/TarInputStream.java +++ /dev/null @@ -1,444 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.tar; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * The TarInputStream reads a UNIX tar archive as an InputStream. methods are - * provided to position at each successive entry in the archive, and the read - * each entry as a normal input stream using read(). - * - * @author Timothy Gerard Endres time@ice.com - * @author Stefano Mazzocchi - * stefano@apache.org - */ -public class TarInputStream extends FilterInputStream -{ - protected TarBuffer buffer; - protected TarEntry currEntry; - - protected boolean debug; - protected int entryOffset; - protected int entrySize; - protected boolean hasHitEOF; - protected byte[] oneBuf; - protected byte[] readBuf; - - public TarInputStream( InputStream is ) - { - this( is, TarBuffer.DEFAULT_BLKSIZE, TarBuffer.DEFAULT_RCDSIZE ); - } - - public TarInputStream( InputStream is, int blockSize ) - { - this( is, blockSize, TarBuffer.DEFAULT_RCDSIZE ); - } - - public TarInputStream( InputStream is, int blockSize, int recordSize ) - { - super( is ); - - this.buffer = new TarBuffer( is, blockSize, recordSize ); - this.readBuf = null; - this.oneBuf = new byte[ 1 ]; - this.debug = false; - this.hasHitEOF = false; - } - - /** - * Sets the debugging flag. - * - * @param debug The new Debug value - */ - public void setDebug( boolean debug ) - { - this.debug = debug; - this.buffer.setDebug( debug ); - } - - /** - * Get the next entry in this tar archive. This will skip over any remaining - * data in the current entry, if there is one, and place the input stream at - * the header of the next entry, and read the header and instantiate a new - * TarEntry from the header bytes and return that entry. If there are no - * more entries in the archive, null will be returned to indicate that the - * end of the archive has been reached. - * - * @return The next TarEntry in the archive, or null. - * @exception IOException Description of Exception - */ - public TarEntry getNextEntry() - throws IOException - { - if( this.hasHitEOF ) - { - return null; - } - - if( this.currEntry != null ) - { - int numToSkip = this.entrySize - this.entryOffset; - - if( this.debug ) - { - System.err.println( "TarInputStream: SKIP currENTRY '" - + this.currEntry.getName() + "' SZ " - + this.entrySize + " OFF " - + this.entryOffset + " skipping " - + numToSkip + " bytes" ); - } - - if( numToSkip > 0 ) - { - this.skip( numToSkip ); - } - - this.readBuf = null; - } - - byte[] headerBuf = this.buffer.readRecord(); - - if( headerBuf == null ) - { - if( this.debug ) - { - System.err.println( "READ NULL RECORD" ); - } - this.hasHitEOF = true; - } - else if( this.buffer.isEOFRecord( headerBuf ) ) - { - if( this.debug ) - { - System.err.println( "READ EOF RECORD" ); - } - this.hasHitEOF = true; - } - - if( this.hasHitEOF ) - { - this.currEntry = null; - } - else - { - this.currEntry = new TarEntry( headerBuf ); - - if( !( headerBuf[ 257 ] == 'u' && headerBuf[ 258 ] == 's' - && headerBuf[ 259 ] == 't' && headerBuf[ 260 ] == 'a' - && headerBuf[ 261 ] == 'r' ) ) - { - this.entrySize = 0; - this.entryOffset = 0; - this.currEntry = null; - - throw new IOException( "bad header in block " - + this.buffer.getCurrentBlockNum() - + " record " - + this.buffer.getCurrentRecordNum() - + ", " + - "header magic is not 'ustar', but '" - + headerBuf[ 257 ] - + headerBuf[ 258 ] - + headerBuf[ 259 ] - + headerBuf[ 260 ] - + headerBuf[ 261 ] - + "', or (dec) " - + ( (int)headerBuf[ 257 ] ) - + ", " - + ( (int)headerBuf[ 258 ] ) - + ", " - + ( (int)headerBuf[ 259 ] ) - + ", " - + ( (int)headerBuf[ 260 ] ) - + ", " - + ( (int)headerBuf[ 261 ] ) ); - } - - if( this.debug ) - { - System.err.println( "TarInputStream: SET CURRENTRY '" - + this.currEntry.getName() - + "' size = " - + this.currEntry.getSize() ); - } - - this.entryOffset = 0; - - // REVIEW How do we resolve this discrepancy?! - this.entrySize = (int)this.currEntry.getSize(); - } - - if( this.currEntry != null && this.currEntry.isGNULongNameEntry() ) - { - // read in the name - StringBuffer longName = new StringBuffer(); - byte[] buffer = new byte[ 256 ]; - int length = 0; - while( ( length = read( buffer ) ) >= 0 ) - { - longName.append( new String( buffer, 0, length ) ); - } - getNextEntry(); - this.currEntry.setName( longName.toString() ); - } - - return this.currEntry; - } - - /** - * Get the record size being used by this stream's TarBuffer. - * - * @return The TarBuffer record size. - */ - public int getRecordSize() - { - return this.buffer.getRecordSize(); - } - - /** - * Get the available data that can be read from the current entry in the - * archive. This does not indicate how much data is left in the entire - * archive, only in the current entry. This value is determined from the - * entry's size header field and the amount of data already read from the - * current entry. - * - * @return The number of available bytes for the current entry. - * @exception IOException Description of Exception - */ - public int available() - throws IOException - { - return this.entrySize - this.entryOffset; - } - - /** - * Closes this stream. Calls the TarBuffer's close() method. - * - * @exception IOException Description of Exception - */ - public void close() - throws IOException - { - this.buffer.close(); - } - - /** - * Copies the contents of the current tar archive entry directly into an - * output stream. - * - * @param out The OutputStream into which to write the entry's data. - * @exception IOException Description of Exception - */ - public void copyEntryContents( OutputStream out ) - throws IOException - { - byte[] buf = new byte[ 32 * 1024 ]; - - while( true ) - { - int numRead = this.read( buf, 0, buf.length ); - - if( numRead == -1 ) - { - break; - } - - out.write( buf, 0, numRead ); - } - } - - /** - * Since we do not support marking just yet, we do nothing. - * - * @param markLimit The limit to mark. - */ - public void mark( int markLimit ) - { - } - - /** - * Since we do not support marking just yet, we return false. - * - * @return False. - */ - public boolean markSupported() - { - return false; - } - - /** - * Reads a byte from the current tar archive entry. This method simply calls - * read( byte[], int, int ). - * - * @return The byte read, or -1 at EOF. - * @exception IOException Description of Exception - */ - public int read() - throws IOException - { - int num = this.read( this.oneBuf, 0, 1 ); - - if( num == -1 ) - { - return num; - } - else - { - return (int)this.oneBuf[ 0 ]; - } - } - - /** - * Reads bytes from the current tar archive entry. This method simply calls - * read( byte[], int, int ). - * - * @param buf The buffer into which to place bytes read. - * @return The number of bytes read, or -1 at EOF. - * @exception IOException Description of Exception - */ - public int read( byte[] buf ) - throws IOException - { - return this.read( buf, 0, buf.length ); - } - - /** - * Reads bytes from the current tar archive entry. This method is aware of - * the boundaries of the current entry in the archive and will deal with - * them as if they were this stream's start and EOF. - * - * @param buf The buffer into which to place bytes read. - * @param offset The offset at which to place bytes read. - * @param numToRead The number of bytes to read. - * @return The number of bytes read, or -1 at EOF. - * @exception IOException Description of Exception - */ - public int read( byte[] buf, int offset, int numToRead ) - throws IOException - { - int totalRead = 0; - - if( this.entryOffset >= this.entrySize ) - { - return -1; - } - - if( ( numToRead + this.entryOffset ) > this.entrySize ) - { - numToRead = ( this.entrySize - this.entryOffset ); - } - - if( this.readBuf != null ) - { - int sz = ( numToRead > this.readBuf.length ) ? this.readBuf.length - : numToRead; - - System.arraycopy( this.readBuf, 0, buf, offset, sz ); - - if( sz >= this.readBuf.length ) - { - this.readBuf = null; - } - else - { - int newLen = this.readBuf.length - sz; - byte[] newBuf = new byte[ newLen ]; - - System.arraycopy( this.readBuf, sz, newBuf, 0, newLen ); - - this.readBuf = newBuf; - } - - totalRead += sz; - numToRead -= sz; - offset += sz; - } - - while( numToRead > 0 ) - { - byte[] rec = this.buffer.readRecord(); - - if( rec == null ) - { - // Unexpected EOF! - throw new IOException( "unexpected EOF with " + numToRead - + " bytes unread" ); - } - - int sz = numToRead; - int recLen = rec.length; - - if( recLen > sz ) - { - System.arraycopy( rec, 0, buf, offset, sz ); - - this.readBuf = new byte[ recLen - sz ]; - - System.arraycopy( rec, sz, this.readBuf, 0, recLen - sz ); - } - else - { - sz = recLen; - - System.arraycopy( rec, 0, buf, offset, recLen ); - } - - totalRead += sz; - numToRead -= sz; - offset += sz; - } - - this.entryOffset += totalRead; - - return totalRead; - } - - /** - * Since we do not support marking just yet, we do nothing. - */ - public void reset() - { - } - - /** - * Skip bytes in the input buffer. This skips bytes in the current entry's - * data, not the entire archive, and will stop at the end of the current - * entry's data if the number to skip extends beyond that point. - * - * @param numToSkip The number of bytes to skip. - * @exception IOException Description of Exception - */ - public void skip( int numToSkip ) - throws IOException - { - - // REVIEW - // This is horribly inefficient, but it ensures that we - // properly skip over bytes via the TarBuffer... - // - byte[] skipBuf = new byte[ 8 * 1024 ]; - - for( int num = numToSkip; num > 0; ) - { - int numRead = this.read( skipBuf, 0, - ( num > skipBuf.length ? skipBuf.length - : num ) ); - - if( numRead == -1 ) - { - break; - } - - num -= numRead; - } - } -} diff --git a/proposal/myrmidon/src/main/org/apache/tools/tar/TarOutputStream.java b/proposal/myrmidon/src/main/org/apache/tools/tar/TarOutputStream.java deleted file mode 100644 index dc00c63e8..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/tar/TarOutputStream.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.tar; - -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -/** - * The TarOutputStream writes a UNIX tar archive as an OutputStream. Methods are - * provided to put entries, and then write their contents by writing to this - * stream using write(). - * - * @author Timothy Gerard Endres time@ice.com - */ -public class TarOutputStream extends FilterOutputStream -{ - public final static int LONGFILE_ERROR = 0; - public final static int LONGFILE_TRUNCATE = 1; - public final static int LONGFILE_GNU = 2; - protected int longFileMode = LONGFILE_ERROR; - protected byte[] assemBuf; - protected int assemLen; - protected TarBuffer buffer; - protected int currBytes; - protected int currSize; - - protected boolean debug; - protected byte[] oneBuf; - protected byte[] recordBuf; - - public TarOutputStream( OutputStream os ) - { - this( os, TarBuffer.DEFAULT_BLKSIZE, TarBuffer.DEFAULT_RCDSIZE ); - } - - public TarOutputStream( OutputStream os, int blockSize ) - { - this( os, blockSize, TarBuffer.DEFAULT_RCDSIZE ); - } - - public TarOutputStream( OutputStream os, int blockSize, int recordSize ) - { - super( os ); - - this.buffer = new TarBuffer( os, blockSize, recordSize ); - this.debug = false; - this.assemLen = 0; - this.assemBuf = new byte[ recordSize ]; - this.recordBuf = new byte[ recordSize ]; - this.oneBuf = new byte[ 1 ]; - } - - /** - * Sets the debugging flag in this stream's TarBuffer. - * - * @param debug The new BufferDebug value - */ - public void setBufferDebug( boolean debug ) - { - this.buffer.setDebug( debug ); - } - - /** - * Sets the debugging flag. - * - * @param debugF True to turn on debugging. - */ - public void setDebug( boolean debugF ) - { - this.debug = debugF; - } - - public void setLongFileMode( int longFileMode ) - { - this.longFileMode = longFileMode; - } - - /** - * Get the record size being used by this stream's TarBuffer. - * - * @return The TarBuffer record size. - */ - public int getRecordSize() - { - return this.buffer.getRecordSize(); - } - - /** - * Ends the TAR archive and closes the underlying OutputStream. This means - * that finish() is called followed by calling the TarBuffer's close(). - * - * @exception IOException Description of Exception - */ - public void close() - throws IOException - { - this.finish(); - this.buffer.close(); - } - - /** - * Close an entry. This method MUST be called for all file entries that - * contain data. The reason is that we must buffer data written to the - * stream in order to satisfy the buffer's record based writes. Thus, there - * may be data fragments still being assembled that must be written to the - * output stream before this entry is closed and the next entry written. - * - * @exception IOException Description of Exception - */ - public void closeEntry() - throws IOException - { - if( this.assemLen > 0 ) - { - for( int i = this.assemLen; i < this.assemBuf.length; ++i ) - { - this.assemBuf[ i ] = 0; - } - - this.buffer.writeRecord( this.assemBuf ); - - this.currBytes += this.assemLen; - this.assemLen = 0; - } - - if( this.currBytes < this.currSize ) - { - throw new IOException( "entry closed at '" + this.currBytes - + "' before the '" + this.currSize - + "' bytes specified in the header were written" ); - } - } - - /** - * Ends the TAR archive without closing the underlying OutputStream. The - * result is that the EOF record of nulls is written. - * - * @exception IOException Description of Exception - */ - public void finish() - throws IOException - { - this.writeEOFRecord(); - } - - /** - * Put an entry on the output stream. This writes the entry's header record - * and positions the output stream for writing the contents of the entry. - * Once this method is called, the stream is ready for calls to write() to - * write the entry's contents. Once the contents are written, closeEntry() - * MUST be called to ensure that all buffered data is completely - * written to the output stream. - * - * @param entry The TarEntry to be written to the archive. - * @exception IOException Description of Exception - */ - public void putNextEntry( TarEntry entry ) - throws IOException - { - if( entry.getName().length() >= TarConstants.NAMELEN ) - { - - if( longFileMode == LONGFILE_GNU ) - { - // create a TarEntry for the LongLink, the contents - // of which are the entry's name - TarEntry longLinkEntry = new TarEntry( TarConstants.GNU_LONGLINK, - TarConstants.LF_GNUTYPE_LONGNAME ); - - longLinkEntry.setSize( entry.getName().length() + 1 ); - putNextEntry( longLinkEntry ); - write( entry.getName().getBytes() ); - write( 0 ); - closeEntry(); - } - else if( longFileMode != LONGFILE_TRUNCATE ) - { - throw new RuntimeException( "file name '" + entry.getName() - + "' is too long ( > " - + TarConstants.NAMELEN + " bytes)" ); - } - } - - entry.writeEntryHeader( this.recordBuf ); - this.buffer.writeRecord( this.recordBuf ); - - this.currBytes = 0; - - if( entry.isDirectory() ) - { - this.currSize = 0; - } - else - { - this.currSize = (int)entry.getSize(); - } - } - - /** - * Writes a byte to the current tar archive entry. This method simply calls - * read( byte[], int, int ). - * - * @param b The byte written. - * @exception IOException Description of Exception - */ - public void write( int b ) - throws IOException - { - this.oneBuf[ 0 ] = (byte)b; - - this.write( this.oneBuf, 0, 1 ); - } - - /** - * Writes bytes to the current tar archive entry. This method simply calls - * write( byte[], int, int ). - * - * @param wBuf The buffer to write to the archive. - * @exception IOException Description of Exception - */ - public void write( byte[] wBuf ) - throws IOException - { - this.write( wBuf, 0, wBuf.length ); - } - - /** - * Writes bytes to the current tar archive entry. This method is aware of - * the current entry and will throw an exception if you attempt to write - * bytes past the length specified for the current entry. The method is also - * (painfully) aware of the record buffering required by TarBuffer, and - * manages buffers that are not a multiple of recordsize in length, - * including assembling records from small buffers. - * - * @param wBuf The buffer to write to the archive. - * @param wOffset The offset in the buffer from which to get bytes. - * @param numToWrite The number of bytes to write. - * @exception IOException Description of Exception - */ - public void write( byte[] wBuf, int wOffset, int numToWrite ) - throws IOException - { - if( ( this.currBytes + numToWrite ) > this.currSize ) - { - throw new IOException( "request to write '" + numToWrite - + "' bytes exceeds size in header of '" - + this.currSize + "' bytes" ); - // - // We have to deal with assembly!!! - // The programmer can be writing little 32 byte chunks for all - // we know, and we must assemble complete records for writing. - // REVIEW Maybe this should be in TarBuffer? Could that help to - // eliminate some of the buffer copying. - // - } - - if( this.assemLen > 0 ) - { - if( ( this.assemLen + numToWrite ) >= this.recordBuf.length ) - { - int aLen = this.recordBuf.length - this.assemLen; - - System.arraycopy( this.assemBuf, 0, this.recordBuf, 0, - this.assemLen ); - System.arraycopy( wBuf, wOffset, this.recordBuf, - this.assemLen, aLen ); - this.buffer.writeRecord( this.recordBuf ); - - this.currBytes += this.recordBuf.length; - wOffset += aLen; - numToWrite -= aLen; - this.assemLen = 0; - } - else - { - System.arraycopy( wBuf, wOffset, this.assemBuf, this.assemLen, - numToWrite ); - - wOffset += numToWrite; - this.assemLen += numToWrite; - numToWrite -= numToWrite; - } - } - - // - // When we get here we have EITHER: - // o An empty "assemble" buffer. - // o No bytes to write (numToWrite == 0) - // - while( numToWrite > 0 ) - { - if( numToWrite < this.recordBuf.length ) - { - System.arraycopy( wBuf, wOffset, this.assemBuf, this.assemLen, - numToWrite ); - - this.assemLen += numToWrite; - - break; - } - - this.buffer.writeRecord( wBuf, wOffset ); - - int num = this.recordBuf.length; - - this.currBytes += num; - numToWrite -= num; - wOffset += num; - } - } - - /** - * Write an EOF (end of archive) record to the tar archive. An EOF record - * consists of a record of all zeros. - * - * @exception IOException Description of Exception - */ - private void writeEOFRecord() - throws IOException - { - for( int i = 0; i < this.recordBuf.length; ++i ) - { - this.recordBuf[ i ] = 0; - } - - this.buffer.writeRecord( this.recordBuf ); - } -} - diff --git a/proposal/myrmidon/src/main/org/apache/tools/tar/TarUtils.java b/proposal/myrmidon/src/main/org/apache/tools/tar/TarUtils.java deleted file mode 100644 index 4f5395017..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/tar/TarUtils.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.tar; - -/** - * This class provides static utility methods to work with byte streams. - * - * @author Timothy Gerard Endres time@ice.com - * @author Stefano Mazzocchi - * stefano@apache.org - */ -public class TarUtils -{ - /** - * Parse the checksum octal integer from a header buffer. - * - * @param offset The offset into the buffer from which to parse. - * @param length The number of header bytes to parse. - * @param value Description of Parameter - * @param buf Description of Parameter - * @return The integer value of the entry's checksum. - */ - public static int getCheckSumOctalBytes( long value, byte[] buf, int offset, int length ) - { - getOctalBytes( value, buf, offset, length ); - - buf[ offset + length - 1 ] = (byte)' '; - buf[ offset + length - 2 ] = 0; - - return offset + length; - } - - /** - * Parse an octal long integer from a header buffer. - * - * @param offset The offset into the buffer from which to parse. - * @param length The number of header bytes to parse. - * @param value Description of Parameter - * @param buf Description of Parameter - * @return The long value of the octal bytes. - */ - public static int getLongOctalBytes( long value, byte[] buf, int offset, int length ) - { - byte[] temp = new byte[ length + 1 ]; - - getOctalBytes( value, temp, 0, length + 1 ); - System.arraycopy( temp, 0, buf, offset, length ); - - return offset + length; - } - - /** - * Determine the number of bytes in an entry name. - * - * @param offset The offset into the buffer from which to parse. - * @param length The number of header bytes to parse. - * @param name Description of Parameter - * @param buf Description of Parameter - * @return The number of bytes in a header's entry name. - */ - public static int getNameBytes( StringBuffer name, byte[] buf, int offset, int length ) - { - int i; - - for( i = 0; i < length && i < name.length(); ++i ) - { - buf[ offset + i ] = (byte)name.charAt( i ); - } - - for( ; i < length; ++i ) - { - buf[ offset + i ] = 0; - } - - return offset + length; - } - - /** - * Parse an octal integer from a header buffer. - * - * @param offset The offset into the buffer from which to parse. - * @param length The number of header bytes to parse. - * @param value Description of Parameter - * @param buf Description of Parameter - * @return The integer value of the octal bytes. - */ - public static int getOctalBytes( long value, byte[] buf, int offset, int length ) - { - byte[] result = new byte[ length ]; - int idx = length - 1; - - buf[ offset + idx ] = 0; - --idx; - buf[ offset + idx ] = (byte)' '; - --idx; - - if( value == 0 ) - { - buf[ offset + idx ] = (byte)'0'; - --idx; - } - else - { - for( long val = value; idx >= 0 && val > 0; --idx ) - { - buf[ offset + idx ] = (byte)( (byte)'0' + (byte)( val & 7 ) ); - val = val >> 3; - } - } - - for( ; idx >= 0; --idx ) - { - buf[ offset + idx ] = (byte)' '; - } - - return offset + length; - } - - /** - * Compute the checksum of a tar entry header. - * - * @param buf The tar entry's header buffer. - * @return The computed checksum. - */ - public static long computeCheckSum( byte[] buf ) - { - long sum = 0; - - for( int i = 0; i < buf.length; ++i ) - { - sum += 255 & buf[ i ]; - } - - return sum; - } - - /** - * Parse an entry name from a header buffer. - * - * @param header The header buffer from which to parse. - * @param offset The offset into the buffer from which to parse. - * @param length The number of header bytes to parse. - * @return The header's entry name. - */ - public static StringBuffer parseName( byte[] header, int offset, int length ) - { - StringBuffer result = new StringBuffer( length ); - int end = offset + length; - - for( int i = offset; i < end; ++i ) - { - if( header[ i ] == 0 ) - { - break; - } - - result.append( (char)header[ i ] ); - } - - return result; - } - - /** - * Parse an octal string from a header buffer. This is used for the file - * permission mode value. - * - * @param header The header buffer from which to parse. - * @param offset The offset into the buffer from which to parse. - * @param length The number of header bytes to parse. - * @return The long value of the octal string. - */ - public static long parseOctal( byte[] header, int offset, int length ) - { - long result = 0; - boolean stillPadding = true; - int end = offset + length; - - for( int i = offset; i < end; ++i ) - { - if( header[ i ] == 0 ) - { - break; - } - - if( header[ i ] == (byte)' ' || header[ i ] == '0' ) - { - if( stillPadding ) - { - continue; - } - - if( header[ i ] == (byte)' ' ) - { - break; - } - } - - stillPadding = false; - result = ( result << 3 ) + ( header[ i ] - '0' ); - } - - return result; - } -} diff --git a/proposal/myrmidon/src/main/org/apache/tools/zip/AsiExtraField.java b/proposal/myrmidon/src/main/org/apache/tools/zip/AsiExtraField.java deleted file mode 100644 index 121b94d7c..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/zip/AsiExtraField.java +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.zip; - -import java.util.zip.CRC32; -import java.util.zip.ZipException; - -/** - * Adds Unix file permission and UID/GID fields as well as symbolic link - * handling.
- * - * This class uses the ASi extra field in the format:
- * Value Size Description - * ----- ---- ----------- - * (Unix3) 0x756e Short tag for this extra block type - * TSize Short total data size for this block - * CRC Long CRC-32 of the remaining data - * Mode Short file permissions - * SizDev Long symlink'd size OR major/minor dev num - * UID Short user ID - * GID Short group ID - * (var.) variable symbolic link filename - *taken from appnote.iz (Info-ZIP note, 981119) found at - * ftp://ftp.uu.net/pub/archiving/zip/doc/
- * - * Short is two bytes and Long is four bytes in big endian byte and word order, - * device numbers are currently not supported.
- * - * @author Stefan Bodewig - * @version $Revision$ - */ -public class AsiExtraField implements ZipExtraField, UnixStat, Cloneable -{ - - private final static ZipShort HEADER_ID = new ZipShort( 0x756E ); - - /** - * Standard Unix stat(2) file mode. - * - * @since 1.1 - */ - private int mode = 0; - /** - * User ID. - * - * @since 1.1 - */ - private int uid = 0; - /** - * Group ID. - * - * @since 1.1 - */ - private int gid = 0; - /** - * File this entry points to, if it is a symbolic link.- * - * empty string - if entry is not a symbolic link.
- * - * @since 1.1 - */ - private String link = ""; - /** - * Is this an entry for a directory? - * - * @since 1.1 - */ - private boolean dirFlag = false; - - /** - * Instance used to calculate checksums. - * - * @since 1.1 - */ - private CRC32 crc = new CRC32(); - - public AsiExtraField() - { - } - - /** - * Indicate whether this entry is a directory. - * - * @param dirFlag The new Directory value - * @since 1.1 - */ - public void setDirectory( boolean dirFlag ) - { - this.dirFlag = dirFlag; - mode = getMode( mode ); - } - - /** - * Set the group id. - * - * @param gid The new GroupId value - * @since 1.1 - */ - public void setGroupId( int gid ) - { - this.gid = gid; - } - - /** - * Indicate that this entry is a symbolic link to the given filename. - * - * @param name Name of the file this entry links to, empty String if it is - * not a symbolic link. - * @since 1.1 - */ - public void setLinkedFile( String name ) - { - link = name; - mode = getMode( mode ); - } - - /** - * File mode of this file. - * - * @param mode The new Mode value - * @since 1.1 - */ - public void setMode( int mode ) - { - this.mode = getMode( mode ); - } - - /** - * Set the user id. - * - * @param uid The new UserId value - * @since 1.1 - */ - public void setUserId( int uid ) - { - this.uid = uid; - } - - /** - * Delegate to local file data. - * - * @return The CentralDirectoryData value - * @since 1.1 - */ - public byte[] getCentralDirectoryData() - { - return getLocalFileDataData(); - } - - /** - * Delegate to local file data. - * - * @return The CentralDirectoryLength value - * @since 1.1 - */ - public ZipShort getCentralDirectoryLength() - { - return getLocalFileDataLength(); - } - - /** - * Get the group id. - * - * @return The GroupId value - * @since 1.1 - */ - public int getGroupId() - { - return gid; - } - - /** - * The Header-ID. - * - * @return The HeaderId value - * @since 1.1 - */ - public ZipShort getHeaderId() - { - return HEADER_ID; - } - - /** - * Name of linked file - * - * @return name of the file this entry links to if it is a symbolic link, - * the empty string otherwise. - * @since 1.1 - */ - public String getLinkedFile() - { - return link; - } - - /** - * The actual data to put into local file data - without Header-ID or length - * specifier. - * - * @return The LocalFileDataData value - * @since 1.1 - */ - public byte[] getLocalFileDataData() - { - // CRC will be added later - byte[] data = new byte[ getLocalFileDataLength().getValue() - 4 ]; - System.arraycopy( ( new ZipShort( getMode() ) ).getBytes(), 0, data, 0, 2 ); - - byte[] linkArray = getLinkedFile().getBytes(); - System.arraycopy( ( new ZipLong( linkArray.length ) ).getBytes(), - 0, data, 2, 4 ); - - System.arraycopy( ( new ZipShort( getUserId() ) ).getBytes(), - 0, data, 6, 2 ); - System.arraycopy( ( new ZipShort( getGroupId() ) ).getBytes(), - 0, data, 8, 2 ); - - System.arraycopy( linkArray, 0, data, 10, linkArray.length ); - - crc.reset(); - crc.update( data ); - long checksum = crc.getValue(); - - byte[] result = new byte[ data.length + 4 ]; - System.arraycopy( ( new ZipLong( checksum ) ).getBytes(), 0, result, 0, 4 ); - System.arraycopy( data, 0, result, 4, data.length ); - return result; - } - - /** - * Length of the extra field in the local file data - without Header-ID or - * length specifier. - * - * @return The LocalFileDataLength value - * @since 1.1 - */ - public ZipShort getLocalFileDataLength() - { - return new ZipShort( 4// CRC - + 2// Mode - + 4// SizDev - + 2// UID - + 2// GID - + getLinkedFile().getBytes().length ); - } - - /** - * File mode of this file. - * - * @return The Mode value - * @since 1.1 - */ - public int getMode() - { - return mode; - } - - /** - * Get the user id. - * - * @return The UserId value - * @since 1.1 - */ - public int getUserId() - { - return uid; - } - - /** - * Is this entry a directory? - * - * @return The Directory value - * @since 1.1 - */ - public boolean isDirectory() - { - return dirFlag && !isLink(); - } - - /** - * Is this entry a symbolic link? - * - * @return The Link value - * @since 1.1 - */ - public boolean isLink() - { - return getLinkedFile().length() != 0; - } - - /** - * Populate data from this array as if it was in local file data. - * - * @param data Description of Parameter - * @param offset Description of Parameter - * @param length Description of Parameter - * @exception ZipException Description of Exception - * @since 1.1 - */ - public void parseFromLocalFileData( byte[] data, int offset, int length ) - throws ZipException - { - - long givenChecksum = ( new ZipLong( data, offset ) ).getValue(); - byte[] tmp = new byte[ length - 4 ]; - System.arraycopy( data, offset + 4, tmp, 0, length - 4 ); - crc.reset(); - crc.update( tmp ); - long realChecksum = crc.getValue(); - if( givenChecksum != realChecksum ) - { - throw new ZipException( "bad CRC checksum " - + Long.toHexString( givenChecksum ) - + " instead of " - + Long.toHexString( realChecksum ) ); - } - - int newMode = ( new ZipShort( tmp, 0 ) ).getValue(); - byte[] linkArray = new byte[ (int)( new ZipLong( tmp, 2 ) ).getValue() ]; - uid = ( new ZipShort( tmp, 6 ) ).getValue(); - gid = ( new ZipShort( tmp, 8 ) ).getValue(); - - if( linkArray.length == 0 ) - { - link = ""; - } - else - { - System.arraycopy( tmp, 10, linkArray, 0, linkArray.length ); - link = new String( linkArray ); - } - setDirectory( ( newMode & DIR_FLAG ) != 0 ); - setMode( newMode ); - } - - /** - * Get the file mode for given permissions with the correct file type. - * - * @param mode Description of Parameter - * @return The Mode value - * @since 1.1 - */ - protected int getMode( int mode ) - { - int type = FILE_FLAG; - if( isLink() ) - { - type = LINK_FLAG; - } - else if( isDirectory() ) - { - type = DIR_FLAG; - } - return type | ( mode & PERM_MASK ); - } - -} diff --git a/proposal/myrmidon/src/main/org/apache/tools/zip/ExtraFieldUtils.java b/proposal/myrmidon/src/main/org/apache/tools/zip/ExtraFieldUtils.java deleted file mode 100644 index 969ab692f..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/zip/ExtraFieldUtils.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.zip; - -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.zip.ZipException; - -/** - * ZipExtraField related methods - * - * @author Stefan Bodewig - * @version $Revision$ - */ -public class ExtraFieldUtils -{ - - /** - * Static registry of known extra fields. - * - * @since 1.1 - */ - private static Hashtable implementations; - - static - { - implementations = new Hashtable(); - register( AsiExtraField.class ); - } - - /** - * Create an instance of the approriate ExtraField, falls back to {@link - * UnrecognizedExtraField UnrecognizedExtraField}. - * - * @param headerId Description of Parameter - * @return Description of the Returned Value - * @exception InstantiationException Description of Exception - * @exception IllegalAccessException Description of Exception - * @since 1.1 - */ - public static ZipExtraField createExtraField( ZipShort headerId ) - throws InstantiationException, IllegalAccessException - { - Class c = (Class)implementations.get( headerId ); - if( c != null ) - { - return (ZipExtraField)c.newInstance(); - } - UnrecognizedExtraField u = new UnrecognizedExtraField(); - u.setHeaderId( headerId ); - return u; - } - - /** - * Merges the central directory fields of the given ZipExtraFields. - * - * @param data Description of Parameter - * @return Description of the Returned Value - * @since 1.1 - */ - public static byte[] mergeCentralDirectoryData( ZipExtraField[] data ) - { - int sum = 4 * data.length; - for( int i = 0; i < data.length; i++ ) - { - sum += data[ i ].getCentralDirectoryLength().getValue(); - } - byte[] result = new byte[ sum ]; - int start = 0; - for( int i = 0; i < data.length; i++ ) - { - System.arraycopy( data[ i ].getHeaderId().getBytes(), - 0, result, start, 2 ); - System.arraycopy( data[ i ].getCentralDirectoryLength().getBytes(), - 0, result, start + 2, 2 ); - byte[] local = data[ i ].getCentralDirectoryData(); - System.arraycopy( local, 0, result, start + 4, local.length ); - start += ( local.length + 4 ); - } - return result; - } - - /** - * Merges the local file data fields of the given ZipExtraFields. - * - * @param data Description of Parameter - * @return Description of the Returned Value - * @since 1.1 - */ - public static byte[] mergeLocalFileDataData( ZipExtraField[] data ) - { - int sum = 4 * data.length; - for( int i = 0; i < data.length; i++ ) - { - sum += data[ i ].getLocalFileDataLength().getValue(); - } - byte[] result = new byte[ sum ]; - int start = 0; - for( int i = 0; i < data.length; i++ ) - { - System.arraycopy( data[ i ].getHeaderId().getBytes(), - 0, result, start, 2 ); - System.arraycopy( data[ i ].getLocalFileDataLength().getBytes(), - 0, result, start + 2, 2 ); - byte[] local = data[ i ].getLocalFileDataData(); - System.arraycopy( local, 0, result, start + 4, local.length ); - start += ( local.length + 4 ); - } - return result; - } - - /** - * Split the array into ExtraFields and populate them with the give data. - * - * @param data Description of Parameter - * @return Description of the Returned Value - * @exception ZipException Description of Exception - * @since 1.1 - */ - public static ZipExtraField[] parse( byte[] data ) - throws ZipException - { - ArrayList v = new ArrayList(); - int start = 0; - while( start <= data.length - 4 ) - { - ZipShort headerId = new ZipShort( data, start ); - int length = ( new ZipShort( data, start + 2 ) ).getValue(); - if( start + 4 + length > data.length ) - { - throw new ZipException( "data starting at " + start + " is in unknown format" ); - } - try - { - ZipExtraField ze = createExtraField( headerId ); - ze.parseFromLocalFileData( data, start + 4, length ); - v.add( ze ); - } - catch( InstantiationException ie ) - { - throw new ZipException( ie.getMessage() ); - } - catch( IllegalAccessException iae ) - { - throw new ZipException( iae.getMessage() ); - } - start += ( length + 4 ); - } - if( start != data.length ) - {// array not exhausted - throw new ZipException( "data starting at " + start + " is in unknown format" ); - } - - final ZipExtraField[] result = new ZipExtraField[ v.size() ]; - return (ZipExtraField[])v.toArray( result ); - } - - /** - * Register a ZipExtraField implementation.- * - * The given class must have a no-arg constructor and implement the {@link - * ZipExtraField ZipExtraField interface}.
- * - * @param c Description of Parameter - * @since 1.1 - */ - public static void register( Class c ) - { - try - { - ZipExtraField ze = (ZipExtraField)c.newInstance(); - implementations.put( ze.getHeaderId(), c ); - } - catch( ClassCastException cc ) - { - throw new RuntimeException( c + - " doesn\'t implement ZipExtraField" ); - } - catch( InstantiationException ie ) - { - throw new RuntimeException( c + " is not a concrete class" ); - } - catch( IllegalAccessException ie ) - { - throw new RuntimeException( c + - "\'s no-arg constructor is not public" ); - } - } -} diff --git a/proposal/myrmidon/src/main/org/apache/tools/zip/UnrecognizedExtraField.java b/proposal/myrmidon/src/main/org/apache/tools/zip/UnrecognizedExtraField.java deleted file mode 100644 index 4bdf29d20..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/zip/UnrecognizedExtraField.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.zip; - -/** - * Simple placeholder for all those extra fields we don't want to deal with.- * - * Assumes local file data and central directory entries are identical - unless - * told the opposite.
- * - * @author Stefan Bodewig - * @version $Revision$ - */ -public class UnrecognizedExtraField - implements ZipExtraField -{ - /** - * Extra field data in central directory - without Header-ID or length - * specifier. - * - * @since 1.1 - */ - private byte[] centralData; - - /** - * The Header-ID. - * - * @since 1.1 - */ - private ZipShort headerId; - - /** - * Extra field data in local file data - without Header-ID or length - * specifier. - * - * @since 1.1 - */ - private byte[] localData; - - public void setCentralDirectoryData( byte[] data ) - { - centralData = data; - } - - public void setHeaderId( ZipShort headerId ) - { - this.headerId = headerId; - } - - public void setLocalFileDataData( byte[] data ) - { - localData = data; - } - - public byte[] getCentralDirectoryData() - { - if( centralData != null ) - { - return centralData; - } - return getLocalFileDataData(); - } - - public ZipShort getCentralDirectoryLength() - { - if( centralData != null ) - { - return new ZipShort( centralData.length ); - } - return getLocalFileDataLength(); - } - - public ZipShort getHeaderId() - { - return headerId; - } - - public byte[] getLocalFileDataData() - { - return localData; - } - - public ZipShort getLocalFileDataLength() - { - return new ZipShort( localData.length ); - } - - public void parseFromLocalFileData( byte[] data, int offset, int length ) - { - byte[] tmp = new byte[ length ]; - System.arraycopy( data, offset, tmp, 0, length ); - setLocalFileDataData( tmp ); - } -} diff --git a/proposal/myrmidon/src/main/org/apache/tools/zip/ZipEntry.java b/proposal/myrmidon/src/main/org/apache/tools/zip/ZipEntry.java deleted file mode 100644 index ba4f5373f..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/zip/ZipEntry.java +++ /dev/null @@ -1,435 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.zip; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.zip.ZipException; - -/** - * Extension that adds better handling of extra fields and provides access to - * the internal and external file attributes. - * - * @author Stefan Bodewig - * @version $Revision$ - */ -public class ZipEntry - extends java.util.zip.ZipEntry -{ - /** - * Helper for JDK 1.1 - * - * @since 1.2 - */ - private static Method setCompressedSizeMethod = null; - /** - * Helper for JDK 1.1 - * - * @since 1.2 - */ - private static Object lockReflection = new Object(); - /** - * Helper for JDK 1.1 - * - * @since 1.2 - */ - private static boolean triedToGetMethod = false; - - private int internalAttributes = 0; - private long externalAttributes = 0; - private ArrayList extraFields = new ArrayList(); - - /** - * Helper for JDK 1.1 <-> 1.2 incompatibility. - * - * @since 1.2 - */ - private Long compressedSize = null; - - /** - * Creates a new zip entry with the specified name. - * - * @param name Description of Parameter - * @since 1.1 - */ - public ZipEntry( String name ) - { - super( name ); - } - - /** - * Creates a new zip entry with fields taken from the specified zip entry. - * - * @param entry Description of Parameter - * @exception ZipException Description of Exception - * @since 1.1 - */ - public ZipEntry( java.util.zip.ZipEntry entry ) - throws ZipException - { - /* - * REVISIT: call super(entry) instead of this stuff in Ant2, - * "copy constructor" has not been available in JDK 1.1 - */ - super( entry.getName() ); - - setComment( entry.getComment() ); - setMethod( entry.getMethod() ); - setTime( entry.getTime() ); - - long size = entry.getSize(); - if( size > 0 ) - { - setSize( size ); - } - long cSize = entry.getCompressedSize(); - if( cSize > 0 ) - { - setComprSize( cSize ); - } - long crc = entry.getCrc(); - if( crc > 0 ) - { - setCrc( crc ); - } - - byte[] extra = entry.getExtra(); - if( extra != null ) - { - setExtraFields( ExtraFieldUtils.parse( extra ) ); - } - else - { - // initializes extra data to an empty byte array - setExtra(); - } - } - - /** - * Creates a new zip entry with fields taken from the specified zip entry. - * - * @param entry Description of Parameter - * @exception ZipException Description of Exception - * @since 1.1 - */ - public ZipEntry( ZipEntry entry ) - throws ZipException - { - this( (java.util.zip.ZipEntry)entry ); - setInternalAttributes( entry.getInternalAttributes() ); - setExternalAttributes( entry.getExternalAttributes() ); - setExtraFields( entry.getExtraFields() ); - } - - /** - * Try to get a handle to the setCompressedSize method. - * - * @since 1.2 - */ - private static void checkSCS() - { - if( !triedToGetMethod ) - { - synchronized( lockReflection ) - { - triedToGetMethod = true; - try - { - setCompressedSizeMethod = - java.util.zip.ZipEntry.class.getMethod( "setCompressedSize", - new Class[]{Long.TYPE} ); - } - catch( NoSuchMethodException nse ) - { - } - } - } - } - - /** - * Are we running JDK 1.2 or higher? - * - * @return Description of the Returned Value - * @since 1.2 - */ - private static boolean haveSetCompressedSize() - { - checkSCS(); - return setCompressedSizeMethod != null; - } - - /** - * Invoke setCompressedSize via reflection. - * - * @param ze Description of Parameter - * @param size Description of Parameter - * @since 1.2 - */ - private static void performSetCompressedSize( ZipEntry ze, long size ) - { - Long[] s = {new Long( size )}; - try - { - setCompressedSizeMethod.invoke( ze, s ); - } - catch( InvocationTargetException ite ) - { - Throwable nested = ite.getTargetException(); - throw new RuntimeException( "Exception setting the compressed size " - + "of " + ze + ": " - + nested.getMessage() ); - } - catch( Throwable other ) - { - throw new RuntimeException( "Exception setting the compressed size " - + "of " + ze + ": " - + other.getMessage() ); - } - } - - /** - * Make this class work in JDK 1.1 like a 1.2 class.- * - * This either stores the size for later usage or invokes setCompressedSize - * via reflection.
- * - * @param size The new ComprSize value - * @since 1.2 - */ - public void setComprSize( long size ) - { - if( haveSetCompressedSize() ) - { - performSetCompressedSize( this, size ); - } - else - { - compressedSize = new Long( size ); - } - } - - /** - * Sets the external file attributes. - * - * @param value The new ExternalAttributes value - * @since 1.1 - */ - public void setExternalAttributes( long value ) - { - externalAttributes = value; - } - - /** - * Throws an Exception if extra data cannot be parsed into extra fields. - * - * @param extra The new Extra value - * @exception RuntimeException Description of Exception - * @since 1.1 - */ - public void setExtra( byte[] extra ) - throws RuntimeException - { - try - { - setExtraFields( ExtraFieldUtils.parse( extra ) ); - } - catch( Exception e ) - { - throw new RuntimeException( e.getMessage() ); - } - } - - /** - * Replaces all currently attached extra fields with the new array. - * - * @param fields The new ExtraFields value - * @since 1.1 - */ - public void setExtraFields( ZipExtraField[] fields ) - { - extraFields.clear(); - for( int i = 0; i < fields.length; i++ ) - { - extraFields.add( fields[ i ] ); - } - setExtra(); - } - - /** - * Sets the internal file attributes. - * - * @param value The new InternalAttributes value - * @since 1.1 - */ - public void setInternalAttributes( int value ) - { - internalAttributes = value; - } - - /** - * Retrieves the extra data for the central directory. - * - * @return The CentralDirectoryExtra value - * @since 1.1 - */ - public byte[] getCentralDirectoryExtra() - { - return ExtraFieldUtils.mergeCentralDirectoryData( getExtraFields() ); - } - - /** - * Override to make this class work in JDK 1.1 like a 1.2 class. - * - * @return The CompressedSize value - * @since 1.2 - */ - public long getCompressedSize() - { - if( compressedSize != null ) - { - // has been set explicitly and we are running in a 1.1 VM - return compressedSize.longValue(); - } - return super.getCompressedSize(); - } - - /** - * Retrieves the external file attributes. - * - * @return The ExternalAttributes value - * @since 1.1 - */ - public long getExternalAttributes() - { - return externalAttributes; - } - - /** - * Retrieves extra fields. - * - * @return The ExtraFields value - * @since 1.1 - */ - public ZipExtraField[] getExtraFields() - { - final ZipExtraField[] result = new ZipExtraField[ extraFields.size() ]; - return (ZipExtraField[])extraFields.toArray( result ); - } - - /** - * Retrieves the internal file attributes. - * - * @return The InternalAttributes value - * @since 1.1 - */ - public int getInternalAttributes() - { - return internalAttributes; - } - - /** - * Retrieves the extra data for the local file data. - * - * @return The LocalFileDataExtra value - * @since 1.1 - */ - public byte[] getLocalFileDataExtra() - { - byte[] extra = getExtra(); - return extra != null ? extra : new byte[ 0 ]; - } - - /** - * Adds an extra fields - replacing an already present extra field of the - * same type. - * - * @param ze The feature to be added to the ExtraField attribute - * @since 1.1 - */ - public void addExtraField( ZipExtraField ze ) - { - ZipShort type = ze.getHeaderId(); - boolean done = false; - for( int i = 0; !done && i < extraFields.size(); i++ ) - { - if( ( (ZipExtraField)extraFields.get( i ) ).getHeaderId().equals( type ) ) - { - extraFields.set( i, ze ); - done = true; - } - } - if( !done ) - { - extraFields.add( ze ); - } - setExtra(); - } - - /** - * Overwrite clone - * - * @return Description of the Returned Value - * @since 1.1 - */ - public Object clone() - { - ZipEntry e = null; - try - { - e = new ZipEntry( (java.util.zip.ZipEntry)super.clone() ); - } - catch( Exception ex ) - { - // impossible as extra data is in correct format - ex.printStackTrace(); - } - e.setInternalAttributes( getInternalAttributes() ); - e.setExternalAttributes( getExternalAttributes() ); - e.setExtraFields( getExtraFields() ); - return e; - } - - /** - * Remove an extra fields. - * - * @param type Description of Parameter - * @since 1.1 - */ - public void removeExtraField( ZipShort type ) - { - boolean done = false; - for( int i = 0; !done && i < extraFields.size(); i++ ) - { - if( ( (ZipExtraField)extraFields.get( i ) ).getHeaderId().equals( type ) ) - { - extraFields.remove( i ); - done = true; - } - } - if( !done ) - { - throw new java.util.NoSuchElementException(); - } - setExtra(); - } - - /** - * Unfortunately {@link java.util.zip.ZipOutputStream - * java.util.zip.ZipOutputStream} seems to access the extra data directly, - * so overriding getExtra doesn't help - we need to modify super's data - * directly. - * - * @since 1.1 - */ - protected void setExtra() - { - super.setExtra( ExtraFieldUtils.mergeLocalFileDataData( getExtraFields() ) ); - } - -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Ear.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Ear.java index 805853e92..1381a6163 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Ear.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Ear.java @@ -11,7 +11,7 @@ import java.io.File; import java.io.IOException; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.types.ZipFileSet; -import org.apache.tools.zip.ZipOutputStream; +import org.apache.aut.zip.ZipOutputStream; /** * Creates a EAR archive. Based on WAR task diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Tar.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Tar.java index 7619da363..875cf090b 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Tar.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Tar.java @@ -19,9 +19,9 @@ import org.apache.tools.ant.types.EnumeratedAttribute; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.util.mappers.MergingMapper; import org.apache.tools.ant.types.SourceFileScanner; -import org.apache.tools.tar.TarConstants; -import org.apache.tools.tar.TarEntry; -import org.apache.tools.tar.TarOutputStream; +import org.apache.aut.tar.TarConstants; +import org.apache.aut.tar.TarEntry; +import org.apache.aut.tar.TarOutputStream; /** * Creates a TAR archive. diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Untar.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Untar.java index ddaf2346e..5bbe268a2 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Untar.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Untar.java @@ -11,8 +11,8 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.myrmidon.api.TaskException; -import org.apache.tools.tar.TarEntry; -import org.apache.tools.tar.TarInputStream; +import org.apache.aut.tar.TarEntry; +import org.apache.aut.tar.TarInputStream; /** * Untar a file. Heavily based on the Expand task. diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/War.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/War.java index ea9f8cae1..b73ce6ffd 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/War.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/War.java @@ -11,7 +11,7 @@ import java.io.File; import java.io.IOException; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.types.ZipFileSet; -import org.apache.tools.zip.ZipOutputStream; +import org.apache.aut.zip.ZipOutputStream; /** * Creates a WAR archive. diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Zip.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Zip.java index 89ea3e877..dfd17de51 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Zip.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/Zip.java @@ -28,8 +28,8 @@ import org.apache.tools.ant.types.SourceFileScanner; import org.apache.tools.ant.types.ZipFileSet; import org.apache.tools.ant.types.ZipScanner; import org.apache.tools.ant.util.mappers.MergingMapper; -import org.apache.tools.zip.ZipEntry; -import org.apache.tools.zip.ZipOutputStream; +import org.apache.aut.zip.ZipEntry; +import org.apache.aut.zip.ZipOutputStream; /** * Create a ZIP archive. diff --git a/proposal/myrmidon/src/todo/org/apache/tools/bzip2/BZip2Constants.java b/proposal/myrmidon/src/todo/org/apache/tools/bzip2/BZip2Constants.java deleted file mode 100644 index c98de15e0..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/bzip2/BZip2Constants.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.bzip2; - -/** - * Base class for both the compress and decompress classes. Holds common arrays, - * and static data. - * - * @author Keiron Liddle - */ -interface BZip2Constants -{ - int BASE_BLOCK_SIZE = 100000; - int MAX_ALPHA_SIZE = 258; - int MAX_CODE_LEN = 23; - int RUNA = 0; - int RUNB = 1; - int N_GROUPS = 6; - int G_SIZE = 50; - int N_ITERS = 4; - int MAX_SELECTORS = ( 2 + ( 900000 / G_SIZE ) ); - int NUM_OVERSHOOT_BYTES = 20; - - int RAND_NUMS[] = new int[] - { - 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, - 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, - 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, - 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, - 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, - 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, - 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, - 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, - 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, - 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, - 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, - 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, - 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, - 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, - 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, - 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, - 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, - 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, - 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, - 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, - 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, - 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, - 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, - 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, - 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, - 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, - 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, - 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, - 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, - 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, - 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, - 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, - 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, - 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, - 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, - 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, - 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, - 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, - 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, - 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, - 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, - 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, - 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, - 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, - 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, - 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, - 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, - 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, - 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, - 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, - 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, - 936, 638 - }; -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/bzip2/CBZip2InputStream.java b/proposal/myrmidon/src/todo/org/apache/tools/bzip2/CBZip2InputStream.java deleted file mode 100644 index 616c5130c..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/bzip2/CBZip2InputStream.java +++ /dev/null @@ -1,951 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.bzip2; - -import java.io.IOException; -import java.io.InputStream; - -/** - * An input stream that decompresses from the BZip2 format (without the file - * header chars) to be read as any other stream. - * - * @author Keiron Liddle - */ -public class CBZip2InputStream - extends InputStream - implements BZip2Constants -{ - private final static int START_BLOCK_STATE = 1; - private final static int RAND_PART_A_STATE = 2; - private final static int RAND_PART_B_STATE = 3; - private final static int RAND_PART_C_STATE = 4; - private final static int NO_RAND_PART_A_STATE = 5; - private final static int NO_RAND_PART_B_STATE = 6; - private final static int NO_RAND_PART_C_STATE = 7; - - private CRC m_crc = new CRC(); - private boolean m_inUse[] = new boolean[ 256 ]; - private char m_seqToUnseq[] = new char[ 256 ]; - private char m_unseqToSeq[] = new char[ 256 ]; - private char m_selector[] = new char[ MAX_SELECTORS ]; - private char m_selectorMtf[] = new char[ MAX_SELECTORS ]; - - /* - * freq table collected to save a pass over the data - * during decompression. - */ - private int m_unzftab[] = new int[ 256 ]; - - private int m_limit[][] = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ]; - private int m_base[][] = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ]; - private int m_perm[][] = new int[ N_GROUPS ][ MAX_ALPHA_SIZE ]; - private int m_minLens[] = new int[ N_GROUPS ]; - - private boolean m_streamEnd; - private int m_currentChar = -1; - - private int m_currentState = START_BLOCK_STATE; - private int m_rNToGo; - private int m_rTPos; - private int m_tPos; - - private int i2; - private int count; - private int chPrev; - private int ch2; - private int j2; - private char z; - - private boolean m_blockRandomised; - - /* - * always: in the range 0 .. 9. - * The current block size is 100000 * this number. - */ - private int m_blockSize100k; - private int m_bsBuff; - private int m_bsLive; - - private InputStream m_input; - - private int m_bytesIn; - private int m_bytesOut; - private int m_computedBlockCRC; - private int m_computedCombinedCRC; - - /* - * index of the last char in the block, so - * the block size == last + 1. - */ - private int m_last; - private char[] m_ll8; - private int m_nInUse; - - /* - * index in zptr[] of original string after sorting. - */ - private int m_origPtr; - - private int m_storedBlockCRC; - private int m_storedCombinedCRC; - private int[] m_tt; - - public CBZip2InputStream( final InputStream zStream ) - { - bsSetStream( zStream ); - initialize(); - initBlock(); - setupBlock(); - } - - private static void badBlockHeader() - { - cadvise(); - } - - private static void blockOverrun() - { - cadvise(); - } - - private static void cadvise() - { - System.out.println( "CRC Error" ); - //throw new CCoruptionError(); - } - - private static void compressedStreamEOF() - { - cadvise(); - } - - private static void crcError() - { - cadvise(); - } - - public int read() - { - if( m_streamEnd ) - { - return -1; - } - else - { - int retChar = m_currentChar; - switch( m_currentState ) - { - case START_BLOCK_STATE: - break; - case RAND_PART_A_STATE: - break; - case RAND_PART_B_STATE: - setupRandPartB(); - break; - case RAND_PART_C_STATE: - setupRandPartC(); - break; - case NO_RAND_PART_A_STATE: - break; - case NO_RAND_PART_B_STATE: - setupNoRandPartB(); - break; - case NO_RAND_PART_C_STATE: - setupNoRandPartC(); - break; - default: - break; - } - return retChar; - } - } - - private void setDecompressStructureSizes( int newSize100k ) - { - if( !( 0 <= newSize100k && newSize100k <= 9 && 0 <= m_blockSize100k - && m_blockSize100k <= 9 ) ) - { - // throw new IOException("Invalid block size"); - } - - m_blockSize100k = newSize100k; - - if( newSize100k == 0 ) - return; - - int n = BASE_BLOCK_SIZE * newSize100k; - m_ll8 = new char[ n ]; - m_tt = new int[ n ]; - } - - private void setupBlock() - { - int cftab[] = new int[ 257 ]; - char ch; - - cftab[ 0 ] = 0; - for( int i = 1; i <= 256; i++ ) - { - cftab[ i ] = m_unzftab[ i - 1 ]; - } - for( int i = 1; i <= 256; i++ ) - { - cftab[ i ] += cftab[ i - 1 ]; - } - - for( int i = 0; i <= m_last; i++ ) - { - ch = (char)m_ll8[ i ]; - m_tt[ cftab[ ch ] ] = i; - cftab[ ch ]++; - } - cftab = null; - - m_tPos = m_tt[ m_origPtr ]; - - count = 0; - i2 = 0; - ch2 = 256; - /* - * not a char and not EOF - */ - if( m_blockRandomised ) - { - m_rNToGo = 0; - m_rTPos = 0; - setupRandPartA(); - } - else - { - setupNoRandPartA(); - } - } - - private void setupNoRandPartA() - { - if( i2 <= m_last ) - { - chPrev = ch2; - ch2 = m_ll8[ m_tPos ]; - m_tPos = m_tt[ m_tPos ]; - i2++; - - m_currentChar = ch2; - m_currentState = NO_RAND_PART_B_STATE; - m_crc.updateCRC( ch2 ); - } - else - { - endBlock(); - initBlock(); - setupBlock(); - } - } - - private void setupNoRandPartB() - { - if( ch2 != chPrev ) - { - m_currentState = NO_RAND_PART_A_STATE; - count = 1; - setupNoRandPartA(); - } - else - { - count++; - if( count >= 4 ) - { - z = m_ll8[ m_tPos ]; - m_tPos = m_tt[ m_tPos ]; - m_currentState = NO_RAND_PART_C_STATE; - j2 = 0; - setupNoRandPartC(); - } - else - { - m_currentState = NO_RAND_PART_A_STATE; - setupNoRandPartA(); - } - } - } - - private void setupNoRandPartC() - { - if( j2 < (int)z ) - { - m_currentChar = ch2; - m_crc.updateCRC( ch2 ); - j2++; - } - else - { - m_currentState = NO_RAND_PART_A_STATE; - i2++; - count = 0; - setupNoRandPartA(); - } - } - - private void setupRandPartA() - { - if( i2 <= m_last ) - { - chPrev = ch2; - ch2 = m_ll8[ m_tPos ]; - m_tPos = m_tt[ m_tPos ]; - if( m_rNToGo == 0 ) - { - m_rNToGo = RAND_NUMS[ m_rTPos ]; - m_rTPos++; - if( m_rTPos == 512 ) - m_rTPos = 0; - } - m_rNToGo--; - ch2 ^= (int)( ( m_rNToGo == 1 ) ? 1 : 0 ); - i2++; - - m_currentChar = ch2; - m_currentState = RAND_PART_B_STATE; - m_crc.updateCRC( ch2 ); - } - else - { - endBlock(); - initBlock(); - setupBlock(); - } - } - - private void setupRandPartB() - { - if( ch2 != chPrev ) - { - m_currentState = RAND_PART_A_STATE; - count = 1; - setupRandPartA(); - } - else - { - count++; - if( count >= 4 ) - { - z = m_ll8[ m_tPos ]; - m_tPos = m_tt[ m_tPos ]; - if( m_rNToGo == 0 ) - { - m_rNToGo = RAND_NUMS[ m_rTPos ]; - m_rTPos++; - if( m_rTPos == 512 ) - m_rTPos = 0; - } - m_rNToGo--; - z ^= ( ( m_rNToGo == 1 ) ? 1 : 0 ); - j2 = 0; - m_currentState = RAND_PART_C_STATE; - setupRandPartC(); - } - else - { - m_currentState = RAND_PART_A_STATE; - setupRandPartA(); - } - } - } - - private void setupRandPartC() - { - if( j2 < (int)z ) - { - m_currentChar = ch2; - m_crc.updateCRC( ch2 ); - j2++; - } - else - { - m_currentState = RAND_PART_A_STATE; - i2++; - count = 0; - setupRandPartA(); - } - } - - private void getAndMoveToFrontDecode() - { - int nextSym; - - int limitLast = BASE_BLOCK_SIZE * m_blockSize100k; - m_origPtr = readVariableSizedInt( 24 ); - - recvDecodingTables(); - int EOB = m_nInUse + 1; - int groupNo = -1; - int groupPos = 0; - - /* - * Setting up the unzftab entries here is not strictly - * necessary, but it does save having to do it later - * in a separate pass, and so saves a block's worth of - * cache misses. - */ - for( int i = 0; i <= 255; i++ ) - { - m_unzftab[ i ] = 0; - } - - final char yy[] = new char[ 256 ]; - for( int i = 0; i <= 255; i++ ) - { - yy[ i ] = (char)i; - } - - m_last = -1; - int zt; - int zn; - int zvec; - int zj; - if( groupPos == 0 ) - { - groupNo++; - groupPos = G_SIZE; - } - groupPos--; - - zt = m_selector[ groupNo ]; - zn = m_minLens[ zt ]; - zvec = bsR( zn ); - while( zvec > m_limit[ zt ][ zn ] ) - { - zn++; - - while( m_bsLive < 1 ) - { - int zzi; - char thech = 0; - try - { - thech = (char)m_input.read(); - } - catch( IOException e ) - { - compressedStreamEOF(); - } - if( thech == -1 ) - { - compressedStreamEOF(); - } - zzi = thech; - m_bsBuff = ( m_bsBuff << 8 ) | ( zzi & 0xff ); - m_bsLive += 8; - } - - zj = ( m_bsBuff >> ( m_bsLive - 1 ) ) & 1; - m_bsLive--; - - zvec = ( zvec << 1 ) | zj; - } - nextSym = m_perm[ zt ][ zvec - m_base[ zt ][ zn ] ]; - - while( true ) - { - if( nextSym == EOB ) - { - break; - } - - if( nextSym == RUNA || nextSym == RUNB ) - { - char ch; - int s = -1; - int N = 1; - do - { - if( nextSym == RUNA ) - s = s + ( 0 + 1 ) * N; - else if( nextSym == RUNB ) - s = s + ( 1 + 1 ) * N; - N = N * 2; - - if( groupPos == 0 ) - { - groupNo++; - groupPos = G_SIZE; - } - groupPos--; - zt = m_selector[ groupNo ]; - zn = m_minLens[ zt ]; - zvec = bsR( zn ); - while( zvec > m_limit[ zt ][ zn ] ) - { - zn++; - - while( m_bsLive < 1 ) - { - int zzi; - char thech = 0; - try - { - thech = (char)m_input.read(); - } - catch( IOException e ) - { - compressedStreamEOF(); - } - if( thech == -1 ) - { - compressedStreamEOF(); - } - zzi = thech; - m_bsBuff = ( m_bsBuff << 8 ) | ( zzi & 0xff ); - m_bsLive += 8; - } - - zj = ( m_bsBuff >> ( m_bsLive - 1 ) ) & 1; - m_bsLive--; - zvec = ( zvec << 1 ) | zj; - } - - nextSym = m_perm[ zt ][ zvec - m_base[ zt ][ zn ] ]; - - } while( nextSym == RUNA || nextSym == RUNB ); - - s++; - ch = m_seqToUnseq[ yy[ 0 ] ]; - m_unzftab[ ch ] += s; - - while( s > 0 ) - { - m_last++; - m_ll8[ m_last ] = ch; - s--; - } - - if( m_last >= limitLast ) - { - blockOverrun(); - } - continue; - } - else - { - char tmp; - m_last++; - if( m_last >= limitLast ) - { - blockOverrun(); - } - - tmp = yy[ nextSym - 1 ]; - m_unzftab[ m_seqToUnseq[ tmp ] ]++; - m_ll8[ m_last ] = m_seqToUnseq[ tmp ]; - - /* - * This loop is hammered during decompression, - * hence the unrolling. - * for (j = nextSym-1; j > 0; j--) yy[j] = yy[j-1]; - */ - int j = nextSym - 1; - for( ; j > 3; j -= 4 ) - { - yy[ j ] = yy[ j - 1 ]; - yy[ j - 1 ] = yy[ j - 2 ]; - yy[ j - 2 ] = yy[ j - 3 ]; - yy[ j - 3 ] = yy[ j - 4 ]; - } - for( ; j > 0; j-- ) - { - yy[ j ] = yy[ j - 1 ]; - } - - yy[ 0 ] = tmp; - - if( groupPos == 0 ) - { - groupNo++; - groupPos = G_SIZE; - } - groupPos--; - zt = m_selector[ groupNo ]; - zn = m_minLens[ zt ]; - zvec = bsR( zn ); - while( zvec > m_limit[ zt ][ zn ] ) - { - zn++; - - while( m_bsLive < 1 ) - { - char ch = 0; - try - { - ch = (char)m_input.read(); - } - catch( IOException e ) - { - compressedStreamEOF(); - } - - m_bsBuff = ( m_bsBuff << 8 ) | ( ch & 0xff ); - m_bsLive += 8; - } - - zj = ( m_bsBuff >> ( m_bsLive - 1 ) ) & 1; - m_bsLive--; - - zvec = ( zvec << 1 ) | zj; - } - nextSym = m_perm[ zt ][ zvec - m_base[ zt ][ zn ] ]; - - continue; - } - } - } - - private void bsFinishedWithStream() - { - m_input = null; - } - - private int readVariableSizedInt( final int numBits ) - { - return (int)bsR( numBits ); - } - - private char readUnsignedChar() - { - return (char)bsR( 8 ); - } - - private int readInt() - { - int u = 0; - u = ( u << 8 ) | bsR( 8 ); - u = ( u << 8 ) | bsR( 8 ); - u = ( u << 8 ) | bsR( 8 ); - u = ( u << 8 ) | bsR( 8 ); - return u; - } - - private int bsR( final int n ) - { - while( m_bsLive < n ) - { - char ch = 0; - try - { - ch = (char)m_input.read(); - } - catch( final IOException ioe ) - { - compressedStreamEOF(); - } - - if( ch == -1 ) - { - compressedStreamEOF(); - } - - m_bsBuff = ( m_bsBuff << 8 ) | ( ch & 0xff ); - m_bsLive += 8; - } - - final int result = ( m_bsBuff >> ( m_bsLive - n ) ) & ( ( 1 << n ) - 1 ); - m_bsLive -= n; - return result; - } - - private void bsSetStream( final InputStream input ) - { - m_input = input; - m_bsLive = 0; - m_bsBuff = 0; - m_bytesOut = 0; - m_bytesIn = 0; - } - - private void complete() - { - m_storedCombinedCRC = readInt(); - if( m_storedCombinedCRC != m_computedCombinedCRC ) - { - crcError(); - } - - bsFinishedWithStream(); - m_streamEnd = true; - } - - private void endBlock() - { - m_computedBlockCRC = m_crc.getFinalCRC(); - /* - * A bad CRC is considered a fatal error. - */ - if( m_storedBlockCRC != m_computedBlockCRC ) - { - crcError(); - } - - m_computedCombinedCRC = ( m_computedCombinedCRC << 1 ) - | ( m_computedCombinedCRC >>> 31 ); - m_computedCombinedCRC ^= m_computedBlockCRC; - } - - private void hbCreateDecodeTables( final int[] limit, - final int[] base, - final int[] perm, - final char[] length, - final int minLen, - final int maxLen, - final int alphaSize ) - { - int pp = 0; - for( int i = minLen; i <= maxLen; i++ ) - { - for( int j = 0; j < alphaSize; j++ ) - { - if( length[ j ] == i ) - { - perm[ pp ] = j; - pp++; - } - } - } - - for( int i = 0; i < MAX_CODE_LEN; i++ ) - { - base[ i ] = 0; - } - - for( int i = 0; i < alphaSize; i++ ) - { - base[ length[ i ] + 1 ]++; - } - - for( int i = 1; i < MAX_CODE_LEN; i++ ) - { - base[ i ] += base[ i - 1 ]; - } - - for( int i = 0; i < MAX_CODE_LEN; i++ ) - { - limit[ i ] = 0; - } - - int vec = 0; - for( int i = minLen; i <= maxLen; i++ ) - { - vec += ( base[ i + 1 ] - base[ i ] ); - limit[ i ] = vec - 1; - vec <<= 1; - } - - for( int i = minLen + 1; i <= maxLen; i++ ) - { - base[ i ] = ( ( limit[ i - 1 ] + 1 ) << 1 ) - base[ i ]; - } - } - - private void initBlock() - { - final char magic1 = readUnsignedChar(); - final char magic2 = readUnsignedChar(); - final char magic3 = readUnsignedChar(); - final char magic4 = readUnsignedChar(); - final char magic5 = readUnsignedChar(); - final char magic6 = readUnsignedChar(); - if( magic1 == 0x17 && magic2 == 0x72 && magic3 == 0x45 && - magic4 == 0x38 && magic5 == 0x50 && magic6 == 0x90 ) - { - complete(); - return; - } - - if( magic1 != 0x31 || magic2 != 0x41 || magic3 != 0x59 || - magic4 != 0x26 || magic5 != 0x53 || magic6 != 0x59 ) - { - badBlockHeader(); - m_streamEnd = true; - return; - } - - m_storedBlockCRC = readInt(); - - if( bsR( 1 ) == 1 ) - { - m_blockRandomised = true; - } - else - { - m_blockRandomised = false; - } - - // currBlockNo++; - getAndMoveToFrontDecode(); - - m_crc.initialiseCRC(); - m_currentState = START_BLOCK_STATE; - } - - private void initialize() - { - final char magic3 = readUnsignedChar(); - final char magic4 = readUnsignedChar(); - if( magic3 != 'h' || magic4 < '1' || magic4 > '9' ) - { - bsFinishedWithStream(); - m_streamEnd = true; - return; - } - - setDecompressStructureSizes( magic4 - '0' ); - m_computedCombinedCRC = 0; - } - - private void makeMaps() - { - m_nInUse = 0; - for( int i = 0; i < 256; i++ ) - { - if( m_inUse[ i ] ) - { - m_seqToUnseq[ m_nInUse ] = (char)i; - m_unseqToSeq[ i ] = (char)m_nInUse; - m_nInUse++; - } - } - } - - private void recvDecodingTables() - { - buildInUseTable(); - makeMaps(); - final int alphaSize = m_nInUse + 2; - - /* - * Now the selectors - */ - final int groupCount = bsR( 3 ); - final int selectorCount = bsR( 15 ); - for( int i = 0; i < selectorCount; i++ ) - { - int run = 0; - while( bsR( 1 ) == 1 ) - { - run++; - } - m_selectorMtf[ i ] = (char)run; - } - - /* - * Undo the MTF values for the selectors. - */ - final char pos[] = new char[ N_GROUPS ]; - for( char v = 0; v < groupCount; v++ ) - { - pos[ v ] = v; - } - - for( int i = 0; i < selectorCount; i++ ) - { - int v = m_selectorMtf[ i ]; - final char tmp = pos[ v ]; - while( v > 0 ) - { - pos[ v ] = pos[ v - 1 ]; - v--; - } - pos[ 0 ] = tmp; - m_selector[ i ] = tmp; - } - - final char len[][] = new char[ N_GROUPS ][ MAX_ALPHA_SIZE ]; - /* - * Now the coding tables - */ - for( int i = 0; i < groupCount; i++ ) - { - int curr = bsR( 5 ); - for( int j = 0; j < alphaSize; j++ ) - { - while( bsR( 1 ) == 1 ) - { - if( bsR( 1 ) == 0 ) - { - curr++; - } - else - { - curr--; - } - } - len[ i ][ j ] = (char)curr; - } - } - - /* - * Create the Huffman decoding tables - */ - for( int k = 0; k < groupCount; k++ ) - { - int minLen = 32; - int maxLen = 0; - for( int i = 0; i < alphaSize; i++ ) - { - if( len[ k ][ i ] > maxLen ) - { - maxLen = len[ k ][ i ]; - } - if( len[ k ][ i ] < minLen ) - { - minLen = len[ k ][ i ]; - } - } - hbCreateDecodeTables( m_limit[ k ], m_base[ k ], m_perm[ k ], len[ k ], minLen, - maxLen, alphaSize ); - m_minLens[ k ] = minLen; - } - } - - private void buildInUseTable() - { - final boolean inUse16[] = new boolean[ 16 ]; - - /* - * Receive the mapping table - */ - for( int i = 0; i < 16; i++ ) - { - if( bsR( 1 ) == 1 ) - { - inUse16[ i ] = true; - } - else - { - inUse16[ i ] = false; - } - } - - for( int i = 0; i < 256; i++ ) - { - m_inUse[ i ] = false; - } - - for( int i = 0; i < 16; i++ ) - { - if( inUse16[ i ] ) - { - for( int j = 0; j < 16; j++ ) - { - if( bsR( 1 ) == 1 ) - { - m_inUse[ i * 16 + j ] = true; - } - } - } - } - } -} \ No newline at end of file diff --git a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarBuffer.java b/proposal/myrmidon/src/todo/org/apache/tools/tar/TarBuffer.java deleted file mode 100644 index db2c0fa96..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarBuffer.java +++ /dev/null @@ -1,476 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.tar; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * The TarBuffer class implements the tar archive concept of a buffered input - * stream. This concept goes back to the days of blocked tape drives and special - * io devices. In the Java universe, the only real function that this class - * performs is to ensure that files have the correct "block" size, or other tars - * will complain.- * - * You should never have a need to access this class directly. TarBuffers are - * created by Tar IO Streams. - * - * @author Timothy Gerard Endres time@ice.com - */ - -public class TarBuffer -{ - - public final static int DEFAULT_RCDSIZE = ( 512 ); - public final static int DEFAULT_BLKSIZE = ( DEFAULT_RCDSIZE * 20 ); - private byte[] blockBuffer; - private int blockSize; - private int currBlkIdx; - private int currRecIdx; - private boolean debug; - - private InputStream inStream; - private OutputStream outStream; - private int recordSize; - private int recsPerBlock; - - public TarBuffer( InputStream inStream ) - { - this( inStream, TarBuffer.DEFAULT_BLKSIZE ); - } - - public TarBuffer( InputStream inStream, int blockSize ) - { - this( inStream, blockSize, TarBuffer.DEFAULT_RCDSIZE ); - } - - public TarBuffer( InputStream inStream, int blockSize, int recordSize ) - { - this.inStream = inStream; - this.outStream = null; - - this.initialize( blockSize, recordSize ); - } - - public TarBuffer( OutputStream outStream ) - { - this( outStream, TarBuffer.DEFAULT_BLKSIZE ); - } - - public TarBuffer( OutputStream outStream, int blockSize ) - { - this( outStream, blockSize, TarBuffer.DEFAULT_RCDSIZE ); - } - - public TarBuffer( OutputStream outStream, int blockSize, int recordSize ) - { - this.inStream = null; - this.outStream = outStream; - - this.initialize( blockSize, recordSize ); - } - - /** - * Set the debugging flag for the buffer. - * - * @param debug If true, print debugging output. - */ - public void setDebug( boolean debug ) - { - this.debug = debug; - } - - /** - * Get the TAR Buffer's block size. Blocks consist of multiple records. - * - * @return The BlockSize value - */ - public int getBlockSize() - { - return this.blockSize; - } - - /** - * Get the current block number, zero based. - * - * @return The current zero based block number. - */ - public int getCurrentBlockNum() - { - return this.currBlkIdx; - } - - /** - * Get the current record number, within the current block, zero based. - * Thus, current offset = (currentBlockNum * recsPerBlk) + currentRecNum. - * - * @return The current zero based record number. - */ - public int getCurrentRecordNum() - { - return this.currRecIdx - 1; - } - - /** - * Get the TAR Buffer's record size. - * - * @return The RecordSize value - */ - public int getRecordSize() - { - return this.recordSize; - } - - /** - * Determine if an archive record indicate End of Archive. End of archive is - * indicated by a record that consists entirely of null bytes. - * - * @param record The record data to check. - * @return The EOFRecord value - */ - public boolean isEOFRecord( byte[] record ) - { - for( int i = 0, sz = this.getRecordSize(); i < sz; ++i ) - { - if( record[ i ] != 0 ) - { - return false; - } - } - - return true; - } - - /** - * Close the TarBuffer. If this is an output buffer, also flush the current - * block before closing. - * - * @exception IOException Description of Exception - */ - public void close() - throws IOException - { - if( this.debug ) - { - System.err.println( "TarBuffer.closeBuffer()." ); - } - - if( this.outStream != null ) - { - this.flushBlock(); - - if( this.outStream != System.out - && this.outStream != System.err ) - { - this.outStream.close(); - - this.outStream = null; - } - } - else if( this.inStream != null ) - { - if( this.inStream != System.in ) - { - this.inStream.close(); - - this.inStream = null; - } - } - } - - /** - * Read a record from the input stream and return the data. - * - * @return The record data. - * @exception IOException Description of Exception - */ - public byte[] readRecord() - throws IOException - { - if( this.debug ) - { - System.err.println( "ReadRecord: recIdx = " + this.currRecIdx - + " blkIdx = " + this.currBlkIdx ); - } - - if( this.inStream == null ) - { - throw new IOException( "reading from an output buffer" ); - } - - if( this.currRecIdx >= this.recsPerBlock ) - { - if( !this.readBlock() ) - { - return null; - } - } - - byte[] result = new byte[ this.recordSize ]; - - System.arraycopy( this.blockBuffer, - ( this.currRecIdx * this.recordSize ), result, 0, - this.recordSize ); - - this.currRecIdx++; - - return result; - } - - /** - * Skip over a record on the input stream. - * - * @exception IOException Description of Exception - */ - public void skipRecord() - throws IOException - { - if( this.debug ) - { - System.err.println( "SkipRecord: recIdx = " + this.currRecIdx - + " blkIdx = " + this.currBlkIdx ); - } - - if( this.inStream == null ) - { - throw new IOException( "reading (via skip) from an output buffer" ); - } - - if( this.currRecIdx >= this.recsPerBlock ) - { - if( !this.readBlock() ) - { - return;// UNDONE - } - } - - this.currRecIdx++; - } - - /** - * Write an archive record to the archive. - * - * @param record The record data to write to the archive. - * @exception IOException Description of Exception - */ - public void writeRecord( byte[] record ) - throws IOException - { - if( this.debug ) - { - System.err.println( "WriteRecord: recIdx = " + this.currRecIdx - + " blkIdx = " + this.currBlkIdx ); - } - - if( this.outStream == null ) - { - throw new IOException( "writing to an input buffer" ); - } - - if( record.length != this.recordSize ) - { - throw new IOException( "record to write has length '" - + record.length - + "' which is not the record size of '" - + this.recordSize + "'" ); - } - - if( this.currRecIdx >= this.recsPerBlock ) - { - this.writeBlock(); - } - - System.arraycopy( record, 0, this.blockBuffer, - ( this.currRecIdx * this.recordSize ), - this.recordSize ); - - this.currRecIdx++; - } - - /** - * Write an archive record to the archive, where the record may be inside of - * a larger array buffer. The buffer must be "offset plus record size" long. - * - * @param buf The buffer containing the record data to write. - * @param offset The offset of the record data within buf. - * @exception IOException Description of Exception - */ - public void writeRecord( byte[] buf, int offset ) - throws IOException - { - if( this.debug ) - { - System.err.println( "WriteRecord: recIdx = " + this.currRecIdx - + " blkIdx = " + this.currBlkIdx ); - } - - if( this.outStream == null ) - { - throw new IOException( "writing to an input buffer" ); - } - - if( ( offset + this.recordSize ) > buf.length ) - { - throw new IOException( "record has length '" + buf.length - + "' with offset '" + offset - + "' which is less than the record size of '" - + this.recordSize + "'" ); - } - - if( this.currRecIdx >= this.recsPerBlock ) - { - this.writeBlock(); - } - - System.arraycopy( buf, offset, this.blockBuffer, - ( this.currRecIdx * this.recordSize ), - this.recordSize ); - - this.currRecIdx++; - } - - /** - * Flush the current data block if it has any data in it. - * - * @exception IOException Description of Exception - */ - private void flushBlock() - throws IOException - { - if( this.debug ) - { - System.err.println( "TarBuffer.flushBlock() called." ); - } - - if( this.outStream == null ) - { - throw new IOException( "writing to an input buffer" ); - } - - if( this.currRecIdx > 0 ) - { - this.writeBlock(); - } - } - - /** - * Initialization common to all constructors. - * - * @param blockSize Description of Parameter - * @param recordSize Description of Parameter - */ - private void initialize( int blockSize, int recordSize ) - { - this.debug = false; - this.blockSize = blockSize; - this.recordSize = recordSize; - this.recsPerBlock = ( this.blockSize / this.recordSize ); - this.blockBuffer = new byte[ this.blockSize ]; - - if( this.inStream != null ) - { - this.currBlkIdx = -1; - this.currRecIdx = this.recsPerBlock; - } - else - { - this.currBlkIdx = 0; - this.currRecIdx = 0; - } - } - - /** - * @return false if End-Of-File, else true - * @exception IOException Description of Exception - */ - private boolean readBlock() - throws IOException - { - if( this.debug ) - { - System.err.println( "ReadBlock: blkIdx = " + this.currBlkIdx ); - } - - if( this.inStream == null ) - { - throw new IOException( "reading from an output buffer" ); - } - - this.currRecIdx = 0; - - int offset = 0; - int bytesNeeded = this.blockSize; - - while( bytesNeeded > 0 ) - { - long numBytes = this.inStream.read( this.blockBuffer, offset, - bytesNeeded ); - - // - // NOTE - // We have fit EOF, and the block is not full! - // - // This is a broken archive. It does not follow the standard - // blocking algorithm. However, because we are generous, and - // it requires little effort, we will simply ignore the error - // and continue as if the entire block were read. This does - // not appear to break anything upstream. We used to return - // false in this case. - // - // Thanks to 'Yohann.Roussel@alcatel.fr' for this fix. - // - if( numBytes == -1 ) - { - break; - } - - offset += numBytes; - bytesNeeded -= numBytes; - - if( numBytes != this.blockSize ) - { - if( this.debug ) - { - System.err.println( "ReadBlock: INCOMPLETE READ " - + numBytes + " of " + this.blockSize - + " bytes read." ); - } - } - } - - this.currBlkIdx++; - - return true; - } - - /** - * Write a TarBuffer block to the archive. - * - * @exception IOException Description of Exception - */ - private void writeBlock() - throws IOException - { - if( this.debug ) - { - System.err.println( "WriteBlock: blkIdx = " + this.currBlkIdx ); - } - - if( this.outStream == null ) - { - throw new IOException( "writing to an input buffer" ); - } - - this.outStream.write( this.blockBuffer, 0, this.blockSize ); - this.outStream.flush(); - - this.currRecIdx = 0; - this.currBlkIdx++; - } -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarConstants.java b/proposal/myrmidon/src/todo/org/apache/tools/tar/TarConstants.java deleted file mode 100644 index 70e09a5ce..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/tar/TarConstants.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.tar; - -/** - * This interface contains all the definitions used in the package. - * - * @author Timothy Gerard Endres time@ice.com - * @author Stefano Mazzocchi - * stefano@apache.org - */ - -public interface TarConstants -{ - - /** - * The length of the name field in a header buffer. - */ - int NAMELEN = 100; - - /** - * The length of the mode field in a header buffer. - */ - int MODELEN = 8; - - /** - * The length of the user id field in a header buffer. - */ - int UIDLEN = 8; - - /** - * The length of the group id field in a header buffer. - */ - int GIDLEN = 8; - - /** - * The length of the checksum field in a header buffer. - */ - int CHKSUMLEN = 8; - - /** - * The length of the size field in a header buffer. - */ - int SIZELEN = 12; - - /** - * The length of the magic field in a header buffer. - */ - int MAGICLEN = 8; - - /** - * The length of the modification time field in a header buffer. - */ - int MODTIMELEN = 12; - - /** - * The length of the user name field in a header buffer. - */ - int UNAMELEN = 32; - - /** - * The length of the group name field in a header buffer. - */ - int GNAMELEN = 32; - - /** - * The length of the devices field in a header buffer. - */ - int DEVLEN = 8; - - /** - * LF_ constants represent the "link flag" of an entry, or more commonly, - * the "entry type". This is the "old way" of indicating a normal file. - */ - byte LF_OLDNORM = 0; - - /** - * Normal file type. - */ - byte LF_NORMAL = (byte)'0'; - - /** - * Link file type. - */ - byte LF_LINK = (byte)'1'; - - /** - * Symbolic link file type. - */ - byte LF_SYMLINK = (byte)'2'; - - /** - * Character device file type. - */ - byte LF_CHR = (byte)'3'; - - /** - * Block device file type. - */ - byte LF_BLK = (byte)'4'; - - /** - * Directory file type. - */ - byte LF_DIR = (byte)'5'; - - /** - * FIFO (pipe) file type. - */ - byte LF_FIFO = (byte)'6'; - - /** - * Contiguous file type. - */ - byte LF_CONTIG = (byte)'7'; - - /** - * The magic tag representing a POSIX tar archive. - */ - String TMAGIC = "ustar"; - - /** - * The magic tag representing a GNU tar archive. - */ - String GNU_TMAGIC = "ustar "; - - /** - * The namr of the GNU tar entry which contains a long name. - */ - String GNU_LONGLINK = "././@LongLink"; - - /** - * Identifies the *next* file on the tape as having a long name. - */ - byte LF_GNUTYPE_LONGNAME = (byte)'L'; -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/zip/UnixStat.java b/proposal/myrmidon/src/todo/org/apache/tools/zip/UnixStat.java deleted file mode 100644 index adc1c790d..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/zip/UnixStat.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.zip; - -/** - * Constants from stat.h on Unix systems. - * - * @author Stefan Bodewig - * @version $Revision$ - */ -public interface UnixStat -{ - /** - * Bits used for permissions (and sticky bit) - * - * @since 1.1 - */ - int PERM_MASK = 07777; - /** - * Indicates symbolic links. - * - * @since 1.1 - */ - int LINK_FLAG = 0120000; - /** - * Indicates plain files. - * - * @since 1.1 - */ - int FILE_FLAG = 0100000; - /** - * Indicates directories. - * - * @since 1.1 - */ - int DIR_FLAG = 040000; - - // ---------------------------------------------------------- - // somewhat arbitrary choices that are quite common for shared - // installations - // ----------------------------------------------------------- - - /** - * Default permissions for symbolic links. - * - * @since 1.1 - */ - int DEFAULT_LINK_PERM = 0777; - /** - * Default permissions for directories. - * - * @since 1.1 - */ - int DEFAULT_DIR_PERM = 0755; - /** - * Default permissions for plain files. - * - * @since 1.1 - */ - int DEFAULT_FILE_PERM = 0644; -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipExtraField.java b/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipExtraField.java deleted file mode 100644 index a9dccde08..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipExtraField.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.zip; - -import java.util.zip.ZipException; - -/** - * General format of extra field data.
- * - * Extra fields usually appear twice per file, once in the local file data and - * once in the central directory. Usually they are the same, but they don't have - * to be. {@link java.util.zip.ZipOutputStream java.util.zip.ZipOutputStream} - * will only use the local file data in both places.
- * - * @author Stefan Bodewig - * @version $Revision$ - */ -public interface ZipExtraField -{ - - /** - * The Header-ID. - * - * @return The HeaderId value - * @since 1.1 - */ - ZipShort getHeaderId(); - - /** - * Length of the extra field in the local file data - without Header-ID or - * length specifier. - * - * @return The LocalFileDataLength value - * @since 1.1 - */ - ZipShort getLocalFileDataLength(); - - /** - * Length of the extra field in the central directory - without Header-ID or - * length specifier. - * - * @return The CentralDirectoryLength value - * @since 1.1 - */ - ZipShort getCentralDirectoryLength(); - - /** - * The actual data to put into local file data - without Header-ID or length - * specifier. - * - * @return The LocalFileDataData value - * @since 1.1 - */ - byte[] getLocalFileDataData(); - - /** - * The actual data to put central directory - without Header-ID or length - * specifier. - * - * @return The CentralDirectoryData value - * @since 1.1 - */ - byte[] getCentralDirectoryData(); - - /** - * Populate data from this array as if it was in local file data. - * - * @param data Description of Parameter - * @param offset Description of Parameter - * @param length Description of Parameter - * @exception ZipException Description of Exception - * @since 1.1 - */ - void parseFromLocalFileData( byte[] data, int offset, int length ) - throws ZipException; -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipLong.java b/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipLong.java deleted file mode 100644 index c7ce56869..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipLong.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.zip; - -/** - * Utility class that represents a four byte integer with conversion rules for - * the big endian byte order of ZIP files. - * - * @author Stefan Bodewig - * @version $Revision$ - */ -public class ZipLong implements Cloneable -{ - - private long value; - - /** - * Create instance from a number. - * - * @param value Description of Parameter - * @since 1.1 - */ - public ZipLong( long value ) - { - this.value = value; - } - - /** - * Create instance from bytes. - * - * @param bytes Description of Parameter - * @since 1.1 - */ - public ZipLong( byte[] bytes ) - { - this( bytes, 0 ); - } - - /** - * Create instance from the four bytes starting at offset. - * - * @param bytes Description of Parameter - * @param offset Description of Parameter - * @since 1.1 - */ - public ZipLong( byte[] bytes, int offset ) - { - value = ( bytes[ offset + 3 ] << 24 ) & 0xFF000000l; - value += ( bytes[ offset + 2 ] << 16 ) & 0xFF0000; - value += ( bytes[ offset + 1 ] << 8 ) & 0xFF00; - value += ( bytes[ offset ] & 0xFF ); - } - - /** - * Get value as two bytes in big endian byte order. - * - * @return The Bytes value - * @since 1.1 - */ - public byte[] getBytes() - { - byte[] result = new byte[ 4 ]; - result[ 0 ] = (byte)( ( value & 0xFF ) ); - result[ 1 ] = (byte)( ( value & 0xFF00 ) >> 8 ); - result[ 2 ] = (byte)( ( value & 0xFF0000 ) >> 16 ); - result[ 3 ] = (byte)( ( value & 0xFF000000l ) >> 24 ); - return result; - } - - /** - * Get value as Java int. - * - * @return The Value value - * @since 1.1 - */ - public long getValue() - { - return value; - } - - /** - * Override to make two instances with same value equal. - * - * @param o Description of Parameter - * @return Description of the Returned Value - * @since 1.1 - */ - public boolean equals( Object o ) - { - if( o == null || !( o instanceof ZipLong ) ) - { - return false; - } - return value == ( (ZipLong)o ).getValue(); - } - - /** - * Override to make two instances with same value equal. - * - * @return Description of the Returned Value - * @since 1.1 - */ - public int hashCode() - { - return (int)value; - } - -}// ZipLong diff --git a/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipOutputStream.java b/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipOutputStream.java deleted file mode 100644 index 09c994388..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipOutputStream.java +++ /dev/null @@ -1,713 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.zip; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Date; -import java.util.Hashtable; -import java.util.zip.CRC32; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.ZipException; - -/** - * Reimplementation of {@link java.util.zip.ZipOutputStream - * java.util.zip.ZipOutputStream} that does handle the extended functionality of - * this package, especially internal/external file attributes and extra fields - * with different layouts for local file data and central directory entries.- * - * This implementation will use a Data Descriptor to store size and CRC - * information for DEFLATED entries, this means, you don't need to calculate - * them yourself. Unfortunately this is not possible for the STORED method, here - * setting the CRC and uncompressed size information is required before {@link - * #putNextEntry putNextEntry} will be called.
- * - * @author Stefan Bodewig - * @version $Revision$ - */ -public class ZipOutputStream extends DeflaterOutputStream -{ - - /** - * Helper, a 0 as ZipShort. - * - * @since 1.1 - */ - private final static byte[] ZERO = {0, 0}; - - /** - * Helper, a 0 as ZipLong. - * - * @since 1.1 - */ - private final static byte[] LZERO = {0, 0, 0, 0}; - - /** - * Compression method for deflated entries. - * - * @since 1.1 - */ - public final static int DEFLATED = ZipEntry.DEFLATED; - - /** - * Compression method for deflated entries. - * - * @since 1.1 - */ - public final static int STORED = ZipEntry.STORED; - - /* - * Various ZIP constants - */ - /** - * local file header signature - * - * @since 1.1 - */ - protected final static ZipLong LFH_SIG = new ZipLong( 0X04034B50L ); - /** - * data descriptor signature - * - * @since 1.1 - */ - protected final static ZipLong DD_SIG = new ZipLong( 0X08074B50L ); - /** - * central file header signature - * - * @since 1.1 - */ - protected final static ZipLong CFH_SIG = new ZipLong( 0X02014B50L ); - /** - * end of central dir signature - * - * @since 1.1 - */ - protected final static ZipLong EOCD_SIG = new ZipLong( 0X06054B50L ); - - /** - * Smallest date/time ZIP can handle. - * - * @since 1.1 - */ - private final static ZipLong DOS_TIME_MIN = new ZipLong( 0x00002100L ); - - /** - * The file comment. - * - * @since 1.1 - */ - private String comment = ""; - - /** - * Compression level for next entry. - * - * @since 1.1 - */ - private int level = Deflater.DEFAULT_COMPRESSION; - - /** - * Default compression method for next entry. - * - * @since 1.1 - */ - private int method = DEFLATED; - - /** - * List of ZipEntries written so far. - * - * @since 1.1 - */ - private ArrayList entries = new ArrayList(); - - /** - * CRC instance to avoid parsing DEFLATED data twice. - * - * @since 1.1 - */ - private CRC32 crc = new CRC32(); - - /** - * Count the bytes written to out. - * - * @since 1.1 - */ - private long written = 0; - - /** - * Data for current entry started here. - * - * @since 1.1 - */ - private long dataStart = 0; - - /** - * Start of central directory. - * - * @since 1.1 - */ - private ZipLong cdOffset = new ZipLong( 0 ); - - /** - * Length of central directory. - * - * @since 1.1 - */ - private ZipLong cdLength = new ZipLong( 0 ); - - /** - * Holds the offsets of the LFH starts for each entry - * - * @since 1.1 - */ - private Hashtable offsets = new Hashtable(); - - /** - * The encoding to use for filenames and the file comment.- * - * For a list of possible values see - * http://java.sun.com/products/jdk/1.2/docs/guide/internat/encoding.doc.html - * . Defaults to the platform's default character encoding.
- * - * @since 1.3 - */ - private String encoding = null; - - /** - * Current entry. - * - * @since 1.1 - */ - private ZipEntry entry; - - /** - * Creates a new ZIP OutputStream filtering the underlying stream. - * - * @param out Description of Parameter - * @since 1.1 - */ - public ZipOutputStream( OutputStream out ) - { - super( out, new Deflater( Deflater.DEFAULT_COMPRESSION, true ) ); - } - - /** - * Convert a Date object to a DOS date/time field.
- *
- * Stolen from InfoZip's fileio.c
- * - * For a list of possible values see - * http://java.sun.com/products/jdk/1.2/docs/guide/internat/encoding.doc.html - * . Defaults to the platform's default character encoding.
- * - * @param encoding The new Encoding value - * @since 1.3 - */ - public void setEncoding( String encoding ) - { - this.encoding = encoding; - } - - /** - * Sets the compression level for subsequent entries.- * - * Default is Deflater.DEFAULT_COMPRESSION.
- * - * @param level The new Level value - * @since 1.1 - */ - public void setLevel( int level ) - { - this.level = level; - } - - /** - * Sets the default compression method for subsequent entries.- * - * Default is DEFLATED.
- * - * @param method The new Method value - * @since 1.1 - */ - public void setMethod( int method ) - { - this.method = method; - } - - /** - * The encoding to use for filenames and the file comment. - * - * @return null if using the platform's default character encoding. - * @since 1.3 - */ - public String getEncoding() - { - return encoding; - } - - /** - * Writes all necessary data for this entry. - * - * @exception IOException Description of Exception - * @since 1.1 - */ - public void closeEntry() - throws IOException - { - if( entry == null ) - { - return; - } - - long realCrc = crc.getValue(); - crc.reset(); - - if( entry.getMethod() == DEFLATED ) - { - def.finish(); - while( !def.finished() ) - { - deflate(); - } - - entry.setSize( def.getTotalIn() ); - entry.setComprSize( def.getTotalOut() ); - entry.setCrc( realCrc ); - - def.reset(); - - written += entry.getCompressedSize(); - } - else - { - if( entry.getCrc() != realCrc ) - { - throw new ZipException( "bad CRC checksum for entry " - + entry.getName() + ": " - + Long.toHexString( entry.getCrc() ) - + " instead of " - + Long.toHexString( realCrc ) ); - } - - if( entry.getSize() != written - dataStart ) - { - throw new ZipException( "bad size for entry " - + entry.getName() + ": " - + entry.getSize() - + " instead of " - + ( written - dataStart ) ); - } - - } - - writeDataDescriptor( entry ); - entry = null; - } - - /* - * Found out by experiment, that DeflaterOutputStream.close() - * will call finish() - so we don't need to override close - * ourselves. - */ - /** - * Finishs writing the contents and closes this as well as the underlying - * stream. - * - * @exception IOException Description of Exception - * @since 1.1 - */ - public void finish() - throws IOException - { - closeEntry(); - cdOffset = new ZipLong( written ); - for( int i = 0; i < entries.size(); i++ ) - { - writeCentralFileHeader( (ZipEntry)entries.get( i ) ); - } - cdLength = new ZipLong( written - cdOffset.getValue() ); - writeCentralDirectoryEnd(); - offsets.clear(); - entries.clear(); - } - - /** - * Begin writing next entry. - * - * @param ze Description of Parameter - * @exception IOException Description of Exception - * @since 1.1 - */ - public void putNextEntry( ZipEntry ze ) - throws IOException - { - closeEntry(); - - entry = ze; - entries.add( entry ); - - if( entry.getMethod() == -1 ) - {// not specified - entry.setMethod( method ); - } - - if( entry.getTime() == -1 ) - {// not specified - entry.setTime( System.currentTimeMillis() ); - } - - if( entry.getMethod() == STORED ) - { - if( entry.getSize() == -1 ) - { - throw new ZipException( "uncompressed size is required for STORED method" ); - } - if( entry.getCrc() == -1 ) - { - throw new ZipException( "crc checksum is required for STORED method" ); - } - entry.setComprSize( entry.getSize() ); - } - else - { - def.setLevel( level ); - } - writeLocalFileHeader( entry ); - } - - /** - * Writes bytes to ZIP entry.- * - * Override is necessary to support STORED entries, as well as calculationg - * CRC automatically for DEFLATED entries.
- * - * @param b Description of Parameter - * @param offset Description of Parameter - * @param length Description of Parameter - * @exception IOException Description of Exception - */ - public void write( byte[] b, int offset, int length ) - throws IOException - { - if( entry.getMethod() == DEFLATED ) - { - super.write( b, offset, length ); - } - else - { - out.write( b, offset, length ); - written += length; - } - crc.update( b, offset, length ); - } - - /** - * Retrieve the bytes for the given String in the encoding set for this - * Stream. - * - * @param name Description of Parameter - * @return The Bytes value - * @exception ZipException Description of Exception - * @since 1.3 - */ - protected byte[] getBytes( String name ) - throws ZipException - { - if( encoding == null ) - { - return name.getBytes(); - } - else - { - try - { - return name.getBytes( encoding ); - } - catch( UnsupportedEncodingException uee ) - { - throw new ZipException( uee.getMessage() ); - } - } - } - - /** - * Writes the "End of central dir record" - * - * @exception IOException Description of Exception - * @since 1.1 - */ - protected void writeCentralDirectoryEnd() - throws IOException - { - out.write( EOCD_SIG.getBytes() ); - - // disk numbers - out.write( ZERO ); - out.write( ZERO ); - - // number of entries - byte[] num = ( new ZipShort( entries.size() ) ).getBytes(); - out.write( num ); - out.write( num ); - - // length and location of CD - out.write( cdLength.getBytes() ); - out.write( cdOffset.getBytes() ); - - // ZIP file comment - byte[] data = getBytes( comment ); - out.write( ( new ZipShort( data.length ) ).getBytes() ); - out.write( data ); - } - - /** - * Writes the central file header entry - * - * @param ze Description of Parameter - * @exception IOException Description of Exception - * @since 1.1 - */ - protected void writeCentralFileHeader( ZipEntry ze ) - throws IOException - { - out.write( CFH_SIG.getBytes() ); - written += 4; - - // version made by - out.write( ( new ZipShort( 20 ) ).getBytes() ); - written += 2; - - // version needed to extract - // general purpose bit flag - if( ze.getMethod() == DEFLATED ) - { - // requires version 2 as we are going to store length info - // in the data descriptor - out.write( ( new ZipShort( 20 ) ).getBytes() ); - - // bit3 set to signal, we use a data descriptor - out.write( ( new ZipShort( 8 ) ).getBytes() ); - } - else - { - out.write( ( new ZipShort( 10 ) ).getBytes() ); - out.write( ZERO ); - } - written += 4; - - // compression method - out.write( ( new ZipShort( ze.getMethod() ) ).getBytes() ); - written += 2; - - // last mod. time and date - out.write( toDosTime( new Date( ze.getTime() ) ).getBytes() ); - written += 4; - - // CRC - // compressed length - // uncompressed length - out.write( ( new ZipLong( ze.getCrc() ) ).getBytes() ); - out.write( ( new ZipLong( ze.getCompressedSize() ) ).getBytes() ); - out.write( ( new ZipLong( ze.getSize() ) ).getBytes() ); - written += 12; - - // file name length - byte[] name = getBytes( ze.getName() ); - out.write( ( new ZipShort( name.length ) ).getBytes() ); - written += 2; - - // extra field length - byte[] extra = ze.getCentralDirectoryExtra(); - out.write( ( new ZipShort( extra.length ) ).getBytes() ); - written += 2; - - // file comment length - String comm = ze.getComment(); - if( comm == null ) - { - comm = ""; - } - byte[] comment = getBytes( comm ); - out.write( ( new ZipShort( comment.length ) ).getBytes() ); - written += 2; - - // disk number start - out.write( ZERO ); - written += 2; - - // internal file attributes - out.write( ( new ZipShort( ze.getInternalAttributes() ) ).getBytes() ); - written += 2; - - // external file attributes - out.write( ( new ZipLong( ze.getExternalAttributes() ) ).getBytes() ); - written += 4; - - // relative offset of LFH - out.write( ( (ZipLong)offsets.get( ze ) ).getBytes() ); - written += 4; - - // file name - out.write( name ); - written += name.length; - - // extra field - out.write( extra ); - written += extra.length; - - // file comment - out.write( comment ); - written += comment.length; - } - - /** - * Writes the data descriptor entry - * - * @param ze Description of Parameter - * @exception IOException Description of Exception - * @since 1.1 - */ - protected void writeDataDescriptor( ZipEntry ze ) - throws IOException - { - if( ze.getMethod() != DEFLATED ) - { - return; - } - out.write( DD_SIG.getBytes() ); - out.write( ( new ZipLong( entry.getCrc() ) ).getBytes() ); - out.write( ( new ZipLong( entry.getCompressedSize() ) ).getBytes() ); - out.write( ( new ZipLong( entry.getSize() ) ).getBytes() ); - written += 16; - } - - /** - * Writes the local file header entry - * - * @param ze Description of Parameter - * @exception IOException Description of Exception - * @since 1.1 - */ - protected void writeLocalFileHeader( ZipEntry ze ) - throws IOException - { - offsets.put( ze, new ZipLong( written ) ); - - out.write( LFH_SIG.getBytes() ); - written += 4; - - // version needed to extract - // general purpose bit flag - if( ze.getMethod() == DEFLATED ) - { - // requires version 2 as we are going to store length info - // in the data descriptor - out.write( ( new ZipShort( 20 ) ).getBytes() ); - - // bit3 set to signal, we use a data descriptor - out.write( ( new ZipShort( 8 ) ).getBytes() ); - } - else - { - out.write( ( new ZipShort( 10 ) ).getBytes() ); - out.write( ZERO ); - } - written += 4; - - // compression method - out.write( ( new ZipShort( ze.getMethod() ) ).getBytes() ); - written += 2; - - // last mod. time and date - out.write( toDosTime( new Date( ze.getTime() ) ).getBytes() ); - written += 4; - - // CRC - // compressed length - // uncompressed length - if( ze.getMethod() == DEFLATED ) - { - out.write( LZERO ); - out.write( LZERO ); - out.write( LZERO ); - } - else - { - out.write( ( new ZipLong( ze.getCrc() ) ).getBytes() ); - out.write( ( new ZipLong( ze.getSize() ) ).getBytes() ); - out.write( ( new ZipLong( ze.getSize() ) ).getBytes() ); - } - written += 12; - - // file name length - byte[] name = getBytes( ze.getName() ); - out.write( ( new ZipShort( name.length ) ).getBytes() ); - written += 2; - - // extra field length - byte[] extra = ze.getLocalFileDataExtra(); - out.write( ( new ZipShort( extra.length ) ).getBytes() ); - written += 2; - - // file name - out.write( name ); - written += name.length; - - // extra field - out.write( extra ); - written += extra.length; - - dataStart = written; - } - -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipShort.java b/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipShort.java deleted file mode 100644 index e22a7096f..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/zip/ZipShort.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.zip; - -/** - * Utility class that represents a two byte integer with conversion rules for - * the big endian byte order of ZIP files. - * - * @author Stefan Bodewig - * @version $Revision$ - */ -public class ZipShort implements Cloneable -{ - - private int value; - - /** - * Create instance from a number. - * - * @param value Description of Parameter - * @since 1.1 - */ - public ZipShort( int value ) - { - this.value = value; - } - - /** - * Create instance from bytes. - * - * @param bytes Description of Parameter - * @since 1.1 - */ - public ZipShort( byte[] bytes ) - { - this( bytes, 0 ); - } - - /** - * Create instance from the two bytes starting at offset. - * - * @param bytes Description of Parameter - * @param offset Description of Parameter - * @since 1.1 - */ - public ZipShort( byte[] bytes, int offset ) - { - value = ( bytes[ offset + 1 ] << 8 ) & 0xFF00; - value += ( bytes[ offset ] & 0xFF ); - } - - /** - * Get value as two bytes in big endian byte order. - * - * @return The Bytes value - * @since 1.1 - */ - public byte[] getBytes() - { - byte[] result = new byte[ 2 ]; - result[ 0 ] = (byte)( value & 0xFF ); - result[ 1 ] = (byte)( ( value & 0xFF00 ) >> 8 ); - return result; - } - - /** - * Get value as Java int. - * - * @return The Value value - * @since 1.1 - */ - public int getValue() - { - return value; - } - - /** - * Override to make two instances with same value equal. - * - * @param o Description of Parameter - * @return Description of the Returned Value - * @since 1.1 - */ - public boolean equals( Object o ) - { - if( o == null || !( o instanceof ZipShort ) ) - { - return false; - } - return value == ( (ZipShort)o ).getValue(); - } - - /** - * Override to make two instances with same value equal. - * - * @return Description of the Returned Value - * @since 1.1 - */ - public int hashCode() - { - return value; - } - -}// ZipShort