/*] 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 moof { // static member std::vector resource::search_paths_; void resource::add_search_paths(const std::string& paths) { std::vector pathList; boost::split(pathList, paths, boost::is_any_of(":")); add_search_paths(pathList); } void resource::add_search_paths(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 search_paths_.push_back(path); log_info << "added search path " << path << std::endl; } } bool resource::find_path(std::string& path, const std::string& prefix, const std::string& extension) { FILE* file = open_file(path, prefix, extension); if (file) { fclose(file); return true; } return false; } FILE* resource::open_file(std::string& path, const std::string& prefix, const std::string& extension, const std::string& mode) { #if defined(_WIN32) // windows always has to be a little different boost::replace_all(path, "/", "\\"); std::string temp_prefix(prefix); boost::replace_all(temp_prefix, "/", "\\"); std::vector preList; boost::split(preList, temp_prefix, boost::is_any_of(":")); #else std::vector preList; boost::split(preList, prefix, boost::is_any_of(":")); #endif std::vector postList; boost::split(postList, extension, boost::is_any_of(":")); std::vector::iterator it; for (it = search_paths_.begin(); it != search_paths_.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 moof