/*] 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 #include "Log.hh" #include "Resource.hh" namespace Mf { // static member std::vector Resource::gSearchPaths; void Resource::addSearchPaths(const std::string& paths) { std::vector pathList; boost::split(pathList, paths, boost::is_any_of(":")); addSearchPaths(pathList); } void Resource::addSearchPaths(const std::vector& pathList) { std::vector::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 preList; boost::split(preList, prefix, boost::is_any_of(":")); std::vector postList; boost::split(postList, extension, boost::is_any_of(":")); std::vector::iterator it; for (it = gSearchPaths.begin(); it != gSearchPaths.end(); ++it) { std::vector::iterator jt; for (jt = preList.begin(); jt != preList.end(); ++jt) { std::vector::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