package com.intellij.lang.javascript.flex.importer;
import org.jetbrains.annotations.NotNull;
import java.io.InputStream;
import java.io.IOException;
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.util.zip.InflaterInputStream;
/**
* @author Maxim.Mossienko
* Date: Oct 20, 2008
* Time: 7:02:53 PM
*/
class ByteBuffer {
private byte[] bytes;
private int position;
private boolean littleEndian;
void read(@NotNull InputStream inputStream) throws IOException {
try {
bytes = readStream(inputStream);
}
finally {
if (inputStream != null) inputStream.close();
}
}
void setLittleEndian() {
littleEndian = true;
}
int readInt() {
int result;
if (littleEndian) {
result = (((bytes[position + 3] & 0xFF) << 8 | (bytes[position + 2] & 0xFF)) << 16) + ((bytes[position + 1] & 0xFF) << 8) | (bytes[position] & 0xFF);
}
else {
result = (((bytes[position] & 0xFF) << 8 | (bytes[position + 1] & 0xFF)) << 16) + ((bytes[position + 2] & 0xFF) << 8) | (bytes[position + 3] & 0xFF);
}
position += 4;
return result;
}
public int readUnsignedInt() {
return readInt();
}
public void setPosition(final int i) {
position = i;
}
public int bytesSize() {
return bytes.length;
}
public void uncompress() throws IOException {
final InflaterInputStream zipInputStream = new InflaterInputStream(new ByteArrayInputStream(bytes));
bytes = readStream(zipInputStream);
zipInputStream.close();
}
private static byte[] readStream(final InputStream zipInputStream) throws IOException {
final byte[] buf = new byte[8192];
byte[] result = new byte[8192];
int total = 0;
while (true) {
int read = zipInputStream.read(buf);
if (read == -1) break;
if (total + read >= result.length) {
byte[] newresult = new byte[result.length * 2];
System.arraycopy(result, 0, newresult, 0, total);
result = newresult;
}
System.arraycopy(buf, 0, result, total, read);
total += read;
}
final byte[] realResult = new byte[total];
System.arraycopy(result, 0, realResult, 0, total);
return realResult;
}
public int readUnsignedByte() {
return bytes[position++] & 0xFF;
}
public int readByte() {
return bytes[position++];
}
public int readUnsignedShort() {
int result;
if (littleEndian) {
result = (bytes[position + 1] & 0xFF) << 8 | (bytes[position] & 0xFF);
}
else {
result = (bytes[position] & 0xFF) << 8 | (bytes[position + 1] & 0xFF);
}
position += 2;
return result;
}
public void readBytes(ByteBuffer data2, int length) {
data2.bytes = new byte[length];
System.arraycopy(bytes, position, data2.bytes, 0, length);
position += length;
}
public boolean eof() {
return position >= bytes.length;
}
public String readUTFBytes(int i) {
try {
final byte[] buf = new byte[i];
while (i > 0) {
buf[buf.length - i] = (byte)readByte();
--i;
}
return new String(buf, "utf-8");
}
catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
public double readDouble() {
int first = readInt();
int second = readInt();
return Double.longBitsToDouble(((long)second << 32) | first);
}
public int readU32() {
int result = readUnsignedByte();
if ((result & 0x00000080) == 0) return result;
result = result & 0x0000007f | readUnsignedByte() << 7;
if ((result & 0x00004000) == 0) return result;
result = result & 0x00003fff | readUnsignedByte() << 14;
if ((result & 0x00200000) == 0) return result;
result = result & 0x001fffff | readUnsignedByte() << 21;
if ((result & 0x10000000) == 0) return result;
return result & 0x0fffffff | readUnsignedByte() << 28;
}
public byte getByte(int i) {
return bytes[i];
}
public int getPosition() {
return position;
}
public void incPosition(final int length) {
position += length;
}
}