X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkInterpreter.cxx;h=2147d0ca35c1b84760ca57380c523ad77b85b89a;hb=3924782985e3d7c795af6bb46c602157cfad59f0;hp=c63ec51f30a6862bd033f3865c24fa0001386051;hpb=56e4ad989e702cfecc9166812f8a365aca6a2b31;p=bbtk.git diff --git a/kernel/src/bbtkInterpreter.cxx b/kernel/src/bbtkInterpreter.cxx index c63ec51..2147d0c 100644 --- a/kernel/src/bbtkInterpreter.cxx +++ b/kernel/src/bbtkInterpreter.cxx @@ -3,8 +3,8 @@ Program: bbtk Module: $RCSfile: bbtkInterpreter.cxx,v $ $ Language: C++ - Date: $Date: 2008/03/07 11:15:15 $ - Version: $Revision: 1.41 $ + Date: $Date: 2008/03/18 12:51:26 $ + Version: $Revision: 1.46 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -50,6 +50,7 @@ namespace bbtk #endif mCommandLine(false) { +bufferNb =0; bbtk::MessageManager::RegisterMessageType("Echo","Level>0 : Prints the 'echo' commands of the user.\n\tLevel>1 : Prints the command being interpreted",1); bbtk::MessageManager::RegisterMessageType("Interpreter","Messages of the interpreter",0); bbtkDebugMessageInc("Interpreter",9,"Interpreter::Interpreter()" <::iterator it =mFileName.begin(); it!=mFileName.end(); ++it) + { + std::cout << "A=== [" << (*it) << "]" << std::endl; + } +*/ bool insideComment = false; // for multiline comment while (mFile.size()>0) { - while ((mFile.size()>0) && - (!mFile.back()->eof())) +/* + for( std::vector::iterator it =mFileName.begin(); it!=mFileName.end(); ++it) { - mLine.back()++; + std::cout << "B=== [" << (*it) << "]" << std::endl; + } +*/ + + //while ((mFile.size()>0) && !mFile.back()->eof() ) + //{ +// std::cout << "mFile.size() "<< mFile.size() << " mFileName.back() [" << mFileName.back() << "]" << std::endl; + while (!mFile.back()->eof()) { + mLine.back()++; char buf[500]; mFile.back()->getline(buf,500); - std::string str(buf); +// std::cout << " in InterpretFile mFile.back()->getline [" << str << "]" << std::endl; int size=str.length(); if ( str[ size-1 ]==13 ) { str.erase(size-1,1); } - InterpretLine(str, insideComment); - } - //if (mFile.size()>0) - CloseCurrentFile(); + InterpretLine(str, insideComment); + + }//while + //if (mFile.size()>0) + CloseCurrentFile(); } } catch (QuitException e) @@ -373,6 +388,97 @@ std::cout << "=========================================~Interpreter()" << std::e //======================================================================= + //======================================================================= + /** + * + */ + void Interpreter::InterpretBuffer( std::stringstream* buffer ) + { + bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretBuffer()"<::iterator it =mFileName.begin(); it!=mFileName.end(); ++it) + { + std::cout << "A=== [" << (*it) << "]" << std::endl; + } +*/ + bool insideComment = false; // for multiline comment + while (mFile.size()>0) + { +/* + for( std::vector::iterator it =mFileName.begin(); it!=mFileName.end(); ++it) + { + std::cout << "B=== [" << (*it) << "]" << std::endl; + } +*/ + + //while ((mFile.size()>0) && !mFile.back()->eof() ) + //{ +// std::cout << "mFile.size() "<< mFile.size() << " mFileName.back() [" << mFileName.back() << "]" << std::endl; + while (!mFile.back()->eof()) { + mLine.back()++; + char buf[500]; + mFile.back()->getline(buf,500); + std::string str(buf); +// std::cout << " in InterpretFile mFile.back()->getline [" << str << "]" << std::endl; + int size=str.length(); + if ( str[ size-1 ]==13 ) + { + str.erase(size-1,1); + } + + InterpretLine(str, insideComment); + + }//while + //if (mFile.size()>0) + CloseCurrentFile(); + } + } + catch (QuitException e) + { + // std::cout << "**QuitException caught**"<mExecuter->Reset(); break; @@ -661,10 +766,10 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& pos = s.find(ss,0); char* cr = "\n"; while ( pos != std::string::npos ) - { + { s.replace(pos,2,cr,1); pos = s.find(ss, pos-1); - } + } } //======================================================================= @@ -773,41 +878,62 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& // It's a user intended message. // Please don't remove it. bbtkMessage("Interpreter",1, - "look for : [" << name - << "]" << std::endl); + "look for : [" << name + << "]" << std::endl); script_paths = ConfigurationFile::GetInstance().Get_bbs_paths(); std::string upath; pkgname = Utilities::ExtractScriptName(name,upath); + bbtkMessage("Interpreter",1, + "extract : pkgname [" << pkgname + << "] upath [" << upath << "]" << std::endl); bool fullnameGiven = false; bool foundFile = false; if(pkgname == "*") // =========================================== load all boxes (e.g. std/boxes/*) { +// std::cout << "JPR================== * found, load all boxes " << std::endl; int nbBssFiles; + std::stringstream* stream = new std::stringstream; + //if (upath.size()!=0) // avoid troubles for "*" + if (upath[0]=='/' || upath[1] == ':' ) // ==== absolute name, load all .bbs files { +// std::cout << "JPR================== absolute name, load all .bbs files " << std::endl; int nbFiles = Utilities::Explore(upath, false, Filenames); nbBssFiles = 0; for (std::vector::iterator i = Filenames.begin(); i!= Filenames.end(); ++i) { - if ((*i).substr((*i).size()-4, 4) != ".bbs") - continue; // ignore non .bbs files - std::string command("include "); - command += *i; - // LoadScript(*i,name); - bool tmp; - InterpretLine(command,tmp); +// std::cout << "JPR================== iterate [" << *i << "]" << std::endl; + int lgr = (*i).size(); + if (lgr < 5) + continue; // ignore non .bbs file + if ((*i).substr(lgr-4, 4) != ".bbs") + continue; + /* + if (lgr > 10) // 10 -> '-appli.bbs' + { + if ((*i).substr(lgr-10, 10) == "-appli.bbs") + continue; // ignore '-appli.bbs' files + } + */ + + (*stream) << "include " << *i << "\n"; +//EED InterpretFile(*i); + nbBssFiles++; - } - if (nbBssFiles==0) + } // for vector + if (nbBssFiles==0){ bbtkMessage("Interpreter",2, "WARNING : No '.bbs' file found in [" << upath << "]" << std::endl); + } else { + SwitchToStream(stream); + } return; - } + } // if upath std::string path; std::vector::iterator i; @@ -822,11 +948,10 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& char * currentDir = getcwd(buf, 2048); std::string cwd(currentDir); path = currentDir; - } + } // if path fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false); - //EED 18 Fev 2008 // without last slash "\" std::string fullDirectoryNameClean = fullDirectoryName.substr(0,fullDirectoryName.size()-1); @@ -836,37 +961,50 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& // The following is *NOT* a debug time message : // It's a user intended message. // Please don't remove it. - bbtkMessage("Interpreter",1," [" <::iterator i = Filenames.begin(); i!= Filenames.end(); ++i) { - if ((*i).substr((*i).size()-4, 4) != ".bbs") - continue; // ignore non .bbs files - std::string command("include "); - command += *i; - bool tmp; - InterpretLine(command,tmp); - // LoadScript(*i,name); +// std::cout << "JPR================== iterate [" << *i << "]" << std::endl; + int lgr = (*i).size(); + if (lgr < 5) + continue; // ignore non .bbs file + if ((*i).substr(lgr-4, 4) != ".bbs") + continue; + /* + if (lgr > 10) // 10 -> '-appli.bbs' + { + if ((*i).substr(lgr-10, 10) == "-appli.bbs") + continue; // ignore '-appli.bbs' files + } + */ + + (*stream) << "include " << *i << "\n"; +//EED InterpretFile(*i); + nbBssFiles++; - } - if (nbBssFiles==0) - bbtkMessage("Interpreter",1, + } // for vector + if (nbBssFiles==0){ + bbtkMessage("Interpreter",1, "WARNING : No '.bbs' file found in [" << fullDirectoryName << "]" << std::endl); + } else { + SwitchToStream(stream); + } //break; // a directory was found; we stop iterating // LG : No! We want all files included ! - } + } // for vector return; - } + } // if * //std::string::size_type slash_position = name.find_last_of("/\\"); @@ -887,7 +1025,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& int l = fullPathScriptName.size(); if (l!=0) { - + if (l>4) { if (fullPathScriptName.substr(l-4, 4) != ".bbs") @@ -900,21 +1038,19 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& fullPathScriptName = fullPathScriptName + ".bbs"; } - if ( Utilities::FileExists(fullPathScriptName)) - { - foundFile = true; - } - } // endif l != 0 - } - else - - // =============================================================== iterate on the paths + if ( Utilities::FileExists(fullPathScriptName)) { + foundFile = true; + } + } // endif l != 0 + } + else + // =============================================================== iterate on the paths + { std::string path; std::vector::iterator i; for (i=script_paths.begin();i!=script_paths.end();++i) { - path = *i; // we *really* want '.' to be the current working directory if (path == ".") { @@ -924,10 +1060,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& path = currentDir; } - // fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); //pkgname); - - fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); - + fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); // Check if library exists if ( ! Utilities::FileExists(fullPathScriptName) ) @@ -935,12 +1068,12 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& // The following is *NOT* a debug time message : // It's a user intended message. // Please don't remove it. - bbtkMessage("Interpreter",2, + bbtkMessage("Interpreter",2, " [" <& } +void Interpreter::SwitchToStream( std::stringstream* stream ) +{ +//std::cout << "== 1 Entry in Interpreter::SwitchToStream " << std::endl; + + mFile.push_back(stream); + //std::cout << " mFile.size() " << mFile.size() << std::endl; + std::ostringstream buffer_name; + bufferNb++; + buffer_name << "buffer_" ; // << bufferNb; + +// std::cout << " mFile.size() " << mFile.size() << std::endl; +// std::cout << " mFileName.size() " << mFileName.size() << std::endl; +// std::cout << " mLine.size() " << mLine.size() << std::endl; + // std::vector::iterator j = mFileName.begin(); + // std::cout << " mFileName.begin() succeeded" << std::endl; + // std::cout << " mFileName[0] " << mFileName[0] << std::endl; + //std::cout << " mFileName.begin() " << mFileName.begin() << std::endl; +/* + for( std::vector::iterator i = mFileName.begin(); i!= mFileName.end(); ++i) + { + + std::cout << "Interpreter::SwitchToStream : mFileName [" << *i << "]" << std::endl; + } +*/ + // std::cout << " mLine.back() " << mLine.back() << std::endl; + // std::cout << " mFileName.back() " << mFileName.back() << std::endl; + + if (mFileName.size()>0 )// && (mFile.size()>0) ) // NO!!! + { + // std::cout << " mFileName.back() " << mFileName.back() << std::endl; + // std::cout << " mLine.back() " << mLine.back() << std::endl; + buffer_name << mFileName.back() << "_" << mLine.back(); + } +//std::cout << "3 in Interpreter::SwitchToStream buffer_name :[" << buffer_name.str() << "]" << std::endl; + mFileName.push_back(buffer_name.str()); + mIncludeFileName.push_back(buffer_name.str()); + mLine.push_back(0); +} + //======================================================================= void Interpreter::LoadScript( std::string fullPathScriptName, std::string includeScriptName) { - if (find(mFileName.begin(),mFileName.end(),fullPathScriptName) - !=mFileName.end()) - { - bbtkMessage("Interpreter",1,"file '"<open(fullPathScriptName.c_str()); - if (!s->good()) + if (!s->good()) { bbtkError("Could not open file ["<& return; } - mFile.back()->close(); + bbtkDebugMessage("Interpreter",9," Closing file '"<(mFile.back()); + if (file!=0) file->close(); + delete mFile.back(); mFile.pop_back(); - bbtkDebugMessage("Interpreter",9, - " Closing file '"<& while (mFile.size() != 0) { + CloseCurrentFile(); + /* mFile.back()->close(); delete mFile.back(); mFile.pop_back(); @@ -1050,6 +1238,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& mFileName.pop_back(); mIncludeFileName.pop_back(); mLine.pop_back(); +*/ } bbtkDebugMessage("Interpreter",9,"EO Interpreter::CloseAllFiles()" <