home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 March / pcp161a.iso / handson / files / copyjava.exe / com / sun / java / swing / text / html / ReaderCharStream.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-02-26  |  4.3 KB  |  242 lines

  1. package com.sun.java.swing.text.html;
  2.  
  3. import java.io.IOException;
  4. import java.io.Reader;
  5.  
  6. final class ReaderCharStream implements CharStream {
  7.    public static final boolean staticFlag = false;
  8.    int bufsize;
  9.    int available;
  10.    int tokenBegin;
  11.    public int bufpos;
  12.    private int[] bufline;
  13.    private int[] bufcolumn;
  14.    private int column;
  15.    private int line;
  16.    private boolean prevCharIsCR;
  17.    private boolean prevCharIsLF;
  18.    private Reader reader;
  19.    private char[] buffer;
  20.    private int maxNextCharInd;
  21.    private int inBuf;
  22.  
  23.    private final void ExpandBuff(boolean var1) {
  24.       char[] var2 = new char[this.bufsize + 2048];
  25.       int[] var3 = new int[this.bufsize + 2048];
  26.       int[] var4 = new int[this.bufsize + 2048];
  27.  
  28.       try {
  29.          if (var1) {
  30.             System.arraycopy(this.buffer, this.tokenBegin, var2, 0, this.bufsize - this.tokenBegin);
  31.             System.arraycopy(this.buffer, 0, var2, this.bufsize - this.tokenBegin, this.bufpos);
  32.             this.buffer = var2;
  33.             System.arraycopy(this.bufline, this.tokenBegin, var3, 0, this.bufsize - this.tokenBegin);
  34.             System.arraycopy(this.bufline, 0, var3, this.bufsize - this.tokenBegin, this.bufpos);
  35.             this.bufline = var3;
  36.             System.arraycopy(this.bufcolumn, this.tokenBegin, var4, 0, this.bufsize - this.tokenBegin);
  37.             System.arraycopy(this.bufcolumn, 0, var4, this.bufsize - this.tokenBegin, this.bufpos);
  38.             this.bufcolumn = var4;
  39.             this.maxNextCharInd = this.bufpos += this.bufsize - this.tokenBegin;
  40.          } else {
  41.             System.arraycopy(this.buffer, this.tokenBegin, var2, 0, this.bufsize - this.tokenBegin);
  42.             this.buffer = var2;
  43.             System.arraycopy(this.bufline, this.tokenBegin, var3, 0, this.bufsize - this.tokenBegin);
  44.             this.bufline = var3;
  45.             System.arraycopy(this.bufcolumn, this.tokenBegin, var4, 0, this.bufsize - this.tokenBegin);
  46.             this.bufcolumn = var4;
  47.             this.maxNextCharInd = this.bufpos -= this.tokenBegin;
  48.          }
  49.       } catch (Throwable var6) {
  50.          throw new Error(var6.getMessage());
  51.       }
  52.  
  53.       this.bufsize += 2048;
  54.       this.available = this.bufsize;
  55.       this.tokenBegin = 0;
  56.    }
  57.  
  58.    private final void FillBuff() throws IOException {
  59.       if (this.maxNextCharInd == this.available) {
  60.          if (this.available == this.bufsize) {
  61.             if (this.tokenBegin > 2048) {
  62.                this.bufpos = this.maxNextCharInd = 0;
  63.                this.available = this.tokenBegin;
  64.             } else if (this.tokenBegin < 0) {
  65.                this.bufpos = this.maxNextCharInd = 0;
  66.             } else {
  67.                this.ExpandBuff(false);
  68.             }
  69.          } else if (this.available > this.tokenBegin) {
  70.             this.available = this.bufsize;
  71.          } else if (this.tokenBegin - this.available < 2048) {
  72.             this.ExpandBuff(true);
  73.          } else {
  74.             this.available = this.tokenBegin;
  75.          }
  76.       }
  77.  
  78.       try {
  79.          int var1;
  80.          if ((var1 = this.reader.read(this.buffer, this.maxNextCharInd, this.available - this.maxNextCharInd)) == -1) {
  81.             this.reader.close();
  82.             throw new IOException();
  83.          } else {
  84.             this.maxNextCharInd += var1;
  85.          }
  86.       } catch (IOException var3) {
  87.          --this.bufpos;
  88.          this.backup(0);
  89.          if (this.tokenBegin == -1) {
  90.             this.tokenBegin = this.bufpos;
  91.          }
  92.  
  93.          throw var3;
  94.       }
  95.    }
  96.  
  97.    public final char BeginToken() throws IOException {
  98.       this.tokenBegin = -1;
  99.       char var1 = this.readChar();
  100.       this.tokenBegin = this.bufpos;
  101.       return var1;
  102.    }
  103.  
  104.    private final void UpdateLineColumn(char var1) {
  105.       ++this.column;
  106.       if (this.prevCharIsLF) {
  107.          this.prevCharIsLF = false;
  108.          this.line += this.column = 1;
  109.       } else if (this.prevCharIsCR) {
  110.          this.prevCharIsCR = false;
  111.          if (var1 == '\n') {
  112.             this.prevCharIsLF = true;
  113.          } else {
  114.             this.line += this.column = 1;
  115.          }
  116.       }
  117.  
  118.       switch (var1) {
  119.          case '\t':
  120.             this.column += 9 - (this.column & 7);
  121.             break;
  122.          case '\n':
  123.             this.prevCharIsLF = true;
  124.             break;
  125.          case '\r':
  126.             this.prevCharIsCR = true;
  127.       }
  128.  
  129.       this.bufline[this.bufpos] = this.line;
  130.       this.bufcolumn[this.bufpos] = this.column;
  131.    }
  132.  
  133.    public final char readChar() throws IOException {
  134.       if (this.inBuf > 0) {
  135.          --this.inBuf;
  136.          return this.buffer[this.bufpos == this.bufsize - 1 ? (this.bufpos = 0) : ++this.bufpos];
  137.       } else {
  138.          if (++this.bufpos >= this.maxNextCharInd) {
  139.             this.FillBuff();
  140.          }
  141.  
  142.          char var1 = this.buffer[this.bufpos];
  143.          this.UpdateLineColumn(var1);
  144.          return var1;
  145.       }
  146.    }
  147.  
  148.    /** @deprecated */
  149.    public final int getColumn() {
  150.       return this.bufcolumn[this.bufpos];
  151.    }
  152.  
  153.    /** @deprecated */
  154.    public final int getLine() {
  155.       return this.bufline[this.bufpos];
  156.    }
  157.  
  158.    public final int getEndColumn() {
  159.       return this.bufcolumn[this.bufpos];
  160.    }
  161.  
  162.    public final int getEndLine() {
  163.       return this.bufline[this.bufpos];
  164.    }
  165.  
  166.    public final int getBeginColumn() {
  167.       return this.bufcolumn[this.tokenBegin];
  168.    }
  169.  
  170.    public final int getBeginLine() {
  171.       return this.bufline[this.tokenBegin];
  172.    }
  173.  
  174.    public final void backup(int var1) {
  175.       this.inBuf += var1;
  176.       if ((this.bufpos -= var1) < 0) {
  177.          this.bufpos += this.bufsize;
  178.       }
  179.  
  180.    }
  181.  
  182.    public ReaderCharStream(Reader var1, int var2, int var3, int var4) {
  183.       this.bufpos = -1;
  184.       this.line = 1;
  185.       this.prevCharIsCR = false;
  186.       this.prevCharIsLF = false;
  187.       this.reader = var1;
  188.       this.line = var2;
  189.       this.column = var3 - 1;
  190.       this.available = this.bufsize = var4;
  191.       this.buffer = new char[var4];
  192.       this.bufline = new int[var4];
  193.       this.bufcolumn = new int[var4];
  194.    }
  195.  
  196.    public ReaderCharStream(Reader var1, int var2, int var3) {
  197.       this(var1, var2, var3, 4096);
  198.    }
  199.  
  200.    public void ReInit(Reader var1, int var2, int var3, int var4) {
  201.       this.reader = var1;
  202.       this.line = var2;
  203.       this.column = var3 - 1;
  204.       if (this.buffer == null || var4 != this.buffer.length) {
  205.          this.available = this.bufsize = var4;
  206.          this.buffer = new char[var4];
  207.          this.bufline = new int[var4];
  208.          this.bufcolumn = new int[var4];
  209.       }
  210.  
  211.       this.prevCharIsLF = this.prevCharIsCR = false;
  212.       this.tokenBegin = this.inBuf = this.maxNextCharInd = 0;
  213.       this.bufpos = -1;
  214.    }
  215.  
  216.    public void ReInit(Reader var1, int var2, int var3) {
  217.       this.ReInit(var1, var2, var3, 4096);
  218.    }
  219.  
  220.    public final String GetImage() {
  221.       return this.bufpos >= this.tokenBegin ? new String(this.buffer, this.tokenBegin, this.bufpos - this.tokenBegin + 1) : new String(this.buffer, this.tokenBegin, this.bufsize - this.tokenBegin) + new String(this.buffer, 0, this.bufpos + 1);
  222.    }
  223.  
  224.    public final char[] GetSuffix(int var1) {
  225.       char[] var2 = new char[var1];
  226.       if (this.bufpos + 1 >= var1) {
  227.          System.arraycopy(this.buffer, this.bufpos - var1 + 1, var2, 0, var1);
  228.       } else {
  229.          System.arraycopy(this.buffer, this.bufsize - (var1 - this.bufpos - 1), var2, 0, var1 - this.bufpos - 1);
  230.          System.arraycopy(this.buffer, 0, var2, var1 - this.bufpos - 1, this.bufpos + 1);
  231.       }
  232.  
  233.       return var2;
  234.    }
  235.  
  236.    public void Done() {
  237.       this.buffer = null;
  238.       this.bufline = null;
  239.       this.bufcolumn = null;
  240.    }
  241. }
  242.