/*
* eXist Open Source Native XML Database Copyright (C) 2001-04, Wolfgang M.
* Meier (meier@ifs.tu-darmstadt.de)
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Library General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option) any
* later version.
*
* This library 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 Library General Public License for more
* details.
*
* You should have received a copy of the GNU Library General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Id$
*/
package org.exist.storage.io;
import java.io.EOFException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.log4j.Logger;
/**
* Abstract base class for implementations of VariableByteInput.
*
* @author wolf
*/
public abstract class AbstractVariableByteInput implements VariableByteInput {
private static Logger LOG = Logger.getLogger(AbstractVariableByteInput.class.getName());
public AbstractVariableByteInput() {
}
public abstract int available() throws IOException;
public abstract int read() throws IOException;
public byte readByte() throws IOException {
final int i = read();
if (i < 0) throw new EOFException();
return (byte) i;
}
public short readShort() throws IOException {
byte b = readByte();
short i = (short) (b & 0177);
for (int shift = 7; (b & 0200) != 0; shift += 7) {
b = readByte();
i |= (b & 0177L) << shift;
}
return i;
}
public int readInt() throws IOException {
byte b = readByte();
int i = b & 0177;
for (int shift = 7; (b & 0200) != 0; shift += 7) {
b = readByte();
i |= (b & 0177L) << shift;
}
return i;
}
public int readFixedInt() throws IOException {
return ( readByte() & 0xff ) |
( ( readByte() & 0xff ) << 8 ) |
( ( readByte() & 0xff ) << 16 ) |
( ( readByte() & 0xff ) << 24 );
}
public long readLong() throws IOException {
byte b = readByte();
long i = b & 0177;
for (int shift = 7; (b & 0200) != 0; shift += 7) {
b = readByte();
i |= (b & 0177L) << shift;
}
return i;
}
public String readUTF() throws IOException, EOFException {
int len = readInt();
byte data[] = new byte[len];
read(data);
String s;
try {
s = new String(data, "UTF-8");
} catch (UnsupportedEncodingException e) {
LOG.warn(e);
s = new String(data);
}
return s;
}
public void skip(int count) throws IOException {
for (int i = 0; i < count && available() > 0; i++) {
while ((readByte() & 0200) > 0)
;
}
}
public void skipBytes(long count) throws IOException {
for(long i = 0; i < count; i++)
readByte();
}
public int read(byte[] data) throws IOException {
return read(data, 0, data.length);
}
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if ((off < 0) || (off > b.length) || (len < 0)
|| ((off + len) > b.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else if (len == 0) { return 0; }
int c = read();
if (c == -1) { return -1; }
b[off] = (byte) c;
int i = 1;
try {
for (; i < len; i++) {
c = read();
if (c == -1) {
break;
}
if (b != null) {
b[off + i] = (byte) c;
}
}
} catch (IOException ee) {
}
return i;
}
public void copyTo(VariableByteOutputStream os) throws IOException {
int more;
do {
more = read();
os.buf.append((byte) more);
more &= 0200;
} while (more > 0);
}
public void copyTo(VariableByteOutputStream os, int count)
throws IOException {
int more;
for (int i = 0; i < count; i++) {
do {
more = read();
os.buf.append((byte)more);
more &= 0200;
} while (more > 0);
}
}
public void copyRaw(VariableByteOutputStream os, int count) throws IOException {
for (int i = 0; i < count; i++) {
os.buf.append((byte) read());
}
}
/* (non-Javadoc)
* @see org.exist.storage.io.VariableByteInput#release()
*/
public void release() {
}
}