package org.basex.io.in; import java.io.DataInputStream; import java.io.IOException; import org.basex.io.IOFile; import org.basex.util.Num; import org.basex.util.Token; import org.basex.util.list.IntList; /** * This is an input stream for project specific data types. * It bears resemblance to Java's {@link DataInputStream}. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class DataInput extends BufferInput { /** * Constructor. * @param file the file to be read * @throws IOException I/O Exception */ public DataInput(final IOFile file) throws IOException { super(file); } /** * Reads a boolean value. * @return boolean value * @throws IOException I/O Exception */ public boolean readBool() throws IOException { return read() == 1; } /** * Reads a token, represented by its compressed length and its byte array. * @return byte array * @throws IOException I/O Exception */ public byte[] readToken() throws IOException { final int l = readNum(); if(l == 0) return Token.EMPTY; final byte[] array = new byte[l]; for(int i = 0; i < l; ++i) array[i] = (byte) read(); return array; } /** * Reads a double value. * @return byte array * @throws IOException I/O Exception */ public double readDouble() throws IOException { return Token.toDouble(readToken()); } /** * Reads a distance-mapped integer array. * @return integer array * @throws IOException I/O Exception */ public IntList readDiffs() throws IOException { final int[] array = new int[readNum()]; for(int a = 0; a < array.length; ++a) { array[a] = (a == 0 ? 0 : array[a - 1]) + readNum(); } return new IntList(array); } /** * Reads a compressed integer array. * @return integer array * @throws IOException I/O Exception */ public int[] readNums() throws IOException { return readNums(readNum()); } /** * Reads compressed integer values of the specified size. * @param s array size * @return integer array * @throws IOException I/O Exception */ int[] readNums(final int s) throws IOException { final int[] array = new int[s]; for(int a = 0; a < s; ++a) array[a] = readNum(); return array; } /** * Reads a token array. * @return double array * @throws IOException I/O Exception */ public byte[][] readTokens() throws IOException { final int l = readNum(); final byte[][] array = new byte[l][]; for(int i = 0; i < l; ++i) array[i] = readToken(); return array; } /** * Reads a compressed integer value; see {@link Num} for more. * @return read value * @throws IOException I/O Exception */ public int readNum() throws IOException { final int v = read(); if(v == -1) return 0; switch((v & 0xC0) >>> 6) { case 0: return v; case 1: return ((v & 0x3F) << 8) + read(); case 2: return ((v & 0x3F) << 24) + (read() << 16) + (read() << 8) + read(); default: return (read() << 24) + (read() << 16) + (read() << 8) + read(); } } /** * Reads an array of long values. * @param s array size * @return array of longs * @throws IOException I/O Exception */ public long[] readLongs(final int s) throws IOException { final long[] array = new long[s]; for(int a = 0; a < s; ++a) array[a] = read8(); return array; } /** * Read a long value. * @return read value * @throws IOException I/O Exception */ long read8() throws IOException { return ((long) read() << 56) + ((long) (read() & 255) << 48) + ((long) (read() & 255) << 40) + ((long) (read() & 255) << 32) + ((long) (read() & 255) << 24) + ((read() & 255) << 16) + ((read() & 255) << 8) + (read() & 255); } }