blob: 402f470de9fc3914625f91c5cc702b4d5c540e02 [file] [log] [blame]
package org.eclipse.jface.text.rules;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.util.Assert;
/**
* A buffered rule based scanner. The buffer always contains a section
* of a fixed size of the document to be scanned.
*/
public class BufferedRuleBasedScanner extends RuleBasedScanner {
private final static int DEFAULT_BUFFER_SIZE= 500;
private int fBufferSize= DEFAULT_BUFFER_SIZE;
private char[] fBuffer;
private int fStart;
private int fEnd;
private int fDocumentLength;
/**
* Creates a new buffered rule based scanner which does
* not have any rule and a default buffer size of 500 characters.
*/
protected BufferedRuleBasedScanner() {
super();
}
/**
* Creates a new buffered rule based scanner which does
* not have any rule. The buffer size is set to the given
* number of characters.
*
* @param size the buffer size
*/
public BufferedRuleBasedScanner(int size) {
super();
setBufferSize(size);
}
/*
* @see RuleBasedScanner#read
*/
public int read() {
if (fOffset >= fRangeEnd) {
++ fOffset;
return EOF;
}
if (fOffset == fEnd)
shiftBuffer(fEnd);
return fBuffer[fOffset++ - fStart];
}
/**
* Sets the buffer to the given number of characters.
*
* @param size the buffer size
*/
protected void setBufferSize(int size) {
Assert.isTrue(size > 0);
fBufferSize= size;
}
/*
* @see RuleBasedScanner#setRange
*/
public void setRange(IDocument document, int offset, int length) {
super.setRange(document, offset, length);
fDocumentLength= document.getLength();
shiftBuffer(offset);
}
/**
* Shifts the buffer so that the buffer starts at the
* given document offset.
*
* @param offset the document offset at which the buffer starts
*/
private void shiftBuffer(int offset) {
fStart= offset;
fEnd= fStart + fBufferSize;
if (fEnd > fDocumentLength)
fEnd= fDocumentLength;
try {
String content= fDocument.get(fStart, fEnd - fStart);
fBuffer= content.toCharArray();
} catch (BadLocationException x) {
}
}
/*
* @see RuleBasedScanner#unread
*/
public void unread() {
if (fOffset == fStart)
shiftBuffer(Math.max(0, fStart - (fBufferSize / 2)));
-- fOffset;
}
}