From 342c21bb6c5f2ba6ba76aacb403ce1201a10957c Mon Sep 17 00:00:00 2001 From: jean-pierre roux Date: Mon, 28 Jan 2008 09:12:49 +0000 Subject: [PATCH] Now we may again use absolute/relative paths for scripts and packages (* not yet working) --- kernel/src/bbtkFactory.cxx | 317 ++++++++++++++++++--------------- kernel/src/bbtkInterpreter.cxx | 228 ++++++++++++------------ kernel/src/bbtkUtilities.h | 98 ++++++---- 3 files changed, 362 insertions(+), 281 deletions(-) diff --git a/kernel/src/bbtkFactory.cxx b/kernel/src/bbtkFactory.cxx index 2accdca..2a633d3 100644 --- a/kernel/src/bbtkFactory.cxx +++ b/kernel/src/bbtkFactory.cxx @@ -4,8 +4,8 @@ Program: bbtk Module: $RCSfile: bbtkFactory.cxx,v $ Language: C++ -Date: $Date: 2008/01/22 16:55:04 $ -Version: $Revision: 1.2 $ +Date: $Date: 2008/01/28 09:12:49 $ +Version: $Revision: 1.3 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de @@ -102,25 +102,31 @@ namespace bbtk // =================================================================================== bool Factory::DoLoadPackage(std::string libname, - std::string pkgname, - std::string path, - bool verbose) + std::string pkgname, + std::string path, + bool verbose) { #if defined(__GNUC__) - void *handler; - handler = dlopen(libname.c_str(), + void *handler; + handler = dlopen(libname.c_str(), BBTK_RTLD_TIME | BBTK_RTLD_SCOPE ); if (!handler) { + // The following is *NOT* a debug time message : + // It's a user intended message. + // Please don't remove it. if (verbose) { std::cout <<"[" <[" <GetBBTKVersion()); UnLoadPackage(pkgname); bbtkError(" package build with bbtk version " - << v - << " whereas application build with version " - << bbtk::GetVersion()); + << v + << " whereas application build with version " + << bbtk::GetVersion()); } - std::string separator = - ConfigurationFile::GetInstance().Get_file_separator (); - //BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) - std::string docreldoc = separator + "packages" + separator + pkgname - + separator + "bbdoc" + separator + "index.html"; - std::string reldoc = ".." + separator + ".." + separator - + ".." + docreldoc; - std::string doc = path + separator + ".." + separator - + BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) - + docreldoc; - - //std::cout << "doc='"<SetDocURL(doc); - pack.mPackage->SetDocRelativeURL(reldoc); - + std::string separator = + ConfigurationFile::GetInstance().Get_file_separator (); + //BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) + std::string docreldoc = separator + "packages" + separator + pkgname + + separator + "bbdoc" + separator + "index.html"; + std::string reldoc = ".." + separator + ".." + separator + + ".." + docreldoc; + std::string doc = path + separator + ".." + separator + + BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) + + docreldoc; + + pack.mPackage->SetDocURL(doc); + pack.mPackage->SetDocRelativeURL(reldoc); + //=================================================================== bbtkMessage("Output",2,pack.mPackage->GetName()<<" " <GetVersion() <<" (bbtk " <GetBBTKVersion()<<") " - <GetAuthor() + <GetAuthor() <GetDescription()< package_paths; std::string libname; // full path library name std::string pkgname; // e.g. libbb.so - + std::string upath; pkgname = Utilities::ExtractPackageName(name,upath); @@ -283,47 +292,80 @@ namespace bbtk // no loading package if already loaded PackageMapType::iterator iUnload; iUnload = mPackageMap.find(pkgname); - if (iUnload != mPackageMap.end()) + if (iUnload != mPackageMap.end()) { - bbtkMessage("Output",2,"["<0) package_paths.push_back(upath); - // Add the path of config file - if (use_configuration_file) + +// ================================================= +// The following structure was checked to work +// with any type of relative/absolute path. +// Please don't modify it without checking +// *all* the cases. JP +//================================================== + +//std::cout << "upath [" << upath << "]" << std::endl; + + bool ok = false; + bool foundFile = false; + + // If path provided by user will be the first scanned : + // push it into vector of paths + if (upath.length()>0) // ------------------------------------- check user supplied location { - std::vector::const_iterator pi; - for (pi =ConfigurationFile::GetInstance().Get_package_paths().begin(); - pi!=ConfigurationFile::GetInstance().Get_package_paths().end(); - ++pi) - package_paths.push_back(*pi); + // std::string path = Utilities::ExpandLibName(upath, verbose); + std::string path = Utilities::ExpandLibName(name, verbose); // keep last item, here. + if (path != "") + { + std::string p2; + Utilities::ExtractPackageName(path,p2); + //libname = Utilities::MakeLibnameFromPath(path, pkgname); + libname = Utilities::MakeLibnameFromPath(p2, pkgname); // remove last item + // Check if library exists + if ( !Utilities::FileExists(libname) ) + { + // The following is *NOT* a debug time message : + // It's a user intended message. + // Please don't remove it. + if (verbose) + std::cout <<" [" <::iterator i; for (i=package_paths.begin();i!=package_paths.end();++i) - { - foundFile = false; - std::string path = *i; - - // we *really* want '.' to be the current working directory - if (path == ".") { + { + foundFile = false; + path = *i; + + // we *really* want '.' to be the current working directory + if (path == ".") + { char buf[2048]; // for getcwd char * currentDir = getcwd(buf, 2048); - std::string cwd(currentDir); + std::string cwd(currentDir); path = currentDir; } - + libname = Utilities::MakeLibnameFromPath(path, pkgname); - - bbtkMessage("Debug",2,"-> Trying to load ["< Trying to load [" << libname << "]" <second.mDynamicLibraryHandler, + void *delf = GetProcAddress(i->second.mDynamicLibraryHandler, delfname.c_str()); - if (!delf) - { - bbtkError("could not close package \"" + if (!delf) + { + bbtkError("could not close package \"" <second.mPackage->GetName() <<"\" : "<first)->GetDocURL(); - fprintf(ff," %s [shape=ellipse, URL=\"%s\"]%s\n", - i->first.c_str(), - url.c_str(),";" ); + url=GetPackage(i->first)->GetDocURL(); + fprintf(ff," %s [shape=ellipse, URL=\"%s\"]%s\n",i->first.c_str(),url.c_str(),";" ); } fprintf( ff , "}\n\n"); bbtkDebugDecTab("Core",9); @@ -792,49 +831,49 @@ namespace bbtk //=================================================================== - void Factory::ShowGraphTypes(const std::string& name) const - { - bool found = false; - PackageMapType::const_iterator i; - for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i ) + void Factory::ShowGraphTypes(const std::string& name) const + { + bool found = false; + PackageMapType::const_iterator i; + for (i = mPackageMap.begin(); i!=mPackageMap.end(); ++i ) + { + if (i->second.mPackage->ContainsBlackBox(name)) { - if (i->second.mPackage->ContainsBlackBox(name)) - { - std::string separator = ConfigurationFile::GetInstance().Get_file_separator (); - + std::string separator = ConfigurationFile::GetInstance().Get_file_separator (); + // Don't pollute the file store with "doc_tmp" directories ... - std::string default_doc_dir = ConfigurationFile::GetInstance().Get_default_doc_tmp(); - std::string directory = "\"" + default_doc_dir + separator + "doc_tmp" +separator + "\""; - std::string filename2 = default_doc_dir + separator + "doc_tmp" + separator + "tmp.html"; - + std::string default_doc_dir = ConfigurationFile::GetInstance().Get_default_doc_tmp(); + std::string directory = "\"" + default_doc_dir + separator + "doc_tmp" +separator + "\""; + std::string filename2 = default_doc_dir + separator + "doc_tmp" + separator + "tmp.html"; + #if defined(_WIN32) - std::string command("start \"Titre\" /D "); + std::string command("start \"Titre\" /D "); #else - std::string command("gnome-open "); + std::string command("gnome-open "); #endif - command=command + directory +" tmp.html"; - FILE *ff; - ff=fopen(filename2.c_str(),"w"); - - fprintf(ff,"TMP \n"); - - - //fprintf(ff, "Link\n", i->second.mPackage->GetDocURL().c_str(),name.c_str() ); - fclose(ff); - system( command.c_str() ); - found = true; - } - } + command=command + directory +" tmp.html"; + FILE *ff; + ff=fopen(filename2.c_str(),"w"); + + fprintf(ff,"TMP \n"); + + + //fprintf(ff, "Link\n", i->second.mPackage->GetDocURL().c_str(),name.c_str() ); + fclose(ff); + system( command.c_str() ); + found = true; + } + } - bbtkDebugDecTab("Core",9); - if (!found) - { - bbtkError("No package of the factory contains any black box <" - <"); - } - } + bbtkDebugDecTab("Core",9); + if (!found) + { + bbtkError("No package of the factory contains any black box <" + <"); + } + } } diff --git a/kernel/src/bbtkInterpreter.cxx b/kernel/src/bbtkInterpreter.cxx index 76d87e3..18b3b76 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/01/23 07:51:51 $ - Version: $Revision: 1.3 $ + Date: $Date: 2008/01/28 09:12:49 $ + Version: $Revision: 1.4 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -324,7 +324,7 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL; std::cout << "* LINE : "< words; SplitLine(line,words); - + // Empty line if (words.size()<1) { @@ -391,7 +391,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) bbtkMessage("Interpreter",9,"Multiline Comment"<Create(words[1],words[2]); - break; + mExecuter->Create(words[1],words[2]); + break; case cDelete : - // TO DO !! - // mExecuter->Remove(words[1]); - break; + // TO DO !! + // mExecuter->Remove(words[1]); + break; case cConnect : - Utilities::SplitAroundFirstDot(words[1],left,right); - Utilities::SplitAroundFirstDot(words[2],left2,right2); - mExecuter->Connect(left,right,left2,right2); - break; + Utilities::SplitAroundFirstDot(words[1],left,right); + Utilities::SplitAroundFirstDot(words[2],left2,right2); + mExecuter->Connect(left,right,left2,right2); + break; case cDefine : - if (mFileName.size()>0) - { - filename = Utilities::get_file_name(mFileName.back()); - } - if (words.size()==2) - { - mExecuter->Define(words[1],"user",filename); - } - else - { - mExecuter->Define(words[1],words[2],filename); - } - break; + if (mFileName.size()>0) + { + filename = Utilities::get_file_name(mFileName.back()); + } + if (words.size()==2) + { + mExecuter->Define(words[1],"user",filename); + } + else + { + mExecuter->Define(words[1],words[2],filename); + } + break; case cEndDefine : - mExecuter->EndDefine(); - break; + mExecuter->EndDefine(); + break; case cPrint : - Print(words[1]); /// \todo use mExecuter - break; + Print(words[1]); /// \todo use mExecuter + break; case cExec : - if (words[1]=="freeze") - mExecuter->SetNoExecMode(true); - else if (words[1]=="unfreeze") - mExecuter->SetNoExecMode(false); - else - mExecuter->Update(words[1]); - break; + if (words[1]=="freeze") + mExecuter->SetNoExecMode(true); + else if (words[1]=="unfreeze") + mExecuter->SetNoExecMode(false); + else + mExecuter->Update(words[1]); + break; case cInput : - Utilities::SplitAroundFirstDot(words[2],left,right); - mExecuter->DefineInput(words[1],left,right,words[3]); - break; + Utilities::SplitAroundFirstDot(words[2],left,right); + mExecuter->DefineInput(words[1],left,right,words[3]); + break; case cOutput : - Utilities::SplitAroundFirstDot(words[2],left,right); - mExecuter->DefineOutput(words[1],left,right,words[3]); - break; + Utilities::SplitAroundFirstDot(words[2],left,right); + mExecuter->DefineOutput(words[1],left,right,words[3]); + break; case cSet : - Utilities::SplitAroundFirstDot(words[1],left,right); - mExecuter->Set(left,right,words[2]); - break; + Utilities::SplitAroundFirstDot(words[1],left,right); + mExecuter->Set(left,right,words[2]); + break; case cAuthor : - mExecuter->Author(words[1]); - break; + mExecuter->Author(words[1]); + break; case cDescription : - mExecuter->Description(words[1]); - break; + mExecuter->Description(words[1]); + break; case cHelp : - Help(words); - break; + Help(words); + break; case cMessage : - if (words.size()<3) - { + if (words.size()<3) + { bbtk::MessageManager::PrintInfo(); - } - else - { + } + else + { sscanf(words[2].c_str(),"%d",&level); bbtk::MessageManager::SetMessageLevel(words[1],level); - } - break; + } + break; case cGraph : - Graph(words); - break; + Graph(words); + break; case cConfig : - if (words.size()>1) // any param for config means verbose = true - verbose = true; - else - verbose = false; - Config(verbose); - break; + if (words.size()>1) // any param for config means verbose = true + verbose = true; + else + verbose = false; + Config(verbose); + break; case cReset : // EED - this->mExecuter->Reset(); - break; + this->mExecuter->Reset(); + break; case cInclude : - if (mCommandLine) - { + if (mCommandLine) + { InterpretFile(words[1], true, verbose); // true : better pass use_config_file - } - else - { + } + else + { SwitchToFile(words[1], true, verbose); // true : better pass use_config_file - } - break; + } + break; case cLoad: - LoadPackage(words[1], true, verbose); // true : better pass use_config_file - break; + LoadPackage(words[1], true, verbose); // true : better pass use_config_file + break; case cUnload: - UnLoadPackage(words[1]); - break; + UnLoadPackage(words[1]); + break; case cQuit : - throw QuitException(); - break; + throw QuitException(); + break; - case cWorkspace : - if (words.size() == 2) - { - if (words[1]=="freeze") mExecuter->SetNoExecMode(true); - else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false); - } - else - { - mExecuter->SetWorkspaceName(words[2]); - } - break; + case cWorkspace : + if (words.size() == 2) + { + if (words[1]=="freeze") mExecuter->SetNoExecMode(true); + else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false); + } + else + { + mExecuter->SetWorkspaceName(words[2]); + } + break; default: - bbtkInternalError("should not reach here !!!"); + bbtkInternalError("should not reach here !!!"); } bbtkDecTab("Interpreter",9); @@ -700,6 +700,13 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& void Interpreter::SwitchToFile( const std::string& name, bool use_configuration_file, bool verbose) { + // Note : in the following : + // name : the user supplied name + // - abreviated name e.g. scr scr.bbs + // - relative full name e.g. ./scr.bbs ../../scr.bbs + // - absolute full name e.g. /home/usrname/proj/dir/scr.bbs + // same for Windows, with c:, d: ... + // bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \"" <& std::string pkgname; // e.g. .bbs pkgname = Utilities::ExtractScriptName(name); - +std::cout << "pkgname [" << pkgname << "] name [" << name << "]" << std::endl; if (use_configuration_file) { if (verbose) @@ -719,10 +726,10 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& bool fullnameGiven = false; bool foundFile = false; std::string::size_type slash_position = name.find_last_of("/\\"); - + if (slash_position != std::string::npos) - { - fullnameGiven = true; + { // ------------------------------------- check user supplied location + fullnameGiven = true; libname = Utilities::ExpandLibName(name, verbose); if (libname != "") { if ( Utilities::FileExists(libname)) @@ -731,9 +738,9 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& } } } - else // ----------------------- iterate on the paths + else // ------------------------------------- iterate on the paths { - std::string path; + std::string path; std::vector::iterator i; for (i=script_paths.begin();i!=script_paths.end();++i) { @@ -743,7 +750,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& if (path == ".") { char buf[2048]; // for getcwd char * currentDir = getcwd(buf, 2048); - std::string cwd(currentDir); + std::string cwd(currentDir); path = currentDir; } @@ -752,9 +759,12 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& // Check if library exists if ( ! Utilities::FileExists(libname) ) { + // The following is *NOT* a debug time message : + // It's a user intended message. + // Please don't remove it. if (verbose) std::cout <<" [" <& { if (fullnameGiven) if(libname == "") - bbtkError("Path \""<& s->open(libname.c_str()); if (!s->good()) { - bbtkError("Could not open file \""<& words) bool insideComment = false; // for multiline comment do { - try + try { std::string line; GetLineFromPrompt(line); @@ -1323,7 +1333,7 @@ void Interpreter::Help(const std::vector& words) } catch (std::exception& e) { - std::cerr << "* ERROR : "<.so @@ -117,8 +123,8 @@ namespace bbtk // remove {bb} if any if (memcmp (pkgname.c_str(), "bb", 2) == 0) { pkgname = pkgname.substr(2, pkgname.length()); - } - + } + /* /// \ \todo what would happen if (stupid) user names his package 'bb' ?!? /// \ --> Should be forbidden! @@ -159,20 +165,28 @@ namespace bbtk char * currentDir = getcwd(buf, 2048); std::string cwd(currentDir); std::string libname(name); - + std::string fileSeparator; + fileSeparator = ConfigurationFile::GetInstance().Get_file_separator(); // tooHigh : true is user supplies a library pathname with too many "../" bool tooHigh = false; - + +//std::cout << "------------------cwd [" << cwd << "]" << std::endl; + if ( name[0] == '/' || name[0] == '\\' ) { return(libname); - } - else if (name[0] == '.' && (name[1] == '/' || name[1] == '\\') ) + } + else if ( name =="." ) { - libname = cwd + ConfigurationFile::GetInstance().Get_file_separator () + name.substr(2, name.length()); + libname = cwd + fileSeparator; return(libname); - } - else if ( name[0] == '.' && name[1] == '.' && (name[2] == '/' || name[2] == '\\') ) + } + else if (name[0] == '.' && (name[1] == '/' || name[1] == '\\') ) + { + libname = cwd + fileSeparator + name.substr(2, name.length()); + return(libname); + } + else if ( name[0] == '.' && name[1] == '.' /* && (name[2] == '/' || name[2] == '\\') */ ) { if ( IsAtRoot(cwd) ) // hope it gets / (for Linux), C: D: (for Windows) { @@ -186,18 +200,30 @@ namespace bbtk // iterate on ../ and go up from the current working dir! std::string a(name); bool alreadyProcessRoot = false; - for(;;) + + //if (a[a.size()-1] != fileSeparator[0]) + // a.append(fileSeparator); +//std::cout << "------------------a [" << a << "]" << std::endl; + + for(;;) // wild loop ! { - std::string::size_type slash_position = cwd.find_last_of(ConfigurationFile::GetInstance().Get_file_separator ()); + std::string::size_type slash_position = cwd.find_last_of(fileSeparator); if (slash_position != std::string::npos) { if (slash_position == 0) slash_position = 1; cwd = cwd.substr(0,slash_position/*+1*/); - a = a.substr(3, name.length()); // remove ../ +//std::cout << "------------------cwd [" << cwd << "]" << std::endl; + // if (a == "..") { + // a = ""; + // break; + // } + // else + a = a.substr(3, /*name.length()*/ a.length()); // remove ../ +//std::cout << "------------------a [" << a << "]" << std::endl; if (a == "" || alreadyProcessRoot) { if (verbose) - std::cout << " File path [" << name << "] doesn't exist" << std::endl; + std::cout << " File path : [" << name << "] doesn't exist" << std::endl; tooHigh = true; break; } @@ -205,7 +231,7 @@ namespace bbtk libname = cwd; char c = cwd[cwd.size()-1]; if (c != '/' && c != '\\' ) - libname += ConfigurationFile::GetInstance().Get_file_separator (); + libname += fileSeparator; libname += a; if ( a[0] != '.' ) // if . (probabely ../), loop again @@ -216,12 +242,14 @@ namespace bbtk } } // end iterating on ../ } +//std::cout << "------------------out of loop]" << std::endl; if (tooHigh) libname=""; return (libname); } // ----- End of expanding path name ( ./ ../ ../../ ) + std::cout <<"* ERROR in ExpandLibName : should never get here!" << std::endl; // To avoid warning return(""); // Will never get here! } @@ -235,6 +263,8 @@ namespace bbtk #if defined(__GNUC__) if (c != '/') libname += "/libbb"; + else + libname += "libbb"; libname += pkgname; libname += ".so"; @@ -271,6 +301,7 @@ namespace bbtk return(false); } + // =================================================================================== static inline void SplitAroundFirstDot( const std::string& in, @@ -287,12 +318,14 @@ namespace bbtk } else { - // bbtkError(in<<" : expected 'a.b' format but no dot found"); - left =""; - right = ""; + // bbtkError(in<<" : expected 'a.b' format but no dot found"); + left =""; + right = ""; } } +// =================================================================================== + static inline std::string get_file_name(const std::string& s) { std::string::size_type slash_position = s.find_last_of("/\\"); @@ -308,9 +341,9 @@ namespace bbtk //======================================================================== - // Usefull functions for html generation - - //======================================================================== + // Usefull functions for html generation + //======================================================================== + static inline void replace( std::string& str, const std::string& from, const std::string& to ) @@ -325,7 +358,6 @@ namespace bbtk } //======================================================================== - //======================================================================== static inline void html_format(std::string& str) { replace( str, "&", "&" ); -- 2.47.1