blob: 0dfd74c56b98191b374611ba85d14a282632d868 [file] [log] [blame]
/* Copyright (c) 2001-2010, The HSQL Development Group
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 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.
*
* Neither the name of the HSQL Development Group nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.hsqldb.lib;
import java.io.DataInput;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
/**
* This class is a replacement for both java.io.ByteArrayInputStream
* (without synchronization) and java.io.DataInputStream
*
* @author Fred Toussi (fredt@users dot sourceforge.net)
* @version 1.9.0
* @since 1.7.2
*/
public class HsqlByteArrayInputStream extends InputStream
implements DataInput {
protected byte[] buffer;
protected int pos;
protected int mark = 0;
protected int count;
public HsqlByteArrayInputStream(byte[] buf) {
this.buffer = buf;
this.pos = 0;
this.count = buf.length;
}
public HsqlByteArrayInputStream(byte[] buf, int offset, int length) {
this.buffer = buf;
this.pos = offset;
this.count = Math.min(offset + length, buf.length);
this.mark = offset;
}
// methods that implement java.io.DataInput
public final void readFully(byte[] b) throws IOException {
readFully(b, 0, b.length);
}
public final void readFully(byte[] b, int off,
int len) throws IOException {
if (len < 0) {
throw new IndexOutOfBoundsException();
}
int n = 0;
while (n < len) {
int count = read(b, off + n, len - n);
if (count < 0) {
throw new EOFException();
}
n += count;
}
}
public final boolean readBoolean() throws IOException {
int ch = read();
if (ch < 0) {
throw new EOFException();
}
return (ch != 0);
}
public final byte readByte() throws IOException {
int ch = read();
if (ch < 0) {
throw new EOFException();
}
return (byte) ch;
}
public final int readUnsignedByte() throws IOException {
int ch = read();
if (ch < 0) {
throw new EOFException();
}
return ch;
}
public short readShort() throws IOException {
if (count - pos < 2) {
pos = count;
throw new EOFException();
}
int ch1 = buffer[pos++] & 0xff;
int ch2 = buffer[pos++] & 0xff;
return (short) ((ch1 << 8) + (ch2));
}
public final int readUnsignedShort() throws IOException {
int ch1 = read();
int ch2 = read();
if ((ch1 | ch2) < 0) {
throw new EOFException();
}
return (ch1 << 8) + (ch2);
}
public final char readChar() throws IOException {
int ch1 = read();
int ch2 = read();
if ((ch1 | ch2) < 0) {
throw new EOFException();
}
return (char) ((ch1 << 8) + (ch2));
}
public int readInt() throws IOException {
if (count - pos < 4) {
pos = count;
throw new EOFException();
}
int ch1 = buffer[pos++] & 0xff;
int ch2 = buffer[pos++] & 0xff;
int ch3 = buffer[pos++] & 0xff;
int ch4 = buffer[pos++] & 0xff;
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4));
}
public long readLong() throws IOException {
return (((long) readInt()) << 32) + (((long) readInt()) & 0xffffffffL);
}
public final float readFloat() throws IOException {
return Float.intBitsToFloat(readInt());
}
public final double readDouble() throws IOException {
return Double.longBitsToDouble(readLong());
}
public int skipBytes(int n) throws IOException {
return (int) skip(n);
}
public String readLine() throws IOException {
/** @todo: this will probably be useful */
throw new java.lang.RuntimeException("not implemented.");
}
public String readUTF() throws IOException {
int bytecount = readUnsignedShort();
if (pos + bytecount >= count) {
throw new EOFException();
}
String result = StringConverter.readUTF(buffer, pos, bytecount);
pos += bytecount;
return result;
}
// methods that extend java.io.InputStream
public int read() {
return (pos < count) ? (buffer[pos++] & 0xff)
: -1;
}
public int read(byte[] b, int off, int len) {
if (pos >= count) {
return -1;
}
if (pos + len > count) {
len = count - pos;
}
if (len <= 0) {
return 0;
}
System.arraycopy(buffer, pos, b, off, len);
pos += len;
return len;
}
public long skip(long n) {
if (pos + n > count) {
n = count - pos;
}
if (n < 0) {
return 0;
}
pos += n;
return n;
}
public int available() {
return count - pos;
}
public boolean markSupported() {
return true;
}
public void mark(int readAheadLimit) {
mark = pos;
}
public void reset() {
pos = mark;
}
public void close() throws IOException {}
}