#define _USE_OLD_RW_STL #include "parser.h" #include "logs.h" /* MaSzyna EU07 locomotive simulator parser Copyright (C) 2003 TOLARIS */ ///////////////////////////////////////////////////////////////////////////////////////////////////// // cParser -- generic class for parsing text data. // constructors cParser::cParser(std::string Stream,buffertype Type,std::string Path,bool tr) { LoadTraction=tr; // build comments map mComments.insert(commentmap::value_type("/*","*/")); mComments.insert(commentmap::value_type("//","\n")); //mComments.insert(commentmap::value_type("--","\n")); //Ra: to chyba nie używane // store to calculate sub-sequent includes from relative path mPath=Path; // reset pointers and attach proper type of buffer switch (Type) { case buffer_FILE: Path.append(Stream); mStream=new std::ifstream(Path.c_str()); break; case buffer_TEXT: mStream=new std::istringstream(Stream); break; default: mStream=NULL; } mIncludeParser=NULL; // calculate stream size if (mStream) { mSize=mStream->rdbuf()->pubseekoff(0,std::ios_base::end); mStream->rdbuf()->pubseekoff(0,std::ios_base::beg); } else mSize=0; } // destructor cParser::~cParser() { if (mIncludeParser) delete mIncludeParser; if (mStream) delete mStream; mComments.clear(); } // methods bool cParser::getTokens(int Count,bool ToLower,const char* Break) { /* if (LoadTraction==true) trtest="niemaproblema"; //wczytywać else trtest="x"; //nie wczytywać */ int i; this->str(""); this->clear(); for (i=0;istr(string); else { std::string temp=this->str(); temp.append("\n"); temp.append(string); this->str(temp); } } if (ipeek()!=EOF&& strchr( Break, c = mStream->get() ) == NULL) { if (ToLower) c=tolower(c); token+=c; if (trimComments(token)) // don't glue together words separated with comment break; } } while (token=="" && mStream->peek()!=EOF); // double check to deal with trailing spaces // launch child parser if include directive found. // NOTE: parameter collecting uses default set of token separators. if (token.compare("include")==0) {//obsługa include std::string includefile=readToken(ToLower); //nazwa pliku if (LoadTraction?true:((includefile.find("tr/")==std::string::npos)&&(includefile.find("tra/")==std::string::npos))) { //std::string trtest2="niemaproblema"; //nazwa odporna na znalezienie "tr/" //if (trtest=="x") //jeśli nie wczytywać drutów //trtest2=includefile; //kopiowanie ścieżki do pliku std::string parameter=readToken(false); //w parametrach nie zmniejszamy while (parameter.compare("end")!=0) { parameters.push_back(parameter); parameter=readToken(ToLower); } //if (trtest2.find("tr/")!=0) mIncludeParser=new cParser(includefile,buffer_FILE,mPath,LoadTraction); if (mIncludeParser->mSize<=0) ErrorLog("Missed include: "+AnsiString(includefile.c_str())); } else while (token.compare("end")!=0) token=readToken(ToLower); token=readToken(ToLower,Break); } return token; } bool cParser::trimComments(std::string &String) { for (commentmap::iterator cmIt=mComments.begin();cmIt!=mComments.end();++cmIt) { if (String.find((*cmIt).first)!=std::string::npos) { readComment((*cmIt).second); String.resize(String.find((*cmIt).first)); return true; } } return false; } std::string cParser::readComment(const std::string Break) {//pobieranie znaków aż do znalezienia znacznika końca std::string token=""; while (mStream->peek()!=EOF) {//o ile nie koniec pliku token+=mStream->get(); //pobranie znaku if (token.find(Break)!=std::string::npos) //szukanie znacznika końca break; } return token; } int cParser::getProgress() const { return mStream->rdbuf()->pubseekoff( 0, std::ios_base::cur ) * 100 / mSize; }