/**
* Copyright (C) 2013 Gundog Studios LLC.
*
* This program 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 3 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.gundogstudios.models.md2;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Taken from http://www.peterfranza.com/2008/09/26/little-endian-input-stream/
*/
public class LittleEndianDataInputStream extends InputStream implements DataInput {
private DataInputStream d; // to get at high level readFully methods of DataInputStream
private InputStream in; // to get at the low-level read methods of InputStream
private byte w[]; // work array for buffering input
public LittleEndianDataInputStream(InputStream in) {
this.in = in;
this.d = new DataInputStream(in);
w = new byte[8];
}
public int available() throws IOException {
return d.available();
}
public final short readShort() throws IOException {
d.readFully(w, 0, 2);
return (short) ((w[1] & 0xff) << 8 | (w[0] & 0xff));
}
public String readString(int length) throws IOException {
if (length == 0) {
return null;
}
byte[] b = new byte[length];
d.readFully(b);
return new String(b, "US-ASCII");
}
/**
* Note, returns int even though it reads a short.
*/
public final int readUnsignedShort() throws IOException {
d.readFully(w, 0, 2);
return ((w[1] & 0xff) << 8 | (w[0] & 0xff));
}
/**
* like DataInputStream.readChar except little endian.
*/
public final char readChar() throws IOException {
d.readFully(w, 0, 2);
return (char) ((w[1] & 0xff) << 8 | (w[0] & 0xff));
}
/**
* like DataInputStream.readInt except little endian.
*/
public final int readInt() throws IOException {
d.readFully(w, 0, 4);
return (w[3]) << 24 | (w[2] & 0xff) << 16 | (w[1] & 0xff) << 8 | (w[0] & 0xff);
}
/**
* like DataInputStream.readLong except little endian.
*/
public final long readLong() throws IOException {
d.readFully(w, 0, 8);
return (long) (w[7]) << 56 | (long) (w[6] & 0xff) << 48 | (long) (w[5] & 0xff) << 40
| (long) (w[4] & 0xff) << 32 | (long) (w[3] & 0xff) << 24 | (long) (w[2] & 0xff) << 16
| (long) (w[1] & 0xff) << 8 | (long) (w[0] & 0xff);
}
public final float readFloat() throws IOException {
return Float.intBitsToFloat(readInt());
}
public final double readDouble() throws IOException {
return Double.longBitsToDouble(readLong());
}
public final int read(byte b[], int off, int len) throws IOException {
return in.read(b, off, len);
}
public final void readFully(byte b[]) throws IOException {
d.readFully(b, 0, b.length);
}
public final void readFully(byte b[], int off, int len) throws IOException {
d.readFully(b, off, len);
}
public final int skipBytes(int n) throws IOException {
return d.skipBytes(n);
}
public final boolean readBoolean() throws IOException {
return d.readBoolean();
}
public final byte readByte() throws IOException {
return d.readByte();
}
public int read() throws IOException {
return in.read();
}
public final int readUnsignedByte() throws IOException {
return d.readUnsignedByte();
}
public final String readUTF() throws IOException {
return d.readUTF();
}
public final void close() throws IOException {
d.close();
}
@Deprecated
public String readLine() throws IOException {
return d.readLine();
}
}