/*------------------------------------------------------------------------------ | |
* 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 |