--- /dev/null
+/**
+ * Implements a singleton that maintains program resources.
+ * The single instance is (re)instantiated on demand like:
+ * Resources *res = Resources::Instance();
+ *
+ * 24-05-07,Nigel Brown(EMBL): created.
+ * 3-7-07, Mark Larkin, modified this class for clustalw
+ */
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+#include "ClustalWResources.h"
+#include <iostream>
+#include "clustalw.h"
+#include <fstream>
+using namespace std;
+
+namespace clustalw
+{
+
+//environment variables
+static const char *CLUW_INSTALL_DIR = "CLUW_INSTALL_DIR";
+
+//return the sole instance
+ClustalWResources *ClustalWResources::Instance() {
+ static ClustalWResources instance;
+ return &instance;
+}
+
+ClustalWResources::ClustalWResources()
+{
+ //defaultPath
+ defaultPath = ".";
+
+ //executablePath
+ executablePath = ".";
+
+ //installPath
+ installPath = ".";
+ char *env;
+ if ((env = getenv(CLUW_INSTALL_DIR)) != 0)
+ {
+ installPath = string(env);
+ }
+
+ homePath = "";
+}
+
+void ClustalWResources::setPathToExecutable(string path)
+{
+ executablePath = dirname(path);
+}
+
+string ClustalWResources::dirname(string path)
+{
+ string tempString;
+ int size = path.size();
+ tempString = path;
+ for (int i = size - 1; i > 0; i--)
+ {
+ if (tempString[i] == DIRDELIM) // Mark, no standard function in c++
+ {
+ tempString.erase(i);
+ break;
+ }
+ }
+ return tempString;
+}
+
+void ClustalWResources::dump()
+{
+ printf("%s => %s [%s]\n%s => %s\n%s => %s\n",
+ "installPath", installPath.c_str(), CLUW_INSTALL_DIR,
+ "executablePath", executablePath.c_str(),
+ "homePath", homePath.c_str()
+ );
+}
+
+string ClustalWResources::findFile(const char *file, const ClustalWResourcePathType where) const
+{
+ return findFile(string(file), where);
+}
+
+string ClustalWResources::findFile(const string file, const ClustalWResourcePathType where) const
+{
+ const string *path;
+ ifstream ifs;
+
+ switch (where)
+ {
+ case InstallPath:
+ path = &installPath;
+ break;
+ case ExecutablePath:
+ path = &executablePath;
+ break;
+ case HomePath:
+ path = &homePath;
+ break;
+ default:
+ path = &defaultPath;
+ break;
+ }
+ char delim[1];
+ delim[0] = DIRDELIM;
+ delim[1] = 0;
+
+ string fileName = *path + string(delim) + file;
+
+ ifs.open(fileName.c_str(), ifstream::in);
+ if (ifs.fail()) {
+ return string();
+ }
+
+ if (ifs.is_open() && ifs.good())
+ {
+ ifs.close();
+ return fileName;
+ }
+ return string(); //not found/readable
+}
+
+// Search for a (string) file in a succession of likely locations and
+// return the full path as (string).
+//
+string ClustalWResources::searchPathsForFile(const string fileName) const
+{
+ string file;
+ while (1) {
+ file = findFile(fileName, InstallPath);
+ if (file != "") break;
+
+ file = findFile(fileName, ExecutablePath);
+ if (file != "") break;
+
+ file = findFile(fileName, HomePath);
+ if (file != "") break;
+
+ file = findFile(fileName);
+ if (file != "") break;
+
+ file = fileName; // give up
+ break;
+ }
+ return file;
+}
+
+}