/* Generated By:CSharpCC: Do not edit this charLine. SimpleCharStream.cs Version 3.3 */
/// <summary>
/// An implementation of interface CharStream, where the stream is assumed to
/// contain only ASCII characters (without unicode processing).
/// </summary>

public  class SimpleCharStream {
  public static readonly bool staticFlag = false;
  int bufsize;
  int available;
  int tokenBegin;
  public int bufpos = -1;
  protected int[] bufline;
  protected int[] bufcolumn;

  protected int charColumn = 0;
  protected int charLine = 1;

  protected bool prevCharIsCR = false;
  protected bool prevCharIsLF = false;

  protected System.IO.TextReader inputStream;

  protected char[] buffer;
  protected int maxNextCharInd = 0;
  protected int inBuf = 0;

  protected void ExpandBuff(bool wrapAround)
  {
     char[] newbuffer = new char[bufsize + 2048];
     int[] newbufline = new int[bufsize + 2048];
     int[] newbufcolumn = new int[bufsize + 2048];

     try {
        if (wrapAround) {
           System.Array.Copy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
           System.Array.Copy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
           buffer = newbuffer;

           System.Array.Copy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
           System.Array.Copy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
           bufline = newbufline;

           System.Array.Copy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
           System.Array.Copy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
           bufcolumn = newbufcolumn;

           maxNextCharInd = (bufpos += (bufsize - tokenBegin));
        } else {
           System.Array.Copy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
           buffer = newbuffer;

           System.Array.Copy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
           bufline = newbufline;

           System.Array.Copy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
           bufcolumn = newbufcolumn;

           maxNextCharInd = (bufpos -= tokenBegin);
        }
     } catch (System.Exception e) {
        throw new System.SystemException(e.Message);
     }


     bufsize += 2048;
     available = bufsize;
     tokenBegin = 0;
  }

  protected void FillBuff() {
     if (maxNextCharInd == available) {
        if (available == bufsize) {
           if (tokenBegin > 2048) {
              bufpos = maxNextCharInd = 0;
              available = tokenBegin;
           } else if (tokenBegin < 0)
              bufpos = maxNextCharInd = 0;
           else
              ExpandBuff(false);
        } else if (available > tokenBegin)
           available = bufsize;
        else if ((tokenBegin - available) < 2048)
           ExpandBuff(true);
        else
           available = tokenBegin;
     }

     int i;
     try {
        if ((i = inputStream.Read(buffer, maxNextCharInd,
                                    available - maxNextCharInd)) == -1) {
           inputStream.Close();
           throw new System.IO.IOException();
        } else
           maxNextCharInd += i;
        return;
     } catch(System.IO.IOException e) {
        --bufpos;
        Backup(0);
        if (tokenBegin == -1)
           tokenBegin = bufpos;
        throw e;
     }
  }

  public char BeginToken() {
     tokenBegin = -1;
     try {
         char c = ReadChar();
         tokenBegin = bufpos;
         return c;
     } catch (System.IO.EndOfStreamException e) {
         if (tokenBegin == -1)
             tokenBegin = bufpos;
         throw e;
     }
  }

  protected void UpdateLineColumn(char c) {
     charColumn++;

     if (prevCharIsLF) {
        prevCharIsLF = false;
        charLine += (charColumn = 1);
     } else if (prevCharIsCR) {
        prevCharIsCR = false;
        if (c == '\n') {
           prevCharIsLF = true;
        } else
           charLine += (charColumn = 1);
     }

     switch (c) {
        case '\r' :
           prevCharIsCR = true;
           break;
        case '\n' :
           prevCharIsLF = true;
           break;
        case '\t' :
           charColumn--;
           charColumn += (8 - (charColumn & 07));
           break;
        default :
           break;
     }

     bufline[bufpos] = charLine;
     bufcolumn[bufpos] = charColumn;
  }

  public char ReadChar() {
     if (inBuf > 0) {
        --inBuf;

        if (++bufpos == bufsize)
           bufpos = 0;

        return buffer[bufpos];
     }

     if (++bufpos >= maxNextCharInd)
        FillBuff();
     if (bufpos >= maxNextCharInd) {
        bufpos--;
        if (bufpos < 0)
            bufpos += bufsize;
        throw new System.IO.EndOfStreamException();
     }

     char c = buffer[bufpos];

     UpdateLineColumn(c);
     return (c);
  }

[System.Obsolete("Deprecated - use EndColumn instead.", false)]

  public int Column {
  get {
       return bufcolumn[bufpos];
    }
  }

[System.Obsolete("Deprecated - use EndLine instead.", false)]

  public int Line {
  get {
       return bufline[bufpos];
    }
  }

  public int EndColumn {
  get {
       return bufcolumn[bufpos];
    }
  }

  public int EndLine {
  get {
       return bufline[bufpos];
    }
  }

  public int BeginColumn {
  get {
       return bufcolumn[tokenBegin];
    }
  }

  public int BeginLine {
  get {
       return bufline[tokenBegin];
    }
  }

  public void Backup(int amount) {

    inBuf += amount;
    if ((bufpos -= amount) < 0)
       bufpos += bufsize;
  }

  public SimpleCharStream(System.IO.TextReader dstream, int startline,
  int startcolumn, int buffersize) {
    inputStream = dstream;
    charLine = startline;
    charColumn = startcolumn - 1;

    available = bufsize = buffersize;
    buffer = new char[buffersize];
    bufline = new int[buffersize];
    bufcolumn = new int[buffersize];
  }

  public SimpleCharStream(System.IO.TextReader dstream, int startline,
                                                           int startcolumn) : 
     this(dstream, startline, startcolumn, 4096) {
  }

  public SimpleCharStream(System.IO.TextReader dstream) :
     this(dstream, 1, 1, 4096) {
  }
  public void ReInit(System.IO.TextReader dstream, int startline,
  int startcolumn, int buffersize) {
    inputStream = dstream;
    charLine = startline;
    charColumn = startcolumn - 1;

    if (buffer == null || buffersize != buffer.Length) {
      available = bufsize = buffersize;
      buffer = new char[buffersize];
      bufline = new int[buffersize];
      bufcolumn = new int[buffersize];
    }
    prevCharIsLF = prevCharIsCR = false;
    tokenBegin = inBuf = maxNextCharInd = 0;
    bufpos = -1;
  }

  public void ReInit(System.IO.TextReader dstream, int startline,
                                                           int startcolumn) {
     ReInit(dstream, startline, startcolumn, 4096);
  }

  public void ReInit(System.IO.TextReader dstream) {
     ReInit(dstream, 1, 1, 4096);
  }
  public SimpleCharStream(System.IO.Stream dstream, int startline,
  int startcolumn, int buffersize) :
     this(new System.IO.StreamReader(dstream), startline, startcolumn, 4096) {
  }

  public SimpleCharStream(System.IO.Stream dstream, int startline,
                                                           int startcolumn) :
     this(dstream, startline, startcolumn, 4096) {
  }

  public SimpleCharStream(System.IO.Stream dstream) :
     this(dstream, 1, 1, 4096) {
  }

  public void ReInit(System.IO.Stream dstream, int startline,
                          int startcolumn, int buffersize) {
     ReInit(new System.IO.StreamReader(dstream), startline, startcolumn, 4096);
  }

  public void ReInit(System.IO.Stream dstream) {
     ReInit(dstream, 1, 1, 4096);
  }
  public void ReInit(System.IO.Stream dstream, int startline,
                                                           int startcolumn) {
     ReInit(dstream, startline, startcolumn, 4096);
  }
  public string GetImage() {
     if (bufpos >= tokenBegin)
        return new string(buffer, tokenBegin, bufpos - tokenBegin + 1);
     else
        return new string(buffer, tokenBegin, bufsize - tokenBegin) +
                              new string(buffer, 0, bufpos + 1);
  }

  public char[] GetSuffix(int len) {
     char[] ret = new char[len];

     if ((bufpos + 1) >= len)
        System.Array.Copy(buffer, bufpos - len + 1, ret, 0, len);
     else {
        System.Array.Copy(buffer, bufsize - (len - bufpos - 1), ret, 0,
                                                          len - bufpos - 1);
        System.Array.Copy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
     }

     return ret;
  }

  public void Done()
  {
     buffer = null;
     bufline = null;
     bufcolumn = null;
  }

  /// <summary>
  /// Method to adjust charLine and charColumn numbers for the start of a token.
  /// </summary>
  public void AdjustBeginLineColumn(int newLine, int newCol) {
     int start = tokenBegin;
     int len;

     if (bufpos >= tokenBegin) {
        len = bufpos - tokenBegin + inBuf + 1;
     } else {
        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
     }

     int i = 0, j = 0, k = 0;
     int nextColDiff = 0, columnDiff = 0;

     while (i < len &&
            bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) {
        bufline[j] = newLine;
        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
        bufcolumn[j] = newCol + columnDiff;
        columnDiff = nextColDiff;
        i++;
     } 

     if (i < len) {
        bufline[j] = newLine++;
        bufcolumn[j] = newCol + columnDiff;

        while (i++ < len) {
           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
              bufline[j] = newLine++;
           else
              bufline[j] = newLine;
        }
     }

     charLine = bufline[j];
     charColumn = bufcolumn[j];
  }

}
