Mercurial > 510Connectbot
diff src/com/jcraft/jzlib/Adler32.java @ 357:46c2115ae1c8
update jzlib to a21be20213d66eff15904d925e9b721956a01ef7
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Fri, 01 Aug 2014 13:34:58 -0700 |
parents | 0ce5cc452d02 |
children |
line wrap: on
line diff
--- a/src/com/jcraft/jzlib/Adler32.java Fri Aug 01 11:57:17 2014 -0700 +++ b/src/com/jcraft/jzlib/Adler32.java Fri Aug 01 13:34:58 2014 -0700 @@ -1,6 +1,6 @@ /* -*-mode:java; c-basic-offset:2; -*- */ /* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. +Copyright (c) 2000-2011 ymnk, JCraft,Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -8,8 +8,8 @@ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products @@ -34,65 +34,106 @@ package com.jcraft.jzlib; -final class Adler32 { +final public class Adler32 implements Checksum { - // largest prime smaller than 65536 - static final private int BASE = 65521; - // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 - static final private int NMAX = 5552; + // largest prime smaller than 65536 + static final private int BASE=65521; + // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 + static final private int NMAX=5552; + + private long s1=1L; + private long s2=0L; - long adler32(long adler, byte[] buf, int index, int len) { - if (buf == null) { return 1L; } + public void reset(long init){ + s1=init&0xffff; + s2=(init>>16)&0xffff; + } - long s1 = adler & 0xffff; - long s2 = (adler >> 16) & 0xffff; - int k; - - while (len > 0) { - k = len < NMAX ? len : NMAX; - len -= k; + public void reset(){ + s1=1L; + s2=0L; + } - while (k >= 16) { - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - s1 += buf[index++] & 0xff; s2 += s1; - k -= 16; - } + public long getValue(){ + return ((s2<<16)|s1); + } + + public void update(byte[] buf, int index, int len){ - if (k != 0) { - do { - s1 += buf[index++] & 0xff; s2 += s1; - } - while (--k != 0); - } + if(len==1){ + s1+=buf[index++]&0xff; s2+=s1; + s1%=BASE; + s2%=BASE; + return; + } - s1 %= BASE; - s2 %= BASE; - } - - return (s2 << 16) | s1; + int len1 = len/NMAX; + int len2 = len%NMAX; + while(len1-->0) { + int k=NMAX; + len-=k; + while(k-->0){ + s1+=buf[index++]&0xff; s2+=s1; + } + s1%=BASE; + s2%=BASE; } - /* - private java.util.zip.Adler32 adler=new java.util.zip.Adler32(); - long adler32(long value, byte[] buf, int index, int len){ - if(value==1) {adler.reset();} - if(buf==null) {adler.reset();} - else{adler.update(buf, index, len);} - return adler.getValue(); + int k=len2; + len-=k; + while(k-->0){ + s1+=buf[index++]&0xff; s2+=s1; } - */ + s1%=BASE; + s2%=BASE; + } + + public Adler32 copy(){ + Adler32 foo = new Adler32(); + foo.s1 = this.s1; + foo.s2 = this.s2; + return foo; + } + + // The following logic has come from zlib.1.2. + static long combine(long adler1, long adler2, long len2){ + long BASEL = (long)BASE; + long sum1; + long sum2; + long rem; // unsigned int + + rem = len2 % BASEL; + sum1 = adler1 & 0xffffL; + sum2 = rem * sum1; + sum2 %= BASEL; // MOD(sum2); + sum1 += (adler2 & 0xffffL) + BASEL - 1; + sum2 += ((adler1 >> 16) & 0xffffL) + ((adler2 >> 16) & 0xffffL) + BASEL - rem; + if (sum1 >= BASEL) sum1 -= BASEL; + if (sum1 >= BASEL) sum1 -= BASEL; + if (sum2 >= (BASEL << 1)) sum2 -= (BASEL << 1); + if (sum2 >= BASEL) sum2 -= BASEL; + return sum1 | (sum2 << 16); + } + +/* + private java.util.zip.Adler32 adler=new java.util.zip.Adler32(); + public void update(byte[] buf, int index, int len){ + if(buf==null) {adler.reset();} + else{adler.update(buf, index, len);} + } + public void reset(){ + adler.reset(); + } + public void reset(long init){ + if(init==1L){ + adler.reset(); + } + else{ + System.err.println("unsupported operation"); + } + } + public long getValue(){ + return adler.getValue(); + } +*/ }