summaryrefslogtreecommitdiffstats
path: root/src/misc/extra/extraUtilReader.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2007-10-01 08:01:00 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2007-10-01 08:01:00 -0700
commit4812c90424dfc40d26725244723887a2d16ddfd9 (patch)
treeb32ace96e7e2d84d586e09ba605463b6f49c3271 /src/misc/extra/extraUtilReader.c
parente54d9691616b9a0326e2fdb3156bb4eeb8abfcd7 (diff)
downloadabc-4812c90424dfc40d26725244723887a2d16ddfd9.tar.gz
abc-4812c90424dfc40d26725244723887a2d16ddfd9.tar.bz2
abc-4812c90424dfc40d26725244723887a2d16ddfd9.zip
Version abc71001
Diffstat (limited to 'src/misc/extra/extraUtilReader.c')
-rw-r--r--src/misc/extra/extraUtilReader.c383
1 files changed, 383 insertions, 0 deletions
diff --git a/src/misc/extra/extraUtilReader.c b/src/misc/extra/extraUtilReader.c
new file mode 100644
index 00000000..c165b989
--- /dev/null
+++ b/src/misc/extra/extraUtilReader.c
@@ -0,0 +1,383 @@
+/**CFile****************************************************************
+
+ FileName [extraUtilReader.c]
+
+ SystemName [ABC: Logic synthesis and verification system.]
+
+ PackageName [extra]
+
+ Synopsis [File reading utilities.]
+
+ Author [Alan Mishchenko]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - June 20, 2005.]
+
+ Revision [$Id: extraUtilReader.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#include <stdio.h>
+#include "extra.h"
+#include "vec.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+#define EXTRA_BUFFER_SIZE 4*1048576 // 1M - size of the data chunk stored in memory
+#define EXTRA_OFFSET_SIZE 4096 // 4K - load new data when less than this is left
+
+#define EXTRA_MINIMUM(a,b) (((a) < (b))? (a) : (b))
+
+struct Extra_FileReader_t_
+{
+ // the input file
+ char * pFileName; // the input file name
+ FILE * pFile; // the input file pointer
+ int nFileSize; // the total number of bytes in the file
+ int nFileRead; // the number of bytes currently read from file
+ // info about processing different types of input chars
+ char pCharMap[256]; // the character map
+ // temporary storage for data
+ char * pBuffer; // the buffer
+ int nBufferSize; // the size of the buffer
+ char * pBufferCur; // the current reading position
+ char * pBufferEnd; // the first position not used by currently loaded data
+ char * pBufferStop; // the position where loading new data will be done
+ // tokens given to the user
+ Vec_Ptr_t * vTokens; // the vector of tokens returned to the user
+ Vec_Int_t * vLines; // the vector of line numbers for each token
+ int nLineCounter; // the counter of lines processed
+ // status of the parser
+ int fStop; // this flag goes high when the end of file is reached
+};
+
+// character types
+typedef enum {
+ EXTRA_CHAR_COMMENT, // a character that begins the comment
+ EXTRA_CHAR_NORMAL, // a regular character
+ EXTRA_CHAR_STOP, // a character that delimits a series of tokens
+ EXTRA_CHAR_CLEAN // a character that should be cleaned
+} Extra_CharType_t;
+
+// the static functions
+static void * Extra_FileReaderGetTokens_int( Extra_FileReader_t * p );
+static void Extra_FileReaderReload( Extra_FileReader_t * p );
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis [Starts the file reader.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Extra_FileReader_t * Extra_FileReaderAlloc( char * pFileName,
+ char * pCharsComment, char * pCharsStop, char * pCharsClean )
+{
+ Extra_FileReader_t * p;
+ FILE * pFile;
+ char * pChar;
+ int nCharsToRead;
+ // check if the file can be opened
+ pFile = fopen( pFileName, "rb" );
+ if ( pFile == NULL )
+ {
+ printf( "Extra_FileReaderAlloc(): Cannot open input file \"%s\".\n", pFileName );
+ return NULL;
+ }
+ // start the file reader
+ p = ALLOC( Extra_FileReader_t, 1 );
+ memset( p, 0, sizeof(Extra_FileReader_t) );
+ p->pFileName = pFileName;
+ p->pFile = pFile;
+ // set the character map
+ memset( p->pCharMap, EXTRA_CHAR_NORMAL, 256 );
+ for ( pChar = pCharsComment; *pChar; pChar++ )
+ p->pCharMap[(unsigned char)*pChar] = EXTRA_CHAR_COMMENT;
+ for ( pChar = pCharsStop; *pChar; pChar++ )
+ p->pCharMap[(unsigned char)*pChar] = EXTRA_CHAR_STOP;
+ for ( pChar = pCharsClean; *pChar; pChar++ )
+ p->pCharMap[(unsigned char)*pChar] = EXTRA_CHAR_CLEAN;
+ // get the file size, in bytes
+ fseek( pFile, 0, SEEK_END );
+ p->nFileSize = ftell( pFile );
+ rewind( pFile );
+ // allocate the buffer
+ p->pBuffer = ALLOC( char, EXTRA_BUFFER_SIZE+1 );
+ p->nBufferSize = EXTRA_BUFFER_SIZE;
+ p->pBufferCur = p->pBuffer;
+ // determine how many chars to read
+ nCharsToRead = EXTRA_MINIMUM(p->nFileSize, EXTRA_BUFFER_SIZE);
+ // load the first part into the buffer
+ fread( p->pBuffer, nCharsToRead, 1, p->pFile );
+ p->nFileRead = nCharsToRead;
+ // set the ponters to the end and the stopping point
+ p->pBufferEnd = p->pBuffer + nCharsToRead;
+ p->pBufferStop = (p->nFileRead == p->nFileSize)? p->pBufferEnd : p->pBuffer + EXTRA_BUFFER_SIZE - EXTRA_OFFSET_SIZE;
+ // start the arrays
+ p->vTokens = Vec_PtrAlloc( 100 );
+ p->vLines = Vec_IntAlloc( 100 );
+ p->nLineCounter = 1; // 1-based line counting
+ return p;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Stops the file reader.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Extra_FileReaderFree( Extra_FileReader_t * p )
+{
+ if ( p->pFile )
+ fclose( p->pFile );
+ FREE( p->pBuffer );
+ Vec_PtrFree( p->vTokens );
+ Vec_IntFree( p->vLines );
+ free( p );
+}
+
+/**Function*************************************************************
+
+ Synopsis [Returns the file size.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+char * Extra_FileReaderGetFileName( Extra_FileReader_t * p )
+{
+ return p->pFileName;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Returns the file size.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Extra_FileReaderGetFileSize( Extra_FileReader_t * p )
+{
+ return p->nFileSize;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Returns the current reading position.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Extra_FileReaderGetCurPosition( Extra_FileReader_t * p )
+{
+ return p->nFileRead - (p->pBufferEnd - p->pBufferCur);
+}
+
+/**Function*************************************************************
+
+ Synopsis [Returns the line number for the given token.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Extra_FileReaderGetLineNumber( Extra_FileReader_t * p, int iToken )
+{
+ assert( iToken >= 0 && iToken < p->vTokens->nSize );
+ return p->vLines->pArray[iToken];
+}
+
+
+/**Function*************************************************************
+
+ Synopsis [Returns the next set of tokens.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void * Extra_FileReaderGetTokens( Extra_FileReader_t * p )
+{
+ Vec_Ptr_t * vTokens;
+ while ( vTokens = Extra_FileReaderGetTokens_int( p ) )
+ if ( vTokens->nSize > 0 )
+ break;
+ return vTokens;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Returns the next set of tokens.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void * Extra_FileReaderGetTokens_int( Extra_FileReader_t * p )
+{
+ char * pChar;
+ int fTokenStarted, MapValue;
+ if ( p->fStop )
+ return NULL;
+ // reset the token info
+ p->vTokens->nSize = 0;
+ p->vLines->nSize = 0;
+ fTokenStarted = 0;
+ // check if the new data should to be loaded
+ if ( p->pBufferCur > p->pBufferStop )
+ Extra_FileReaderReload( p );
+
+// printf( "%d\n", p->pBufferEnd - p->pBufferCur );
+
+ // process the string starting from the current position
+ for ( pChar = p->pBufferCur; pChar < p->pBufferEnd; pChar++ )
+ {
+ // count the lines
+ if ( *pChar == '\n' )
+ p->nLineCounter++;
+ // switch depending on the character
+ MapValue = p->pCharMap[*pChar];
+
+// printf( "Char value = %d. Map value = %d.\n", *pChar, MapValue );
+
+
+ switch ( MapValue )
+ {
+ case EXTRA_CHAR_COMMENT:
+ if ( *pChar != '/' || *(pChar+1) == '/' )
+ { // dealing with the need to have // as a comment
+ // if the token was being written, stop it
+ if ( fTokenStarted )
+ fTokenStarted = 0;
+ // eraze the comment till the end of line
+ while ( *pChar != '\n' )
+ {
+ *pChar++ = 0;
+ if ( pChar == p->pBufferEnd )
+ { // this failure is due to the fact the comment continued
+ // through EXTRA_OFFSET_SIZE chars till the end of the buffer
+ printf( "Extra_FileReader failed to parse the file \"%s\".\n", p->pFileName );
+ return NULL;
+ }
+ }
+ pChar--;
+ break;
+ }
+ // otherwise it is a normal character
+ case EXTRA_CHAR_NORMAL:
+ if ( !fTokenStarted )
+ {
+ Vec_PtrPush( p->vTokens, pChar );
+ Vec_IntPush( p->vLines, p->nLineCounter );
+ fTokenStarted = 1;
+ }
+ break;
+ case EXTRA_CHAR_STOP:
+ if ( fTokenStarted )
+ fTokenStarted = 0;
+ *pChar = 0;
+ // prepare before leaving
+ p->pBufferCur = pChar + 1;
+ return p->vTokens;
+ case EXTRA_CHAR_CLEAN:
+ if ( fTokenStarted )
+ fTokenStarted = 0;
+ *pChar = 0;
+ break;
+ default:
+ assert( 0 );
+ }
+ }
+ // the file is finished or the last part continued
+ // through EXTRA_OFFSET_SIZE chars till the end of the buffer
+ if ( p->pBufferStop == p->pBufferEnd ) // end of file
+ {
+ *pChar = 0;
+ p->fStop = 1;
+ return p->vTokens;
+ }
+ printf( "Extra_FileReader failed to parse the file \"%s\".\n", p->pFileName );
+/*
+ {
+ int i;
+ for ( i = 0; i < p->vTokens->nSize; i++ )
+ printf( "%s ", p->vTokens->pArray[i] );
+ printf( "\n" );
+ }
+*/
+ return NULL;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Loads new data into the file reader.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Extra_FileReaderReload( Extra_FileReader_t * p )
+{
+ int nCharsUsed, nCharsToRead;
+ assert( !p->fStop );
+ assert( p->pBufferCur > p->pBufferStop );
+ assert( p->pBufferCur < p->pBufferEnd );
+ // figure out how many chars are still not processed
+ nCharsUsed = p->pBufferEnd - p->pBufferCur;
+ // move the remaining data to the beginning of the buffer
+ memmove( p->pBuffer, p->pBufferCur, nCharsUsed );
+ p->pBufferCur = p->pBuffer;
+ // determine how many chars we will read
+ nCharsToRead = EXTRA_MINIMUM( p->nBufferSize - nCharsUsed, p->nFileSize - p->nFileRead );
+ // read the chars
+ fread( p->pBuffer + nCharsUsed, nCharsToRead, 1, p->pFile );
+ p->nFileRead += nCharsToRead;
+ // set the ponters to the end and the stopping point
+ p->pBufferEnd = p->pBuffer + nCharsUsed + nCharsToRead;
+ p->pBufferStop = (p->nFileRead == p->nFileSize)? p->pBufferEnd : p->pBuffer + EXTRA_BUFFER_SIZE - EXTRA_OFFSET_SIZE;
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+