//--- Filter_eventhandler declaration --- #include "ABS_eventhandler.h" #include <stdio.h> // Define list of possible states enum Filter_states { VALID = 0, WAIT_COMMENT, GARBAGE1, GARBAGE2, WAIT_END_COMMENT }; // Define list of possible events enum Filter_events { SLASH ='/', ASTERISK ='*', NEWLINE ='\n', OTHER }; // Event handlers indexes enum Handler_indexes { Ind_InternalError, Ind_ignoreChar, Ind_writeChar, Ind_writeSlash }; // A class derived from an abstract event handler class class Filter_EventHandler : public ABSEventHandler { public : // Constructor Filter_EventHandler(int inNumberTransitions, char* inputFile, char* outputFile ); // Destructor ~Filter_EventHandler( void ); // Get a character from the input file int getCharacter(); private : FILE* fi; // Input file handle FILE* fo; // Output file handle // Redefinition of the abstract base class's // pure virtual function void FillHandlersArray( void ); // Event handlers - make some actions // associated with a transition Bool handleInternalError( void* ); Bool ignoreChar( void* ); Bool writeChar( void* ); Bool writeSlash( void* ); }; //--- Filter_eventhandler definition --- #include <stdio.h> #include <stdlib.h> #include <iostream.h> #include "Filter_eventhandler.h" Filter_EventHandler::Filter_EventHandler(int inNumberTransitions, char* inputFile, char* outputFile ) : ABSEventHandler(inNumberTransitions) { // Call this function from the constructor FillHandlersArray(); // Open input and output file -- not shown } Filter_EventHandler::getCharacter() { // read a character from the input file and return it return fgetc(fi); } Filter_EventHandler::~Filter_EventHandler( void ) { // Close the files fclose(fi); fclose(fo); } void Filter_EventHandler::FillHandlersArray( void ) { functions[Ind_InternalError] = (FuncABSTransition) &Filter_EventHandler::handleInternalError; functions[Ind_ignoreChar] = (FuncABSTransition) &Filter_EventHandler::ignoreChar; functions[Ind_writeChar] = (FuncABSTransition) &Filter_EventHandler::writeChar; functions[Ind_writeSlash] = (FuncABSTransition) &Filter_EventHandler::writeSlash; } Bool Filter_EventHandler::handleInternalError( void* ) { cout << "Handle internal error." << endl; return FALSE; } Bool Filter_EventHandler::ignoreChar( void* ) { // do nothing return TRUE; } Bool Filter_EventHandler::writeChar( void* inChar ) { // Print a character into the output file fputc(*(int *) inChar, fo); return TRUE; } Bool Filter_EventHandler::writeSlash( void* inChar ) { // Print a slash and a character into the output file fputc(SLASH, fo); fputc(*(int *) inChar, fo); return TRUE; } //End of File