blob: 20a1ba03d5df45ab4f4117dc5ec0f0933dc65b11 [file] [log] [blame]
/*------------------------------------------------------------------------------
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
*
* Distributable under the terms of either the Apache License (Version 2.0) or
* the GNU Lesser General Public License, as specified in the COPYING file.
------------------------------------------------------------------------------*/
#include "CLucene/StdHeader.h"
#include "FastCharStream.h"
#include "CLucene/util/Reader.h"
CL_NS_DEF(util)
const int32_t FastCharStream::maxRewindSize = LUCENE_MAX_WORD_LEN*2;
FastCharStream::FastCharStream(Reader* reader):
pos(0),
rewindPos(0),
resetPos(0),
col(1),
line(1),
input(reader)
{
input->mark(maxRewindSize);
}
FastCharStream::~FastCharStream(){
}
void FastCharStream::readChar(TCHAR &c) {
try{
int32_t r = input->read();
if ( r == -1 )
input = NULL;
c = r;
}catch(CLuceneError& err){
if ( err.number() == CL_ERR_IO )
input = 0;
throw err;
}
}
int FastCharStream::GetNext()
{
// printf("getnext\n");
if (input == 0 ) // end of file
{
_CLTHROWA(CL_ERR_IO,"warning : FileReader.GetNext : Read TCHAR over EOS.");
}
// this is rather inefficient
// implementing the functions from the java version of
// charstream will be much more efficient.
++pos;
if ( pos > resetPos + maxRewindSize && rewindPos == 0) {
// move the marker one position (~expensive)
resetPos = pos-(maxRewindSize/2);
if ( resetPos != input->reset(resetPos) )
_CLTHROWA(CL_ERR_IO,"Unexpected reset() result");
input->mark(maxRewindSize);
input->skip((maxRewindSize/2) - 1);
}
TCHAR ch;
readChar(ch);
if (input == NULL) { // eof
return -1;
}
if (rewindPos == 0) {
col += 1;
if(ch == '\n') {
line++;
col = 1;
}
} else {
rewindPos--;
}
return ch;
}
void FastCharStream::UnGet(){
// printf("UnGet \n");
if (input == 0)
return;
if ( pos == 0 ) {
_CLTHROWA(CL_ERR_IO,"error : No character can be UnGet");
}
rewindPos++;
input->reset(pos-1);
pos--;
}
int FastCharStream::Peek() {
int c = GetNext();
UnGet();
return c;
}
bool FastCharStream::Eos() const {
return input==NULL;
}
int32_t FastCharStream::Column() const {
return col;
}
int32_t FastCharStream::Line() const {
return line;
}
CL_NS_END