home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / APCHSSL2.ZIP / OS2HTTPD / jserv / com / netscape / javascript / LineBuffer.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-09  |  3.0 KB  |  233 lines

  1. package com.netscape.javascript;
  2.  
  3. import java.io.IOException;
  4. import java.io.Reader;
  5.  
  6. final class LineBuffer {
  7.    static final int BUFLEN = 256;
  8.    // $FF: renamed from: in java.io.Reader
  9.    private Reader field_0;
  10.    private char[] otherBuffer = null;
  11.    private char[] buffer = null;
  12.    private int offset = 0;
  13.    private int end = 0;
  14.    private int otherEnd;
  15.    private int lineno;
  16.    private int lineStart = 0;
  17.    private int otherStart = 0;
  18.    private int prevStart = 0;
  19.    private boolean lastWasCR = false;
  20.    private boolean hitEOF = false;
  21.    private int stringStart = -1;
  22.    private StringBuffer stringSoFar = null;
  23.  
  24.    String getLine() {
  25.       StringBuffer var1 = new StringBuffer();
  26.       int var2 = this.lineStart;
  27.       if (var2 >= this.offset) {
  28.          if (this.otherStart < this.otherEnd) {
  29.             var1.append(this.otherBuffer, this.otherStart, this.otherEnd - this.otherStart);
  30.          }
  31.  
  32.          var2 = 0;
  33.       }
  34.  
  35.       var1.append(this.buffer, var2, this.offset - var2);
  36.       int var3 = this.offset;
  37.  
  38.       while(true) {
  39.          if (var3 == this.buffer.length) {
  40.             char[] var4 = new char[this.buffer.length * 2];
  41.             System.arraycopy(this.buffer, 0, var4, 0, this.buffer.length);
  42.             this.buffer = var4;
  43.             int var5 = 0;
  44.  
  45.             try {
  46.                var5 = this.field_0.read(this.buffer, this.end, this.buffer.length - this.end);
  47.             } catch (IOException var6) {
  48.             }
  49.  
  50.             if (var5 < 0) {
  51.                break;
  52.             }
  53.  
  54.             this.end += var5;
  55.          }
  56.  
  57.          if (this.buffer[var3] == '\r' || this.buffer[var3] == '\n') {
  58.             break;
  59.          }
  60.  
  61.          ++var3;
  62.       }
  63.  
  64.       var1.append(this.buffer, this.offset, var3 - this.offset);
  65.       return var1.toString();
  66.    }
  67.  
  68.    void unread() {
  69.       if (this.offset != 0) {
  70.          this.offset += -1;
  71.          if ((this.buffer[this.offset] & '\ufff0') == 0 && (this.buffer[this.offset] == '\r' || this.buffer[this.offset] == '\n')) {
  72.             this.lineStart = this.prevStart;
  73.             this.lineno += -1;
  74.          }
  75.  
  76.       }
  77.    }
  78.  
  79.    LineBuffer(Reader var1, int var2) {
  80.       this.field_0 = var1;
  81.       this.lineno = var2;
  82.    }
  83.  
  84.    int read() throws IOException {
  85.       if (this.end == this.offset && !this.fill()) {
  86.          return -1;
  87.       } else if ((this.buffer[this.offset] & '\ufff0') == 0) {
  88.          if (this.buffer[this.offset] == '\r') {
  89.             if (this.offset + 1 < this.end) {
  90.                if (this.buffer[this.offset + 1] == '\n') {
  91.                   ++this.offset;
  92.                }
  93.             } else {
  94.                this.lastWasCR = true;
  95.             }
  96.          } else if (this.buffer[this.offset] != '\n') {
  97.             return this.buffer[this.offset++];
  98.          }
  99.  
  100.          ++this.offset;
  101.          this.prevStart = this.lineStart;
  102.          this.lineStart = this.offset;
  103.          ++this.lineno;
  104.          return 10;
  105.       } else {
  106.          return this.buffer[this.offset++];
  107.       }
  108.    }
  109.  
  110.    int peek() throws IOException {
  111.       if (this.end == this.offset && !this.fill()) {
  112.          return -1;
  113.       } else {
  114.          return this.buffer[this.offset] == '\r' ? 10 : this.buffer[this.offset];
  115.       }
  116.    }
  117.  
  118.    void startString() {
  119.       if (this.offset == 0) {
  120.          if (this.buffer != null && this.otherBuffer != null) {
  121.             this.stringSoFar = new StringBuffer();
  122.             this.stringSoFar.append(this.otherBuffer, this.otherEnd - 1, 1);
  123.             this.stringStart = -1;
  124.          } else {
  125.             throw new RuntimeException("startString called before any read");
  126.          }
  127.       } else {
  128.          this.stringSoFar = null;
  129.          this.stringStart = this.offset - 1;
  130.       }
  131.    }
  132.  
  133.    String getString() {
  134.       if (this.buffer == null) {
  135.          throw new RuntimeException("very confused");
  136.       } else {
  137.          int var2 = this.offset > 0 && this.buffer[this.offset] == '\n' && this.buffer[this.offset - 1] == '\r' ? 1 : 0;
  138.          String var1;
  139.          if (this.stringStart != -1) {
  140.             if (this.stringSoFar != null) {
  141.                throw new RuntimeException("getString called inconsistently");
  142.             }
  143.  
  144.             var1 = new String(this.buffer, this.stringStart, this.offset - this.stringStart - var2);
  145.          } else {
  146.             if (this.stringSoFar == null) {
  147.                throw new RuntimeException("getString called at a funny time");
  148.             }
  149.  
  150.             var1 = this.stringSoFar.append(this.buffer, 0, this.offset - var2).toString();
  151.          }
  152.  
  153.          this.stringStart = -1;
  154.          this.stringSoFar = null;
  155.          return var1;
  156.       }
  157.    }
  158.  
  159.    boolean fill() throws IOException {
  160.       if (this.end - this.offset != 0) {
  161.          throw new IOException("fill of non-empty buffer");
  162.       } else {
  163.          int var1 = this.offset > 0 && this.lastWasCR ? 1 : 0;
  164.          if (this.stringStart != -1) {
  165.             if (this.stringSoFar != null || this.buffer == null) {
  166.                throw new RuntimeException("as usual, I'm confused");
  167.             }
  168.  
  169.             this.stringSoFar = new StringBuffer();
  170.             this.stringSoFar.append(this.buffer, this.stringStart, this.end - this.stringStart - var1);
  171.             this.stringStart = -1;
  172.          } else if (this.stringSoFar != null) {
  173.             this.stringSoFar.append(this.buffer, 0, this.end - var1);
  174.          }
  175.  
  176.          char[] var2 = this.buffer;
  177.          this.buffer = this.otherBuffer;
  178.          this.otherBuffer = var2;
  179.          if (this.buffer == null) {
  180.             this.buffer = new char[256];
  181.          }
  182.  
  183.          this.otherStart = this.lineStart;
  184.          this.otherEnd = this.end;
  185.          this.prevStart = this.lineStart = this.otherBuffer == null ? 0 : this.buffer.length + 1;
  186.          this.offset = 0;
  187.          this.end = this.field_0.read(this.buffer, 0, this.buffer.length);
  188.          if (this.end < 0) {
  189.             this.end = 0;
  190.             this.hitEOF = true;
  191.             return false;
  192.          } else {
  193.             if (this.lastWasCR) {
  194.                if (this.buffer[0] == '\n') {
  195.                   ++this.offset;
  196.                   if (this.end == 1) {
  197.                      return this.fill();
  198.                   }
  199.                }
  200.  
  201.                this.lineStart = this.offset;
  202.                this.lastWasCR = false;
  203.             }
  204.  
  205.             return true;
  206.          }
  207.       }
  208.    }
  209.  
  210.    boolean eof() {
  211.       return this.hitEOF;
  212.    }
  213.  
  214.    boolean match(char var1) throws IOException {
  215.       if (this.end == this.offset && !this.fill()) {
  216.          return false;
  217.       } else if (this.buffer[this.offset] == var1) {
  218.          ++this.offset;
  219.          return true;
  220.       } else {
  221.          return false;
  222.       }
  223.    }
  224.  
  225.    int getLineno() {
  226.       return this.lineno;
  227.    }
  228.  
  229.    int getOffset() {
  230.       return this.lineStart >= this.offset ? this.offset + (this.otherEnd - this.otherStart) : this.offset - this.lineStart;
  231.    }
  232. }
  233.