#include using std::string; #include "FileParser.h" using namespace FileParser; namespace FileParser { //protocol:SetFile {GetWordRef, GetWordcnt, GetLinecnt}* Reset const string ALPHA = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; int wordcnt; int linecnt; enum status { undef, OK, FileEnd }; status readiness = undef; string currentline; int currentcol; Word wrd; Reference ref; //Private functions bool FindLine(ifstream& fin); bool FindWord(ifstream& fin, Word& Wrd, Reference& Ref); void SetFile( ifstream& fin) { //Initialize FileParser state variables. wordcnt = 0; linecnt = 0; currentcol = 0; currentline = ""; FindLine(fin); }//SetFile void Reset() { readiness = undef; }//Reset bool FindLine( ifstream& fin ) { //Scans input stream for next non-null line; returns TRUE, if found; FALSE otherwise //It updates currentline, currentcol, and potentially status while( !fin.eof() && getline(fin, currentline) && !currentline.size() ) linecnt++; //check for valid (non-NULL) line if( fin.eof() || !currentline.size() ) { // End of File Encountered readiness = FileEnd; return false; }//if linecnt++; currentcol = 0; readiness = OK; return true; }//FindLine bool FindWord( ifstream& fin, Word& Wrd, Reference& Ref) { // Precondition: currentline is non-null. while( currentcol < currentline.size() ) {//Scan currentline until first ALPHA character is found. if( ALPHA.find(currentline[currentcol],0) != string::npos ) break; currentcol++; }//while //Check if an ALPHA character was found before the end of line if( currentcol >= currentline.size()) { if( FindLine(fin) ) return FindWord(fin,Wrd,Ref); return false; }//if // A Word has been found string nextword; int refcol = currentcol+1; nextword.append(1,currentline[currentcol++]); while( currentcol < currentline.size() ) {//Scan currentline until the next NON ALPHA character is found, or EOL if( ALPHA.find(currentline[currentcol],0) == string::npos )break; nextword.append(1,currentline[currentcol++]); }//while Wrd = Word(nextword); Ref = Reference(linecnt, refcol); wordcnt++; return true; }//FindWord bool GetWordRef(ifstream& fin, Word& Wrd, Reference& Ref ) { if( readiness == FileEnd ) return false; if( readiness == undef ) { cout << "Invalid call to GetWordRef! FileParser not Initialized!" << endl; cout.flush(); exit(1); } if( currentcol < currentline.size()) return FindWord(fin,Wrd,Ref); currentline = ""; currentcol = 0; if( FindLine(fin) ) return FindWord(fin,Wrd,Ref); return false; }//GetWordRef int GetWordcnt() { return wordcnt; }//GetWordcnt int GetLinecnt() { return linecnt; }//GetLinecnt// }