void Application::addDataDirectory(const std::string& dir) { std::unique_lock<std::mutex> dirLock(dir_mutex); if (inputDirs.empty()) { setDefaultDirectories(); } string d = stripnonprint(dir); // Expand "~/" to user's home directory, if possible if (d.find("~/") == 0 || d.find("~\\") == 0) { char* home = getenv("HOME"); // POSIX systems if (!home) { home = getenv("USERPROFILE"); // Windows systems } if (home) { d = home + d.substr(1, npos); } } // Remove any existing entry for this directory auto iter = std::find(inputDirs.begin(), inputDirs.end(), d); if (iter != inputDirs.end()) { inputDirs.erase(iter); } // Insert this directory at the beginning of the search path inputDirs.insert(inputDirs.begin(), d); }
std::string Application::findInputFile(const std::string& name) { std::unique_lock<std::mutex> dirLock(dir_mutex); string::size_type islash = name.find('/'); string::size_type ibslash = name.find('\\'); string inname; std::vector<string>& dirs = inputDirs; // Expand "~/" to user's home directory, if possible if (name.find("~/") == 0) { char* home = getenv("HOME"); // POSIX systems if (!home) { home = getenv("USERPROFILE"); // Windows systems } if (home) { return home + name.substr(1, npos); } } if (islash == string::npos && ibslash == string::npos) { size_t nd = dirs.size(); inname = ""; for (size_t i = 0; i < nd; i++) { inname = dirs[i] + "/" + name; std::ifstream fin(inname); if (fin) { fin.close(); return inname; } } string msg; msg = "\nInput file " + name + " not found in director"; msg += (nd == 1 ? "y " : "ies "); for (size_t i = 0; i < nd; i++) { msg += "\n'" + dirs[i] + "'"; if (i+1 < nd) { msg += ", "; } } msg += "\n\n"; msg += "To fix this problem, either:\n"; msg += " a) move the missing files into the local directory;\n"; msg += " b) define environment variable CANTERA_DATA to\n"; msg += " point to the directory containing the file."; throw CanteraError("findInputFile", msg); } return name; }
void Application::addDataDirectory(const std::string& dir) { std::unique_lock<std::mutex> dirLock(dir_mutex); if (inputDirs.empty()) { setDefaultDirectories(); } string d = stripnonprint(dir); // Remove any existing entry for this directory auto iter = std::find(inputDirs.begin(), inputDirs.end(), d); if (iter != inputDirs.end()) { inputDirs.erase(iter); } // Insert this directory at the beginning of the search path inputDirs.insert(inputDirs.begin(), d); }