mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 12:54:17 +00:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// 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
 | 
						|
 |