package lcm.lcm; import java.io.*; public final class LCMDataOutputStream implements DataOutput { byte buf[]; int pos; public LCMDataOutputStream() { this(512); } public LCMDataOutputStream(int sz) { this.buf = new byte[sz]; } public LCMDataOutputStream(byte buf[]) { this.buf = buf; } public void reset() { pos = 0; } void ensureSpace(int needed) { if (pos+needed >= buf.length) { // compute new power-of-two capacity int newlen = buf.length; while (newlen < pos+needed) newlen *= 2; byte buf2[] = new byte[newlen]; System.arraycopy(buf, 0, buf2, 0, pos); buf = buf2; } } public void write(byte b[]) { ensureSpace(b.length); System.arraycopy(b, 0, buf, pos, b.length); pos += b.length; } public void write(byte b[], int off, int len) { ensureSpace(len); System.arraycopy(b, off, buf, pos, len); pos += len; } /** Writes one byte per char **/ public void writeCharsAsBytes(char c[]) { ensureSpace(c.length); for (int i = 0; i < c.length; i++) write(c[i]); } public void write(int b) { ensureSpace(1); buf[pos++] = (byte) b; } public void writeBoolean(boolean v) { ensureSpace(1); buf[pos++] = v ? (byte) 1 : (byte) 0; } public void writeByte(int v) { ensureSpace(1); buf[pos++] = (byte) v; } public void writeBytes(String s) { ensureSpace(s.length()); for (int i = 0; i < s.length(); i++) { buf[pos++] = (byte) s.charAt(i); } } public void writeChar(int v) { writeShort(v); } public void writeChars(String s) { ensureSpace(2*s.length()); for (int i = 0; i < s.length(); i++) { int v = s.charAt(i); buf[pos++] = (byte) (v>>>8); buf[pos++] = (byte) (v>>>0); } } /** Write a zero-terminated string consisting of 8 bit characters. **/ public void writeStringZ(String s) { ensureSpace(s.length()+1); for (int i = 0; i < s.length(); i++) { buf[pos++] = (byte) s.charAt(i); } buf[pos++] = 0; } public void writeDouble(double v) { writeLong(Double.doubleToLongBits(v)); } public void writeFloat(float v) { writeInt(Float.floatToIntBits(v)); } public void writeInt(int v) { ensureSpace(4); buf[pos++] = (byte) (v>>>24); buf[pos++] = (byte) (v>>>16); buf[pos++] = (byte) (v>>>8); buf[pos++] = (byte) (v>>>0); } public void writeLong(long v) { ensureSpace(8); buf[pos++] = (byte) (v>>>56); buf[pos++] = (byte) (v>>>48); buf[pos++] = (byte) (v>>>40); buf[pos++] = (byte) (v>>>32); buf[pos++] = (byte) (v>>>24); buf[pos++] = (byte) (v>>>16); buf[pos++] = (byte) (v>>>8); buf[pos++] = (byte) (v>>>0); } public void writeShort(int v) { ensureSpace(2); buf[pos++] = (byte) (v>>>8); buf[pos++] = (byte) (v>>>0); } public void writeUTF(String s) { assert(false); } /** Makes a copy of the internal buffer. **/ public byte[] toByteArray() { byte b[] = new byte[pos]; System.arraycopy(buf, 0, b, 0, pos); return b; } /** Returns the internal buffer, which may be longer than the * buffer that has been written to so far. **/ public byte[] getBuffer() { return buf; } /** Get the number of bytes that have been written to the buffer. **/ public int size() { return pos; } }