FileDocCategorySizeDatePackage
FastCharStream.javaAPI DocApache Lucene 1.4.33522Tue Mar 30 00:48:02 BST 2004org.apache.lucene.analysis.standard

FastCharStream

public final class FastCharStream extends Object implements CharStream
An efficient implementation of JavaCC's CharStream interface.

Note that this does not do line-number counting, but instead keeps track of the character position of the token in the input, as required by Lucene's {@link org.apache.lucene.analysis.Token} API.

Fields Summary
char[]
buffer
int
bufferLength
int
bufferPosition
int
tokenStart
int
bufferStart
Reader
input
Constructors Summary
public FastCharStream(Reader r)
Constructs from a Reader.

					  // source of chars

       
     
    input = r;
  
Methods Summary
public final charBeginToken()

    tokenStart = bufferPosition;
    return readChar();
  
public final voidDone()

    try {
      input.close();
    } catch (IOException e) {
      System.err.println("Caught: " + e + "; ignoring.");
    }
  
public final java.lang.StringGetImage()

    return new String(buffer, tokenStart, bufferPosition - tokenStart);
  
public final char[]GetSuffix(int len)

    char[] value = new char[len];
    System.arraycopy(buffer, bufferPosition - len, value, 0, len);
    return value;
  
public final voidbackup(int amount)

    bufferPosition -= amount;
  
public final intgetBeginColumn()

    return bufferStart + tokenStart;
  
public final intgetBeginLine()

    return 1;
  
public final intgetColumn()

    return bufferStart + bufferPosition;
  
public final intgetEndColumn()

    return bufferStart + bufferPosition;
  
public final intgetEndLine()

    return 1;
  
public final intgetLine()

    return 1;
  
public final charreadChar()

    if (bufferPosition >= bufferLength)
      refill();
    return buffer[bufferPosition++];
  
private final voidrefill()

    int newPosition = bufferLength - tokenStart;

    if (tokenStart == 0) {			  // token won't fit in buffer
      if (buffer == null) {			  // first time: alloc buffer
	buffer = new char[2048];		  
      } else if (bufferLength == buffer.length) { // grow buffer
	char[] newBuffer = new char[buffer.length*2];
	System.arraycopy(buffer, 0, newBuffer, 0, bufferLength);
	buffer = newBuffer;
      }
    } else {					  // shift token to front
      System.arraycopy(buffer, tokenStart, buffer, 0, newPosition);
    }

    bufferLength = newPosition;			  // update state
    bufferPosition = newPosition;
    bufferStart += tokenStart;
    tokenStart = 0;

    int charsRead =				  // fill space in buffer
      input.read(buffer, newPosition, buffer.length-newPosition);
    if (charsRead == -1)
      throw new IOException("read past eof");
    else
      bufferLength += charsRead;