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