home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 139 / dpcs0999.iso / Web / CFserver / data1.cab / Java / netscape / util / CompactOutputStream.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-12  |  4.2 KB  |  283 lines

  1. package netscape.util;
  2.  
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5.  
  6. public class CompactOutputStream extends OutputStream {
  7.    OutputStream out;
  8.    int booleanCount;
  9.    int booleanBuffer;
  10.    IdHashtable stringTable = new IdHashtable(true);
  11.    int stringCount = 2;
  12.  
  13.    public CompactOutputStream(OutputStream var1) {
  14.       this.out = var1;
  15.    }
  16.  
  17.    private final void flushBooleanBuffer() throws IOException {
  18.       if (this.booleanCount > 0) {
  19.          this.out.write(this.booleanBuffer);
  20.          this.booleanCount = 0;
  21.          this.booleanBuffer = 0;
  22.       }
  23.  
  24.    }
  25.  
  26.    public void write(int var1) throws IOException {
  27.       this.flushBooleanBuffer();
  28.       this.out.write(var1);
  29.    }
  30.  
  31.    public void write(byte[] var1) throws IOException {
  32.       this.flushBooleanBuffer();
  33.       this.out.write(var1, 0, var1.length);
  34.    }
  35.  
  36.    public void write(byte[] var1, int var2, int var3) throws IOException {
  37.       this.flushBooleanBuffer();
  38.       this.out.write(var1, var2, var3);
  39.    }
  40.  
  41.    public void flush() throws IOException {
  42.       this.flushBooleanBuffer();
  43.       this.out.flush();
  44.    }
  45.  
  46.    public void close() throws IOException {
  47.       this.flushBooleanBuffer();
  48.       this.out.close();
  49.    }
  50.  
  51.    public void writeCompactBoolean(boolean var1) throws IOException {
  52.       int var3 = this.booleanCount;
  53.       if (var1) {
  54.          int var2 = this.booleanBuffer;
  55.          var2 |= 1 << var3;
  56.          ++var3;
  57.          if (var3 >= 8) {
  58.             this.out.write(var2);
  59.             this.booleanCount = 0;
  60.             this.booleanBuffer = 0;
  61.          } else {
  62.             this.booleanCount = var3;
  63.             this.booleanBuffer = var2;
  64.          }
  65.       } else {
  66.          ++var3;
  67.          if (var3 >= 8) {
  68.             this.out.write(this.booleanBuffer);
  69.             this.booleanCount = 0;
  70.             this.booleanBuffer = 0;
  71.          } else {
  72.             this.booleanCount = var3;
  73.          }
  74.       }
  75.    }
  76.  
  77.    public void writeBoolean(boolean var1) throws IOException {
  78.       if (var1) {
  79.          this.out.write(1);
  80.       } else {
  81.          this.out.write(0);
  82.       }
  83.    }
  84.  
  85.    public void writeByte(int var1) throws IOException {
  86.       this.flushBooleanBuffer();
  87.       this.out.write(var1);
  88.    }
  89.  
  90.    public void writeShort(int var1) throws IOException {
  91.       OutputStream var2 = this.out;
  92.       this.flushBooleanBuffer();
  93.       var2.write(var1 >>> 8 & 255);
  94.       var2.write(var1 & 255);
  95.    }
  96.  
  97.    public void writeChar(int var1) throws IOException {
  98.       OutputStream var2 = this.out;
  99.       this.flushBooleanBuffer();
  100.       var2.write(var1 >>> 8 & 255);
  101.       var2.write(var1 & 255);
  102.    }
  103.  
  104.    public void writeCompactInt(int var1) throws IOException {
  105.       OutputStream var2 = this.out;
  106.       this.flushBooleanBuffer();
  107.       if (var1 < 0) {
  108.          if (var1 == Integer.MIN_VALUE) {
  109.             var2.write(64);
  110.             return;
  111.          }
  112.  
  113.          var1 = -var1;
  114.          if (var1 < 64) {
  115.             var2.write(var1 | 64);
  116.             return;
  117.          }
  118.  
  119.          var2.write(var1 & 255 | 192);
  120.       } else {
  121.          if (var1 < 64) {
  122.             var2.write(var1);
  123.             return;
  124.          }
  125.  
  126.          var2.write(var1 & 63 | 128);
  127.       }
  128.  
  129.       var1 >>>= 6;
  130.       if (var1 < 128) {
  131.          var2.write(var1);
  132.       } else {
  133.          var2.write(var1 & 255 | 128);
  134.          var1 >>>= 7;
  135.          if (var1 < 128) {
  136.             var2.write(var1);
  137.          } else {
  138.             var2.write(var1 & 255 | 128);
  139.             var1 >>>= 7;
  140.             if (var1 < 128) {
  141.                var2.write(var1);
  142.             } else {
  143.                var2.write(var1 & 255 | 128);
  144.                var1 >>>= 7;
  145.                if (var1 > 0) {
  146.                   var2.write(var1);
  147.                }
  148.  
  149.             }
  150.          }
  151.       }
  152.    }
  153.  
  154.    public void writeInt(int var1) throws IOException {
  155.       OutputStream var2 = this.out;
  156.       this.flushBooleanBuffer();
  157.       var2.write(var1 >>> 24 & 255);
  158.       var2.write(var1 >>> 16 & 255);
  159.       var2.write(var1 >>> 8 & 255);
  160.       var2.write(var1 & 255);
  161.    }
  162.  
  163.    public void writeLong(long var1) throws IOException {
  164.       OutputStream var3 = this.out;
  165.       this.flushBooleanBuffer();
  166.       var3.write((int)(var1 >>> 56) & 255);
  167.       var3.write((int)(var1 >>> 48) & 255);
  168.       var3.write((int)(var1 >>> 40) & 255);
  169.       var3.write((int)(var1 >>> 32) & 255);
  170.       var3.write((int)(var1 >>> 24) & 255);
  171.       var3.write((int)(var1 >>> 16) & 255);
  172.       var3.write((int)(var1 >>> 8) & 255);
  173.       var3.write((int)var1 & 255);
  174.    }
  175.  
  176.    public void writeFloat(float var1) throws IOException {
  177.       this.writeInt(Float.floatToIntBits(var1));
  178.    }
  179.  
  180.    public void writeDouble(double var1) throws IOException {
  181.       this.writeLong(Double.doubleToLongBits(var1));
  182.    }
  183.  
  184.    public void writeBytes(String var1) throws IOException {
  185.       OutputStream var4 = this.out;
  186.       this.flushBooleanBuffer();
  187.       int var3 = var1.length();
  188.  
  189.       for(int var2 = 0; var2 < var3; ++var2) {
  190.          var4.write((byte)var1.charAt(var2));
  191.       }
  192.  
  193.    }
  194.  
  195.    public void writeChars(String var1) throws IOException {
  196.       OutputStream var5 = this.out;
  197.       this.flushBooleanBuffer();
  198.       int var3 = var1.length();
  199.  
  200.       for(int var2 = 0; var2 < var3; ++var2) {
  201.          char var4 = var1.charAt(var2);
  202.          var5.write(var4 >>> 8 & 255);
  203.          var5.write(var4 & 255);
  204.       }
  205.  
  206.    }
  207.  
  208.    public void writeCompactUTF(String var1) throws IOException {
  209.       if (var1 == null) {
  210.          this.writeCompactInt(0);
  211.       } else if (var1.length() == 0) {
  212.          this.writeCompactInt(1);
  213.       } else {
  214.          int var2 = this.stringTable.get(var1);
  215.          if (var2 == 0) {
  216.             var2 = this.stringCount++;
  217.             this.stringTable.putKnownAbsent(var1, var2);
  218.             int var3 = this.utfLength(var1);
  219.             this.writeCompactInt(-var3);
  220.             this.writeUTFBytes(var1);
  221.          } else {
  222.             this.writeCompactInt(var2);
  223.          }
  224.       }
  225.    }
  226.  
  227.    public void writeUTF(String var1) throws IOException {
  228.       OutputStream var3 = this.out;
  229.       this.flushBooleanBuffer();
  230.       if (var1 == null) {
  231.          var3.write(255);
  232.          var3.write(255);
  233.       } else {
  234.          int var2 = this.utfLength(var1);
  235.          if (var2 >= 65535) {
  236.             throw new IOException("string too long");
  237.          } else {
  238.             var3.write(var2 >>> 8 & 255);
  239.             var3.write(var2 & 255);
  240.             this.writeUTFBytes(var1);
  241.          }
  242.       }
  243.    }
  244.  
  245.    private final int utfLength(String var1) {
  246.       int var4 = var1.length();
  247.       int var5 = 0;
  248.  
  249.       for(int var2 = 0; var2 < var4; ++var2) {
  250.          char var3 = var1.charAt(var2);
  251.          if (var3 >= 1 && var3 <= 127) {
  252.             ++var5;
  253.          } else if (var3 > 2047) {
  254.             var5 += 3;
  255.          } else {
  256.             var5 += 2;
  257.          }
  258.       }
  259.  
  260.       return var5;
  261.    }
  262.  
  263.    private final void writeUTFBytes(String var1) throws IOException {
  264.       OutputStream var5 = this.out;
  265.       int var4 = var1.length();
  266.  
  267.       for(int var2 = 0; var2 < var4; ++var2) {
  268.          char var3 = var1.charAt(var2);
  269.          if (var3 >= 1 && var3 <= 127) {
  270.             var5.write(var3);
  271.          } else if (var3 > 2047) {
  272.             var5.write(224 | var3 >> 12 & 15);
  273.             var5.write(128 | var3 >> 6 & 63);
  274.             var5.write(128 | var3 & 63);
  275.          } else {
  276.             var5.write(192 | var3 >> 6 & 31);
  277.             var5.write(128 | var3 & 63);
  278.          }
  279.       }
  280.  
  281.    }
  282. }
  283.