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