diff options
Diffstat (limited to '')
-rw-r--r-- | lib/libconfigcpp.c++ (renamed from libconfigcpp.c++) | 239 |
1 files changed, 147 insertions, 92 deletions
diff --git a/libconfigcpp.c++ b/lib/libconfigcpp.c++ index 82ad56e..846c067 100644 --- a/libconfigcpp.c++ +++ b/lib/libconfigcpp.c++ @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- libconfig - A library for processing structured configuration files - Copyright (C) 2005-2009 Mark A Lindner + Copyright (C) 2005-2010 Mark A Lindner This file is part of libconfig. @@ -27,17 +27,27 @@ #endif #include "wincompat.h" - -using namespace libconfig; +#include "libconfig.h" #include <cstring> #include <cstdlib> #include <sstream> +namespace libconfig { + +// --------------------------------------------------------------------------- + +ParseException::ParseException(const char *file, int line, const char *error) + : _file(file ? ::strdup(file) : NULL), _line(line), _error(error) +{ +} + // --------------------------------------------------------------------------- -ParseException::ParseException(int line, const char *error) - : _line(line), _error(error) +ParseException::ParseException(const ParseException &other) + : _file(other._file ? ::strdup(other._file) : NULL), + _line(other._line), + _error(other._error) { } @@ -45,6 +55,7 @@ ParseException::ParseException(int line, const char *error) ParseException::~ParseException() throw() { + ::free((void *)_file); } // --------------------------------------------------------------------------- @@ -290,46 +301,117 @@ void Config::ConfigDestructor(void *arg) // --------------------------------------------------------------------------- Config::Config() + : _defaultFormat(Setting::FormatDefault) { - config_init(& _config); - config_set_destructor(& _config, ConfigDestructor); + _config = new config_t; + config_init(_config); + config_set_destructor(_config, ConfigDestructor); } // --------------------------------------------------------------------------- Config::~Config() { - config_destroy(& _config); + config_destroy(_config); + delete _config; } // --------------------------------------------------------------------------- void Config::setAutoConvert(bool flag) { - config_set_auto_convert(& _config, (flag ? CONFIG_TRUE : CONFIG_FALSE)); + config_set_auto_convert(_config, (flag ? CONFIG_TRUE : CONFIG_FALSE)); } // --------------------------------------------------------------------------- bool Config::getAutoConvert() const { - return(config_get_auto_convert(& _config) != CONFIG_FALSE); + return(config_get_auto_convert(_config) != CONFIG_FALSE); +} + +// --------------------------------------------------------------------------- + +void Config::setDefaultFormat(Setting::Format format) +{ + if(format == Setting::FormatHex) + _defaultFormat = Setting::FormatHex; + else + _defaultFormat = Setting::FormatDefault; + + config_set_default_format(_config, static_cast<short>(_defaultFormat)); +} + +// --------------------------------------------------------------------------- + +void Config::setTabWidth(unsigned short width) throw() +{ + config_set_tab_width(_config, width); +} + +// --------------------------------------------------------------------------- + +unsigned short Config::getTabWidth() const throw() +{ + return(config_get_tab_width(_config)); +} + +// --------------------------------------------------------------------------- + +void Config::setIncludeDir(const char *includeDir) throw() +{ + config_set_include_dir(_config, includeDir); +} + +// --------------------------------------------------------------------------- + +const char *Config::getIncludeDir() const throw() +{ + return(config_get_include_dir(_config)); +} + +// --------------------------------------------------------------------------- + +void Config::handleError() const +{ + switch(config_error_type(_config)) + { + case CONFIG_ERR_NONE: + break; + + case CONFIG_ERR_PARSE: + throw ParseException(config_error_file(_config), + config_error_line(_config), + config_error_text(_config)); + break; + + case CONFIG_ERR_FILE_IO: + default: + throw FileIOException(); + } } // --------------------------------------------------------------------------- void Config::read(FILE *stream) throw(ParseException) { - if(! config_read(& _config, stream)) - throw ParseException(config_error_line(& _config), - config_error_text(& _config)); + if(! config_read(_config, stream)) + handleError(); +} + +// --------------------------------------------------------------------------- + +void Config::readString(const char *str) throw(ParseException) +{ + if(! config_read_string(_config, str)) + handleError(); } // --------------------------------------------------------------------------- void Config::write(FILE *stream) const { - config_write(& _config, stream); + config_write(_config, stream); } // --------------------------------------------------------------------------- @@ -337,27 +419,16 @@ void Config::write(FILE *stream) const void Config::readFile(const char *filename) throw(FileIOException, ParseException) { - FILE *f = fopen(filename, "rt"); - if(f == NULL) - throw FileIOException(); - try - { - read(f); - fclose(f); - } - catch(ParseException& p) - { - fclose(f); - throw p; - } + if(! config_read_file(_config, filename)) + handleError(); } // --------------------------------------------------------------------------- void Config::writeFile(const char *filename) throw(FileIOException) { - if(! config_write_file(& _config, filename)) - throw FileIOException(); + if(! config_write_file(_config, filename)) + handleError(); } // --------------------------------------------------------------------------- @@ -365,7 +436,7 @@ void Config::writeFile(const char *filename) throw(FileIOException) Setting & Config::lookup(const char *path) const throw(SettingNotFoundException) { - config_setting_t *s = config_lookup(& _config, path); + config_setting_t *s = config_lookup(_config, path); if(! s) throw SettingNotFoundException(path); @@ -376,7 +447,7 @@ Setting & Config::lookup(const char *path) const bool Config::exists(const char *path) const throw() { - config_setting_t *s = config_lookup(& _config, path); + config_setting_t *s = config_lookup(_config, path); return(s != NULL); } @@ -404,20 +475,6 @@ bool Config::lookupValue(const char *path, bool &value) const throw() // --------------------------------------------------------------------------- -bool Config::lookupValue(const char *path, long &value) const throw() -{ - CONFIG_LOOKUP_NO_EXCEPTIONS(path, long, value); -} - -// --------------------------------------------------------------------------- - -bool Config::lookupValue(const char *path, unsigned long &value) const throw() -{ - CONFIG_LOOKUP_NO_EXCEPTIONS(path, unsigned long, value); -} - -// --------------------------------------------------------------------------- - bool Config::lookupValue(const char *path, int &value) const throw() { CONFIG_LOOKUP_NO_EXCEPTIONS(path, int, value); @@ -477,7 +534,7 @@ bool Config::lookupValue(const char *path, std::string &value) const throw() Setting & Config::getRoot() const { - return(Setting::wrapSetting(config_root_setting(& _config))); + return(Setting::wrapSetting(config_root_setting(_config))); } // --------------------------------------------------------------------------- @@ -558,6 +615,8 @@ void Setting::setFormat(Format format) throw() } else _format = FormatDefault; + + config_setting_set_format(_setting, static_cast<short>(_format)); } // --------------------------------------------------------------------------- @@ -571,7 +630,7 @@ Setting::operator bool() const throw(SettingTypeException) // --------------------------------------------------------------------------- -Setting::operator long() const throw(SettingTypeException) +Setting::operator int() const throw(SettingTypeException) { assertType(TypeInt); @@ -580,40 +639,36 @@ Setting::operator long() const throw(SettingTypeException) // --------------------------------------------------------------------------- -Setting::operator unsigned long() const throw(SettingTypeException) +Setting::operator unsigned int() const throw(SettingTypeException) { assertType(TypeInt); - long v = config_setting_get_int(_setting); + int v = config_setting_get_int(_setting); if(v < 0) v = 0; - return(static_cast<unsigned long>(v)); + return(static_cast<unsigned int>(v)); } // --------------------------------------------------------------------------- -Setting::operator int() const throw(SettingTypeException) +Setting::operator long() const throw(SettingTypeException) { - assertType(TypeInt); - - // may cause loss of precision: - return(static_cast<int>(config_setting_get_int(_setting))); + if(sizeof(long) == sizeof(long long)) + return operator long long(); + else + return operator int(); } // --------------------------------------------------------------------------- -Setting::operator unsigned int() const throw(SettingTypeException) +Setting::operator unsigned long() const throw(SettingTypeException) { - assertType(TypeInt); - - long v = config_setting_get_int(_setting); - - if(v < 0) - v = 0; - - return(static_cast<unsigned int>(v)); + if(sizeof(long) == sizeof(long long)) + return operator unsigned long long(); + else + return operator unsigned int(); } // --------------------------------------------------------------------------- @@ -695,7 +750,7 @@ Setting & Setting::operator=(bool value) throw(SettingTypeException) // --------------------------------------------------------------------------- -Setting & Setting::operator=(long value) throw(SettingTypeException) +Setting & Setting::operator=(int value) throw(SettingTypeException) { assertType(TypeInt); @@ -706,15 +761,12 @@ Setting & Setting::operator=(long value) throw(SettingTypeException) // --------------------------------------------------------------------------- -Setting & Setting::operator=(int value) throw(SettingTypeException) +Setting & Setting::operator=(long value) throw(SettingTypeException) { - assertType(TypeInt); - - long cvalue = static_cast<long>(value); - - config_setting_set_int(_setting, cvalue); - - return(*this); + if(sizeof(long) == sizeof(long long)) + return(operator=(static_cast<long long>(value))); + else + return(operator=(static_cast<int>(value))); } // --------------------------------------------------------------------------- @@ -830,21 +882,6 @@ bool Setting::lookupValue(const char *name, bool &value) const throw() // --------------------------------------------------------------------------- -bool Setting::lookupValue(const char *name, long &value) const throw() -{ - SETTING_LOOKUP_NO_EXCEPTIONS(name, long, value); -} - -// --------------------------------------------------------------------------- - -bool Setting::lookupValue(const char *name, unsigned long &value) - const throw() -{ - SETTING_LOOKUP_NO_EXCEPTIONS(name, unsigned long, value); -} - -// --------------------------------------------------------------------------- - bool Setting::lookupValue(const char *name, int &value) const throw() { SETTING_LOOKUP_NO_EXCEPTIONS(name, int, value); @@ -852,7 +889,8 @@ bool Setting::lookupValue(const char *name, int &value) const throw() // --------------------------------------------------------------------------- -bool Setting::lookupValue(const char *name, unsigned int &value) const throw() +bool Setting::lookupValue(const char *name, unsigned int &value) + const throw() { SETTING_LOOKUP_NO_EXCEPTIONS(name, unsigned int, value); } @@ -963,6 +1001,20 @@ Setting & Setting::getParent() throw(SettingNotFoundException) // --------------------------------------------------------------------------- +unsigned int Setting::getSourceLine() const throw() +{ + return(config_setting_source_line(_setting)); +} + +// --------------------------------------------------------------------------- + +const char *Setting::getSourceFile() const throw() +{ + return(config_setting_source_file(_setting)); +} + +// --------------------------------------------------------------------------- + bool Setting::isRoot() const throw() { return(config_setting_is_root(_setting)); @@ -1037,8 +1089,8 @@ Setting & Setting::add(Setting::Type type) throw(SettingTypeException) } else { - if((type != TypeInt) && (type != TypeFloat) && (type != TypeString) - && (type != TypeBoolean)) + if((type != TypeInt) && (type != TypeInt64) && (type != TypeFloat) + && (type != TypeString) && (type != TypeBoolean)) throw SettingTypeException(*this, idx); } } @@ -1085,7 +1137,7 @@ void Setting::assertType(Setting::Type type) const throw(SettingTypeException) if(type != _type) { if(!(isNumber() && config_get_auto_convert(_setting->config) - && ((type == TypeInt) || (type == TypeFloat)))) + && ((type == TypeInt) || (type == TypeInt64) || (type == TypeFloat)))) throw SettingTypeException(*this); } } @@ -1109,4 +1161,7 @@ Setting & Setting::wrapSetting(config_setting_t *s) } // --------------------------------------------------------------------------- + +}; // namespace libconfig + // eof |