// FILE: BufFileInput.cpp // AUTHOR: Alexey Demakov (AVD) demakov@kazbek.ispras.ru // CREATION: 26-JAN-1998 // DESCRIPTION: File Input Stream with lookahead for Scanner. // See file BufFileInput.h for details // Change History: // // 22-Jun-1998 assert.h -> PCCTS_ASSERT_H // string.h -> PCCTS_STRING_H // // 28-May-1998 Add virtual destructor to release buffer. // // Add dummy definition for ANTLRTokenType // to allow compilation without knowing // token type codes. // // Manfred Kogler (km@cast.uni-linz.ac.at) // (1.33MR14) // // 20-Jul-1998 MR14a - Reorder initialization list for ctor. // enum ANTLRTokenType {TER_HATES_CPP=0, SO_DO_OTHERS=9999 }; #include "pcctscfg.h" #include "pccts_assert.h" #include "pccts_string.h" PCCTS_NAMESPACE_STD #include "BufFileInput.h" BufFileInput::BufFileInput( FILE *f, int buf_size ) : input( f ), buf( new int[buf_size] ), size( buf_size ), start( 0 ), len( 0 ) { } BufFileInput::~BufFileInput() { delete [] buf; } int BufFileInput::nextChar( void ) { if( len > 0 ) { // get char from buffer int c = buf[start]; if( c != EOF ) { start++; start %= size; len--; } return c; } else { // get char from file int c = getc( input ); if( c == EOF ) { // if EOF - put it in the buffer as indicator buf[start] = EOF; len++; } return c; } } int BufFileInput::lookahead( char* s ) { int l = strlen( s ); assert( 0 < l && l <= size ); while( len < l ) { int c = getc( input ); buf[ (start+len) % size ] = c; len++; if( c == EOF ) return 0; } for( int i = 0; i < l; i++ ) { if( s[i] != buf[ (start+i) % size ] ) return 0; } return 1; } // End of file BufFileInput.cpp