www.pudn.com > HEC-linux.zip > lnscan.cpp


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+                                                                   + 
+	lnscan.cpp                                                      + 
+                                                                   + 
+	This class takes an input file and breaks it into a stream of   +  
+	null-char terminated lines ( represented by Line struct )       + 
+                                                                   + 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 
 
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ Macros                                                            +                                                                   + 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 
 
/*#define INPUT_SCANNER_DEBUG		1*/ 
 
#ifdef INPUT_SCANNER_DEBUG 
#define	INPUT_SCAN_DEBUG0(arg);				printf("LineScanner::");printf(arg); 
#define INPUT_SCAN_DEBUG1(arg1,arg2);		printf("LineScanner::");printf(arg1,arg2); 
#define INPUT_SCAN_DEBUG2(arg1,arg2,arg3);	printf("LineScanner::");printf(arg1,arg2,arg3); 
#else 
#define	INPUT_SCAN_DEBUG0(arg); 
#define INPUT_SCAN_DEBUG1(arg1,arg2); 
#define INPUT_SCAN_DEBUG2(arg1,arg2); 
#endif 
 
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ declaration                                                       + 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 
 
#define LINE_SIZE   512		/*max length of line of assembly code*/ 
 
/*flag from getInputChar(), indicates have hit EOF*/ 
 
#define IN_END		-1		 
 
struct Line 
{ 
	char src[LINE_SIZE];	/*single line of assembler code*/ 
	unsigned long line;		/*line number*/ 
	char *fName;			/*file reading assembly code from*/ 
	unsigned char end;		/*(TRUE|FALSE), indicates we've hit EOF*/ 
}; 
 
class LineScanner 
{ 
	FILE *iFptr;					/*pointer to assembly code file*/ 
	char iFname[FNAME_SIZE];		/*name of assembly code file*/ 
	char inBuffer[BUFFER_SIZE];		/*buffer for input from assembly file*/ 
	int	nInBuffer;					/*number of bytes in inBuffer*/ 
	int	inBufferPos;				/*index into inBuffer: 0 -> nInBuffer-1 */ 
	unsigned long inLine;			/*current line in file*/ 
 
	void fillInputBuffer(); 
	char getInputChar(); 
	void prep(char ch, char *str); 
 
	public: 
	LineScanner(CommandLine *cl_obj); 
	~LineScanner(); 
 
	struct Line getInputLine(); 
	void printScannedLine(struct Line *lptr); 
 
	void test(); 
}; 
 
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ definitions                                                       + 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 
 
LineScanner::LineScanner(CommandLine *cl_obj) 
{ 
	if(((*cl_obj).inputFile==NULL)||(strlen((*cl_obj).inputFile)==0)) 
	{  
		INPUT_SCAN_DEBUG0("LineScanner(): file name empty\n"); 
		strcpy(iFname,(*cl_obj).nullName); 
	} 
	else 
	{   
		strncpy(iFname,(*cl_obj).inputFile,FNAME_SIZE); 
		iFname[FNAME_SIZE-1]='\0'; 
		INPUT_SCAN_DEBUG1("LineScanner(): opened %s\n",iFname); 
	} 
 
	iFptr = fopen(iFname,"rb"); 
	if(iFptr==NULL) 
	{  
		printf("LineScanner::LineScanner(): could not open %s\n",iFname);  
		exit(SHUTDOWN_ERROR);  
	} 
	inLine = 1; 
	fillInputBuffer(); 
	return; 
 
}/*end constructor*/ 
 
/*-----------------------------------------------------------------*/ 
 
LineScanner::~LineScanner() 
{ 
	if(iFptr!=NULL) 
	{ 
		if(fclose(iFptr)) 
		{  
			printf("LineScanner::~LineScanner(): "); 
			printf("could not close %s\n",iFname);   
		} 
	} 
	else 
	{ 
		INPUT_SCAN_DEBUG0("~LineScanner(): null file pointer\n");  
	} 
 
	INPUT_SCAN_DEBUG0("~LineScanner(): closed file\n");  
 
	return; 
 
}/*end destructor*/ 
 
/*-----------------------------------------------------------------*/ 
 
void LineScanner::fillInputBuffer() 
{ 
	int nbytes; 
 
	nbytes=0; 
	nbytes = fread(inBuffer,sizeof(char),BUFFER_SIZE,iFptr); 
 
	/*if nbytes is less than BUFFER_SIZE, have hit EOF or have an error*/ 
 
	if(nbytes