BufFileInput.cpp
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:2k
源码类别:

编译器/解释器

开发平台:

Others

  1. // FILE:        BufFileInput.cpp
  2. // AUTHOR:      Alexey Demakov (AVD) demakov@kazbek.ispras.ru
  3. // CREATION:    26-JAN-1998
  4. // DESCRIPTION: File Input Stream with lookahead for Scanner.
  5. //   See file BufFileInput.h for details
  6. // Change History:
  7. //
  8. //   22-Jun-1998    assert.h -> PCCTS_ASSERT_H
  9. //                  string.h -> PCCTS_STRING_H
  10. //
  11. //   28-May-1998    Add virtual destructor to release buffer.
  12. //
  13. //                  Add dummy definition for ANTLRTokenType
  14. //                  to allow compilation without knowing
  15. //                  token type codes.
  16. //
  17. //                  Manfred Kogler (km@cast.uni-linz.ac.at)
  18. //                  (1.33MR14)
  19. enum ANTLRTokenType {TER_HATES_CPP=0, SO_DO_OTHERS=9999 };
  20. #include "pcctscfg.h"
  21. #include PCCTS_ASSERT_H
  22. #include PCCTS_STRING_H
  23. PCCTS_NAMESPACE_STD
  24. #include "BufFileInput.h"
  25. BufFileInput::BufFileInput( FILE *f, int buf_size )
  26. : input( f ),
  27.   start( 0 ),
  28.   len( 0 ),
  29.   buf( new int[buf_size] ),
  30.   size( buf_size )
  31. {
  32. }
  33. BufFileInput::~BufFileInput()
  34. {
  35.   delete [] buf;
  36. }
  37. int BufFileInput::nextChar( void )
  38. {
  39.     if( len > 0 )
  40.     {
  41.         // get char from buffer
  42.         int c = buf[start];
  43.         if( c != EOF )
  44.         {
  45.             start++; start %= size;
  46.             len--;
  47.         }
  48.         return c;
  49.     } else {
  50.         // get char from file
  51.         int c = getc( input );
  52.         if( c == EOF )
  53.         {
  54.             // if EOF - put it in the buffer as indicator
  55.             buf[start] = EOF;
  56.             len++;
  57.         }
  58.         return c;
  59.     }
  60. }
  61. int BufFileInput::lookahead( char* s )
  62. {
  63.     int l = strlen( s );
  64.     assert( 0 < l && l <= size );
  65.     while( len < l )
  66.     {
  67.         int c = getc( input );
  68.         buf[ (start+len) % size ] = c;
  69.         len++;
  70.         if( c == EOF ) return 0;
  71.     }
  72.     for( int i = 0; i < l; i++ )
  73.     {
  74.         if( s[i] != buf[ (start+i) % size ] ) return 0;
  75.     }
  76.     return 1;
  77. }
  78. // End of file BufFileInput.cpp