Mercurial > projects > ldc
diff gen/configfile.cpp @ 1103:b30fe7e1dbb9
- Updated to DMD frontend 1.041.
- Removed dmd/inifile.c , it's not under a free license, replaced with libconfig based config file.
author | Tomas Lindquist Olsen <tomas.l.olsen gmail.com> |
---|---|
date | Thu, 12 Mar 2009 20:37:27 +0100 |
parents | |
children | 454f0c8acc4b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/configfile.cpp Thu Mar 12 20:37:27 2009 +0100 @@ -0,0 +1,112 @@ +#include <iostream> +#include <string> +#include <cassert> + +#include "llvm/System/Path.h" + +#include "libconfig.h++" + +#include "gen/configfile.h" + +#include "mars.h" + +namespace sys = llvm::sys; + +ConfigFile::ConfigFile() +{ + cfg = new libconfig::Config; +} + +ConfigFile::~ConfigFile() +{ + delete cfg; +} + +bool ConfigFile::read(const char* argv0, void* mainAddr, const char* filename) +{ + + // 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); + p.appendComponent(filename); + + if (!p.exists()) + { + // 4) try next to the executable + p = sys::Path::GetMainExecutable(argv0, mainAddr); + p.eraseComponent(); + 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; + } + } + } + } + + try + { + // read the cfg + cfg->readFile(p.c_str()); + + // make sure there's a default group + if (!cfg->exists("default")) + { + std::cerr << "no default settings in configuration file" << std::endl; + return false; + } + libconfig::Setting& root = cfg->lookup("default"); + if (!root.isGroup()) + { + std::cerr << "default is not a group" << std::endl; + return false; + } + + // handle switches + if (root.exists("switches")) + { + libconfig::Setting& arr = cfg->lookup("default.switches"); + int len = arr.getLength(); + for (int i=0; i<len; i++) + { + const char* v = arr[i]; + switches.push_back(v); + } + } + + } + catch(libconfig::FileIOException& fioe) + { + std::cerr << "Error reading configuration file: " << filename << std::endl; + return false; + } + catch(libconfig::ParseException& pe) + { + std::cerr << "Error parsing configuration file: " << filename + << "(" << pe.getLine() << "): " << pe.getError() << std::endl; + return false; + } + catch(...) + { + std::cerr << "Unknown exception caught!" << std::endl; + return false; + } + + return true; +} +