1 // Auto-generated: DO NOT EDIT
3 package net.jpountz.lz4;
5 import static net.jpountz.lz4.LZ4Constants.*;
7 import java.nio.ByteBuffer;
9 import net.jpountz.util.ByteBufferUtils;
10 import net.jpountz.util.UnsafeUtils;
15 final class LZ4JavaUnsafeFastDecompressor extends LZ4FastDecompressor {
17 public static final LZ4FastDecompressor INSTANCE = new LZ4JavaUnsafeFastDecompressor();
20 public int decompress(byte[] src, final int srcOff, byte[] dest, final int destOff, int destLen) {
23 UnsafeUtils.checkRange(src, srcOff);
24 UnsafeUtils.checkRange(dest, destOff, destLen);
27 if (UnsafeUtils.readByte(src, srcOff) != 0) {
28 throw new LZ4Exception("Malformed input at " + srcOff);
34 final int destEnd = destOff + destLen;
40 final int token = UnsafeUtils.readByte(src, sOff) & 0xFF;
44 int literalLen = token >>> ML_BITS;
45 if (literalLen == RUN_MASK) {
46 byte len = (byte) 0xFF;
47 while ((len = UnsafeUtils.readByte(src, sOff++)) == (byte) 0xFF) {
50 literalLen += len & 0xFF;
53 final int literalCopyEnd = dOff + literalLen;
55 if (literalCopyEnd > destEnd - COPY_LENGTH) {
56 if (literalCopyEnd != destEnd) {
57 throw new LZ4Exception("Malformed input at " + sOff);
60 LZ4UnsafeUtils.safeArraycopy(src, sOff, dest, dOff, literalLen);
62 dOff = literalCopyEnd;
67 LZ4UnsafeUtils.wildArraycopy(src, sOff, dest, dOff, literalLen);
69 dOff = literalCopyEnd;
72 final int matchDec = UnsafeUtils.readShortLE(src, sOff);
74 int matchOff = dOff - matchDec;
76 if (matchOff < destOff) {
77 throw new LZ4Exception("Malformed input at " + sOff);
80 int matchLen = token & ML_MASK;
81 if (matchLen == ML_MASK) {
82 byte len = (byte) 0xFF;
83 while ((len = UnsafeUtils.readByte(src, sOff++)) == (byte) 0xFF) {
86 matchLen += len & 0xFF;
88 matchLen += MIN_MATCH;
90 final int matchCopyEnd = dOff + matchLen;
92 if (matchCopyEnd > destEnd - COPY_LENGTH) {
93 if (matchCopyEnd > destEnd) {
94 throw new LZ4Exception("Malformed input at " + sOff);
96 LZ4UnsafeUtils.safeIncrementalCopy(dest, matchOff, dOff, matchLen);
98 LZ4UnsafeUtils.wildIncrementalCopy(dest, matchOff, dOff, matchCopyEnd);
104 return sOff - srcOff;
109 public int decompress(ByteBuffer src, final int srcOff, ByteBuffer dest, final int destOff, int destLen) {
111 if (src.hasArray() && dest.hasArray()) {
112 return decompress(src.array(), srcOff + src.arrayOffset(), dest.array(), destOff + dest.arrayOffset(), destLen);
114 src = ByteBufferUtils.inNativeByteOrder(src);
115 dest = ByteBufferUtils.inNativeByteOrder(dest);
118 ByteBufferUtils.checkRange(src, srcOff);
119 ByteBufferUtils.checkRange(dest, destOff, destLen);
122 if (ByteBufferUtils.readByte(src, srcOff) != 0) {
123 throw new LZ4Exception("Malformed input at " + srcOff);
129 final int destEnd = destOff + destLen;
135 final int token = ByteBufferUtils.readByte(src, sOff) & 0xFF;
139 int literalLen = token >>> ML_BITS;
140 if (literalLen == RUN_MASK) {
141 byte len = (byte) 0xFF;
142 while ((len = ByteBufferUtils.readByte(src, sOff++)) == (byte) 0xFF) {
145 literalLen += len & 0xFF;
148 final int literalCopyEnd = dOff + literalLen;
150 if (literalCopyEnd > destEnd - COPY_LENGTH) {
151 if (literalCopyEnd != destEnd) {
152 throw new LZ4Exception("Malformed input at " + sOff);
155 LZ4ByteBufferUtils.safeArraycopy(src, sOff, dest, dOff, literalLen);
157 dOff = literalCopyEnd;
162 LZ4ByteBufferUtils.wildArraycopy(src, sOff, dest, dOff, literalLen);
164 dOff = literalCopyEnd;
167 final int matchDec = ByteBufferUtils.readShortLE(src, sOff);
169 int matchOff = dOff - matchDec;
171 if (matchOff < destOff) {
172 throw new LZ4Exception("Malformed input at " + sOff);
175 int matchLen = token & ML_MASK;
176 if (matchLen == ML_MASK) {
177 byte len = (byte) 0xFF;
178 while ((len = ByteBufferUtils.readByte(src, sOff++)) == (byte) 0xFF) {
181 matchLen += len & 0xFF;
183 matchLen += MIN_MATCH;
185 final int matchCopyEnd = dOff + matchLen;
187 if (matchCopyEnd > destEnd - COPY_LENGTH) {
188 if (matchCopyEnd > destEnd) {
189 throw new LZ4Exception("Malformed input at " + sOff);
191 LZ4ByteBufferUtils.safeIncrementalCopy(dest, matchOff, dOff, matchLen);
193 LZ4ByteBufferUtils.wildIncrementalCopy(dest, matchOff, dOff, matchCopyEnd);
199 return sOff - srcOff;