home *** CD-ROM | disk | FTP | other *** search
- package netscape.util;
-
- import java.io.IOException;
- import java.io.OutputStream;
-
- public class CompactOutputStream extends OutputStream {
- OutputStream out;
- int booleanCount;
- int booleanBuffer;
- IdHashtable stringTable = new IdHashtable(true);
- int stringCount = 2;
-
- public CompactOutputStream(OutputStream var1) {
- this.out = var1;
- }
-
- private final void flushBooleanBuffer() throws IOException {
- if (this.booleanCount > 0) {
- this.out.write(this.booleanBuffer);
- this.booleanCount = 0;
- this.booleanBuffer = 0;
- }
-
- }
-
- public void write(int var1) throws IOException {
- this.flushBooleanBuffer();
- this.out.write(var1);
- }
-
- public void write(byte[] var1) throws IOException {
- this.flushBooleanBuffer();
- this.out.write(var1, 0, var1.length);
- }
-
- public void write(byte[] var1, int var2, int var3) throws IOException {
- this.flushBooleanBuffer();
- this.out.write(var1, var2, var3);
- }
-
- public void flush() throws IOException {
- this.flushBooleanBuffer();
- this.out.flush();
- }
-
- public void close() throws IOException {
- this.flushBooleanBuffer();
- this.out.close();
- }
-
- public void writeCompactBoolean(boolean var1) throws IOException {
- int var3 = this.booleanCount;
- if (var1) {
- int var2 = this.booleanBuffer;
- var2 |= 1 << var3;
- ++var3;
- if (var3 >= 8) {
- this.out.write(var2);
- this.booleanCount = 0;
- this.booleanBuffer = 0;
- } else {
- this.booleanCount = var3;
- this.booleanBuffer = var2;
- }
- } else {
- ++var3;
- if (var3 >= 8) {
- this.out.write(this.booleanBuffer);
- this.booleanCount = 0;
- this.booleanBuffer = 0;
- } else {
- this.booleanCount = var3;
- }
- }
- }
-
- public void writeBoolean(boolean var1) throws IOException {
- if (var1) {
- this.out.write(1);
- } else {
- this.out.write(0);
- }
- }
-
- public void writeByte(int var1) throws IOException {
- this.flushBooleanBuffer();
- this.out.write(var1);
- }
-
- public void writeShort(int var1) throws IOException {
- OutputStream var2 = this.out;
- this.flushBooleanBuffer();
- var2.write(var1 >>> 8 & 255);
- var2.write(var1 & 255);
- }
-
- public void writeChar(int var1) throws IOException {
- OutputStream var2 = this.out;
- this.flushBooleanBuffer();
- var2.write(var1 >>> 8 & 255);
- var2.write(var1 & 255);
- }
-
- public void writeCompactInt(int var1) throws IOException {
- OutputStream var2 = this.out;
- this.flushBooleanBuffer();
- if (var1 < 0) {
- if (var1 == Integer.MIN_VALUE) {
- var2.write(64);
- return;
- }
-
- var1 = -var1;
- if (var1 < 64) {
- var2.write(var1 | 64);
- return;
- }
-
- var2.write(var1 & 255 | 192);
- } else {
- if (var1 < 64) {
- var2.write(var1);
- return;
- }
-
- var2.write(var1 & 63 | 128);
- }
-
- var1 >>>= 6;
- if (var1 < 128) {
- var2.write(var1);
- } else {
- var2.write(var1 & 255 | 128);
- var1 >>>= 7;
- if (var1 < 128) {
- var2.write(var1);
- } else {
- var2.write(var1 & 255 | 128);
- var1 >>>= 7;
- if (var1 < 128) {
- var2.write(var1);
- } else {
- var2.write(var1 & 255 | 128);
- var1 >>>= 7;
- if (var1 > 0) {
- var2.write(var1);
- }
-
- }
- }
- }
- }
-
- public void writeInt(int var1) throws IOException {
- OutputStream var2 = this.out;
- this.flushBooleanBuffer();
- var2.write(var1 >>> 24 & 255);
- var2.write(var1 >>> 16 & 255);
- var2.write(var1 >>> 8 & 255);
- var2.write(var1 & 255);
- }
-
- public void writeLong(long var1) throws IOException {
- OutputStream var3 = this.out;
- this.flushBooleanBuffer();
- var3.write((int)(var1 >>> 56) & 255);
- var3.write((int)(var1 >>> 48) & 255);
- var3.write((int)(var1 >>> 40) & 255);
- var3.write((int)(var1 >>> 32) & 255);
- var3.write((int)(var1 >>> 24) & 255);
- var3.write((int)(var1 >>> 16) & 255);
- var3.write((int)(var1 >>> 8) & 255);
- var3.write((int)var1 & 255);
- }
-
- public void writeFloat(float var1) throws IOException {
- this.writeInt(Float.floatToIntBits(var1));
- }
-
- public void writeDouble(double var1) throws IOException {
- this.writeLong(Double.doubleToLongBits(var1));
- }
-
- public void writeBytes(String var1) throws IOException {
- OutputStream var4 = this.out;
- this.flushBooleanBuffer();
- int var3 = var1.length();
-
- for(int var2 = 0; var2 < var3; ++var2) {
- var4.write((byte)var1.charAt(var2));
- }
-
- }
-
- public void writeChars(String var1) throws IOException {
- OutputStream var5 = this.out;
- this.flushBooleanBuffer();
- int var3 = var1.length();
-
- for(int var2 = 0; var2 < var3; ++var2) {
- char var4 = var1.charAt(var2);
- var5.write(var4 >>> 8 & 255);
- var5.write(var4 & 255);
- }
-
- }
-
- public void writeCompactUTF(String var1) throws IOException {
- if (var1 == null) {
- this.writeCompactInt(0);
- } else if (var1.length() == 0) {
- this.writeCompactInt(1);
- } else {
- int var2 = this.stringTable.get(var1);
- if (var2 == 0) {
- var2 = this.stringCount++;
- this.stringTable.putKnownAbsent(var1, var2);
- int var3 = this.utfLength(var1);
- this.writeCompactInt(-var3);
- this.writeUTFBytes(var1);
- } else {
- this.writeCompactInt(var2);
- }
- }
- }
-
- public void writeUTF(String var1) throws IOException {
- OutputStream var3 = this.out;
- this.flushBooleanBuffer();
- if (var1 == null) {
- var3.write(255);
- var3.write(255);
- } else {
- int var2 = this.utfLength(var1);
- if (var2 >= 65535) {
- throw new IOException("string too long");
- } else {
- var3.write(var2 >>> 8 & 255);
- var3.write(var2 & 255);
- this.writeUTFBytes(var1);
- }
- }
- }
-
- private final int utfLength(String var1) {
- int var4 = var1.length();
- int var5 = 0;
-
- for(int var2 = 0; var2 < var4; ++var2) {
- char var3 = var1.charAt(var2);
- if (var3 >= 1 && var3 <= 127) {
- ++var5;
- } else if (var3 > 2047) {
- var5 += 3;
- } else {
- var5 += 2;
- }
- }
-
- return var5;
- }
-
- private final void writeUTFBytes(String var1) throws IOException {
- OutputStream var5 = this.out;
- int var4 = var1.length();
-
- for(int var2 = 0; var2 < var4; ++var2) {
- char var3 = var1.charAt(var2);
- if (var3 >= 1 && var3 <= 127) {
- var5.write(var3);
- } else if (var3 > 2047) {
- var5.write(224 | var3 >> 12 & 15);
- var5.write(128 | var3 >> 6 & 63);
- var5.write(128 | var3 & 63);
- } else {
- var5.write(192 | var3 >> 6 & 31);
- var5.write(128 | var3 & 63);
- }
- }
-
- }
- }
-