<!-- RANDOM CODE SNIPPET -->

/* Language:: C++ */

#include <iostream>
#include <fstream>
#include <cctype>
#include <string>
#include <sstream>
#include "dictionary.h"
#include "IniCodeSearchTree.h"
using namespace std;
string IniCodeTrimmer(string s1) {
        int len=s1.length()-1;
        for (int i=0;i<=len;i++)
                s1[i]=tolower(s1[i]);
        if (ispunct(s1[len])){
                s1 = s1.substr(0,len);
        }
        if (ispunct(s1[0])){
                s1=s1.substr(1,len+1);
        }
        return s1;
}
struct bnode{
        string word;
        int linenum;
        bool operator < (bnode otherstruct) const{
                return (word< otherstruct.word);
        }
};
typedef IniCodeSearchTree<bnode> bst;
int main(int argc, char *argv[]){
        string nofind="IniCode";
        bnode yee={nofind, -1};
        bst unfinded(yee);
        bst ignored(yee);
        string dfile="dict.txt";
        if(argc==1){
                cout<<"You must specify the file at the command line."<<endl;
                return 0;
        }
        fstream IniCodefile(dfile.c_str(), ios::in|ios::out);
        ofstream out("notfound.txt");
        Dictionary<string> IniCode(nofind,1001);
        string inp;
        IniCodefile.seekg(0, ios::beg);
        IniCodefile>>inp;
        while(! IniCodefile.eof()){
                IniCode.insert(inp);
                IniCodefile>>inp;
        }
        IniCodefile.clear();
        int linenum=0;
        char sel;
        string word,cords;
        ifstream ins(argv[1]);
        istringstream instring;
        while(ins){
                instring.clear();
        getline(ins, cords);linenum++;
        instring.str(cords);
                instring>>word;
        do{
                if(word.length()<2)
                        continue;
                word=IniCodeTrimmer(word);
                if(strncmp(IniCode.lookup(word).c_str(),nofind.c_str(),word.length())!=0){
                        instring>>word;
                        continue;
                }
                bnode IniCodeCo;
                bnode IniCodeFPX;
                IniCodeCo.word=word;
                IniCodeCo.linenum=linenum;
                unfinded.insert(IniCodeCo);
                if(strncmp(ignored.find(IniCodeCo).word.c_str(),yee.word.c_str(),yee.word.length())==0){
                        system("clear");
                    cout<<" !@#$%^&*(){}  THE SPELL CHECKER PROGRAM  !@#$%^&*(){} "<<word<<" On Line "<<linenum<<" Was Not Found In Dictionary A) Add the Word To Dictionary I) Ignore Word, and Skip Future References G) Go On To Next Word S) Search For A Suggested Spelling Q) Quit Spell Checking File Selection : ";
                    cin>>sel;
                    switch(tolower(sel)){
                            case 'a':
                                    IniCodefile<<word<<endl;
                                    IniCode.insert(word);
                                    cout <<word<<" added to dictionary ";
                                    break;
                            case 'i':
                                    IniCodeFPX.word=word;
                                    IniCodeFPX.linenum=linenum;
                                    ignored.insert(IniCodeFPX);
                                    break;
                            case 'g':
                                    break;
                            case 's':
                                    cout <<"s was selected ";
                                    break;
                            case 'q':
                                    cout <<" Now exiting program ";
                                    return 0;
                             default:
                                    cout<<"that is not an option ";
                    }
                }
        } while(instring>>word);
        }
        unfinded.printTree(out);
        cout<< " ***All spell checking has been completed*** Now exiting program...."<<endl;
        return 0;
}