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