summaryrefslogtreecommitdiffstats
path: root/src/misc/extra/extraUtilReader.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2007-09-30 08:01:00 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2007-09-30 08:01:00 -0700
commite54d9691616b9a0326e2fdb3156bb4eeb8abfcd7 (patch)
treede3ffe87c3e17950351e3b7d97fa18318bd5ea9a /src/misc/extra/extraUtilReader.c
parent7d7e60f2dc84393cd4c5db22d2eaf7b1fb1a79b2 (diff)
downloadabc-e54d9691616b9a0326e2fdb3156bb4eeb8abfcd7.tar.gz
abc-e54d9691616b9a0326e2fdb3156bb4eeb8abfcd7.tar.bz2
abc-e54d9691616b9a0326e2fdb3156bb4eeb8abfcd7.zip
Version abc70930
Diffstat (limited to 'src/misc/extra/extraUtilReader.c')
-rw-r--r--src/misc/extra/extraUtilReader.c383
1 files changed, 0 insertions, 383 deletions
diff --git a/src/misc/extra/extraUtilReader.c b/src/misc/extra/extraUtilReader.c
deleted file mode 100644
index c165b989..00000000
--- a/src/misc/extra/extraUtilReader.c
+++ /dev/null
@@ -1,383 +0,0 @@
-/**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 ///
-////////////////////////////////////////////////////////////////////////
-
-