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