diff -r 9839e9a75bcf -r 693745d01b55 emul/mini/src/main/java/java/util/zip/CRC32.java --- a/emul/mini/src/main/java/java/util/zip/CRC32.java Wed Jan 30 14:03:49 2013 +0100 +++ b/emul/mini/src/main/java/java/util/zip/CRC32.java Fri Feb 01 18:02:16 2013 +0100 @@ -1,113 +1,132 @@ -/* - * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ +/* CRC32.java - Computes CRC32 data checksum of a data stream + Copyright (C) 1999. 2000, 2001 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ package java.util.zip; +/* + * Written using on-line Java Platform 1.2 API Specification, as well + * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). + * The actual CRC32 algorithm is taken from RFC 1952. + * Status: Believed complete and correct. + */ + /** - * A class that can be used to compute the CRC-32 of a data stream. + * Computes CRC32 data checksum of a data stream. + * The actual CRC32 algorithm is described in RFC 1952 + * (GZIP file format specification version 4.3). + * Can be used to get the CRC32 over a stream if used with checked input/output + * streams. * - * @see Checksum - * @author David Connelly + * @see InflaterInputStream + * @see DeflaterOutputStream + * + * @author Per Bothner + * @date April 1, 1999. */ -public -class CRC32 implements Checksum { - private int crc = 0xFFFFFFFF; +public class CRC32 implements Checksum +{ + /** The crc data checksum so far. */ + private int crc = 0; - /** - * Creates a new CRC32 object. - */ - public CRC32() { - } + /** The fast CRC table. Computed once when the CRC32 class is loaded. */ + private static int[] crc_table = make_crc_table(); + /** Make the table for a fast CRC. */ + private static int[] make_crc_table () + { + int[] crc_table = new int[256]; + for (int n = 0; n < 256; n++) + { + int c = n; + for (int k = 8; --k >= 0; ) + { + if ((c & 1) != 0) + c = 0xedb88320 ^ (c >>> 1); + else + c = c >>> 1; + } + crc_table[n] = c; + } + return crc_table; + } - /** - * Updates the CRC-32 checksum with the specified byte (the low - * eight bits of the argument b). - * - * @param b the byte to update the checksum with - */ - public void update(int b) { - byte[] arr = { (byte)b }; - update(arr); - } + /** + * Returns the CRC32 data checksum computed so far. + */ + public long getValue () + { + return (long) crc & 0xffffffffL; + } - /** - * Updates the CRC-32 checksum with the specified array of bytes. - */ - public void update(byte[] b, int off, int len) { - if (b == null) { - throw new NullPointerException(); - } - if (off < 0 || len < 0 || off > b.length - len) { - throw new ArrayIndexOutOfBoundsException(); - } - crc = updateBytes(crc, b, off, len); - } + /** + * Resets the CRC32 data checksum as if no update was ever called. + */ + public void reset () { crc = 0; } - /** - * Updates the CRC-32 checksum with the specified array of bytes. - * - * @param b the array of bytes to update the checksum with - */ - public void update(byte[] b) { - crc = updateBytes(crc, b, 0, b.length); - } + /** + * Updates the checksum with the int bval. + * + * @param bval (the byte is taken as the lower 8 bits of bval) + */ - /** - * Resets CRC-32 to initial value. - */ - public void reset() { - crc = 0; - } + public void update (int bval) + { + int c = ~crc; + c = crc_table[(c ^ bval) & 0xff] ^ (c >>> 8); + crc = ~c; + } - /** - * Returns CRC-32 value. - */ - public long getValue() { - return (long)crc & 0xffffffffL; - } + /** + * Adds the byte array to the data checksum. + * + * @param buf the buffer which contains the data + * @param off the offset in the buffer where the data starts + * @param len the length of the data + */ + public void update (byte[] buf, int off, int len) + { + int c = ~crc; + while (--len >= 0) + c = crc_table[(c ^ buf[off++]) & 0xff] ^ (c >>> 8); + crc = ~c; + } - // XXX: taken from - // http://introcs.cs.princeton.edu/java/51data/CRC32.java.html - private static int updateBytes(int crc, byte[] arr, int off, int len) { - int poly = 0xEDB88320; // reverse polynomial - - while (len-- > 0) { - byte b = arr[off++]; - int temp = (crc ^ b) & 0xff; - - // read 8 bits one at a time - for (int i = 0; i < 8; i++) { - if ((temp & 1) == 1) { - temp = (temp >>> 1) ^ poly; - } else { - temp = (temp >>> 1); - } - } - crc = (crc >>> 8) ^ temp; - } - return crc ^ 0xffffffff; - } + /** + * Adds the complete byte array to the data checksum. + */ + public void update (byte[] buf) { update(buf, 0, buf.length); } }