# HG changeset patch # User Christian Kamm # Date 1244483300 -7200 # Node ID a048f31bf9f6afafc7d939a729d40ed3a79e5249 # Parent ca31a8e9c42bb5434ada7a47960c73819a26dddb Move locating the configuration file into a separate function. Also look in PREFIX/etc/ldc. Fixes #322. diff -r ca31a8e9c42b -r a048f31bf9f6 gen/configfile.cpp --- a/gen/configfile.cpp Mon Jun 08 13:52:45 2009 +0200 +++ b/gen/configfile.cpp Mon Jun 08 19:48:20 2009 +0200 @@ -40,53 +40,63 @@ #endif +bool ConfigFile::locate(sys::Path& p, const char* argv0, void* mainAddr, const char* filename) +{ + // 1) try the current working dir + p = sys::Path::GetCurrentDirectory(); + p.appendComponent(filename); + if (p.exists()) + return true; + + // 2) try the user home dir + p = sys::Path::GetUserHomeDirectory(); + p.appendComponent(filename); + if (p.exists()) + return true; + + // 3) try the install-prefix/etc + p = sys::Path(LDC_INSTALL_PREFIX); +#if !_WIN32 + // Does Windows need something similar? + p.appendComponent("etc"); +#endif + p.appendComponent(filename); + if (p.exists()) + return true; + + // 4) try the install-prefix/etc/ldc + p = sys::Path(LDC_INSTALL_PREFIX); +#if !_WIN32 + // Does Windows need something similar? + p.appendComponent("etc"); + p.appendComponent("ldc"); +#endif + p.appendComponent(filename); + if (p.exists()) + return true; + + // 5) try next to the executable +#if _WIN32 + p = ConfigGetExePath(p); +#else + p = sys::Path::GetMainExecutable(argv0, mainAddr); + p.eraseComponent(); +#endif + p.appendComponent(filename); + if (p.exists()) + return true; + + return false; +} + bool ConfigFile::read(const char* argv0, void* mainAddr, const char* filename) { - -#if _WIN32 - std::string exeDirectoryName; -#endif - // try to find the config file - - // 1) try the current working dir - sys::Path p = sys::Path::GetCurrentDirectory(); - p.appendComponent(filename); - - if (!p.exists()) - { - // 2) try the user home dir - p = sys::Path::GetUserHomeDirectory(); - p.appendComponent(filename); - - if (!p.exists()) - { - // 3) try the install-prefix/etc - p = sys::Path(LDC_INSTALL_PREFIX); - #if !_WIN32 - // Does Window need something similar? - p.appendComponent("etc"); - #endif - p.appendComponent(filename); - - if (!p.exists()) - { - #if _WIN32 - p = ConfigGetExePath(p); - exeDirectoryName = p.toString(); - #else - // 4) try next to the executable - p = sys::Path::GetMainExecutable(argv0, mainAddr); - p.eraseComponent(); - #endif - p.appendComponent(filename); - if (!p.exists()) - { - // 5) fail load cfg, users still have the DFLAGS environment var - std::cerr << "Error failed to locate the configuration file: " << filename << std::endl; - return false; - } - } - } + sys::Path p; + if (!locate(p, argv0, mainAddr, filename)) + { + // failed to find cfg, users still have the DFLAGS environment var + std::cerr << "Error failed to locate the configuration file: " << filename << std::endl; + return false; } // save config file path for -v output @@ -116,16 +126,9 @@ std::string binpathkey = "%%ldcbinarypath%%"; #if _WIN32 - std::string binpath; - //This will happen if ldc.conf is found somewhere other than - //beside the ldc executable - if (exeDirectoryName == "") - { - sys::Path p; - p = ConfigGetExePath(p); - exeDirectoryName = p.toString(); - } - binpath = exeDirectoryName; + sys::Path p; + p = ConfigGetExePath(p); + std::string binpath = p.toString(); #else std::string binpath = sys::Path::GetMainExecutable(argv0, mainAddr).getDirname(); #endif diff -r ca31a8e9c42b -r a048f31bf9f6 gen/configfile.h --- a/gen/configfile.h Mon Jun 08 13:52:45 2009 +0200 +++ b/gen/configfile.h Mon Jun 08 19:48:20 2009 +0200 @@ -27,6 +27,8 @@ const std::string& path() { return pathstr; } private: + bool locate(llvm::sys::Path& path, const char* argv0, void* mainAddr, const char* filename); + libconfig::Config* cfg; std::string pathstr;