+++ /dev/null
-
-/*] Copyright (c) 2009-2010, Charles McGarvey [**************************
-**] All rights reserved.
-*
-* vi:ts=4 sw=4 tw=75
-*
-* Distributable under the terms and conditions of the 2-clause BSD license;
-* see the file COPYING for a complete text of the license.
-*
-**************************************************************************/
-
-#include <boost/algorithm/string.hpp>
-
-#include "Log.hh"
-#include "Resource.hh"
-
-
-namespace Mf {
-
-
-// static member
-std::vector<std::string> Resource::gSearchPaths;
-
-
-void Resource::addSearchPaths(const std::string& paths)
-{
- std::vector<std::string> pathList;
- boost::split(pathList, paths, boost::is_any_of(":"));
-
- addSearchPaths(pathList);
-}
-
-void Resource::addSearchPaths(const std::vector<std::string>& pathList)
-{
- std::vector<std::string>::const_iterator it;
- for (it = pathList.begin(); it != pathList.end(); ++it)
- {
- std::string path(*it);
-
- ASSERT(!path.empty() && "empty search path string");
-
- // add a slash if there isn't one already
- if (*path.rbegin() != '/') path += '/';
-
-#if defined(_WIN32)
- boost::replace_all(path, "/", "\\");
-#endif
-
- gSearchPaths.push_back(path);
- logInfo << "added search path " << path << std::endl;
- }
-}
-
-
-std::string Resource::getPath(const std::string& path,
- const std::string& prefix,
- const std::string& extension)
-{
- std::string realPath(path);
- if (getPath(realPath, prefix, extension)) return realPath;
-
- return std::string();
-}
-
-bool Resource::getPath(std::string& path,
- const std::string& prefix,
- const std::string& extension)
-{
- FILE* file = openFile(path, prefix, extension);
- if (file)
- {
- fclose(file);
- return true;
- }
-
- return false;
-}
-
-FILE* Resource::openFile(std::string& path,
- std::string prefix,
- const std::string& extension,
- const std::string& mode)
-{
-#if defined(_WIN32)
- // Windows always has to be the odd one.
- boost::replace_all(path, "/", "\\");
- boost::replace_all(prefix, "/", "\\");
-#endif
-
- std::vector<std::string> preList;
- boost::split(preList, prefix, boost::is_any_of(":"));
- std::vector<std::string> postList;
- boost::split(postList, extension, boost::is_any_of(":"));
-
- std::vector<std::string>::iterator it;
- for (it = gSearchPaths.begin(); it != gSearchPaths.end(); ++it)
- {
- std::vector<std::string>::iterator jt;
- for (jt = preList.begin(); jt != preList.end(); ++jt)
- {
- std::vector<std::string>::iterator kt;
- for (kt = postList.begin(); kt != postList.end(); ++kt)
- {
- std::string realPath(*it);
- realPath += *jt;
- realPath += path;
- realPath += ".";
- realPath += *kt;
-
- FILE* file = fopen(realPath.c_str(), mode.c_str());
- if (file)
- {
- path = realPath;
- return file;
- }
- }
- }
-
- // check path relative to search path
- std::string realPath(*it);
- realPath += path;
-
- FILE* file = fopen(realPath.c_str(), mode.c_str());
- if (file)
- {
- path = realPath;
- return file;
- }
- }
-
- // last ditch effort; maybe it's already a path to a valid resource
- return fopen(path.c_str(), mode.c_str());
-}
-
-
-} // namespace Mf
-