/* ---------------------------------------------------------------------------- libconfig - A library for processing structured configuration files Copyright (C) 2005-2010 Mark A Lindner This file is part of libconfig. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, see . ---------------------------------------------------------------------------- */ #ifndef __libconfig_hpp #define __libconfig_hpp #include #include #include #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) #if defined(LIBCONFIGXX_STATIC) #define LIBCONFIGXX_API #elif defined(LIBCONFIGXX_EXPORTS) #define LIBCONFIGXX_API __declspec(dllexport) #else /* ! LIBCONFIGXX_EXPORTS */ #define LIBCONFIGXX_API __declspec(dllimport) #endif /* LIBCONFIGXX_STATIC */ #else /* ! WIN32 */ #define LIBCONFIGXX_API #endif /* WIN32 */ #define LIBCONFIGXX_VER_MAJOR 1 #define LIBCONFIGXX_VER_MINOR 4 #define LIBCONFIGXX_VER_REVISION 9 struct config_t; // fwd decl struct config_setting_t; // fwd decl namespace libconfig { class LIBCONFIGXX_API ConfigException : public std::exception { }; class Setting; // fwd decl class LIBCONFIGXX_API SettingException : public ConfigException { friend class Config; public: SettingException(const SettingException &other); SettingException& operator=(const SettingException &other); virtual ~SettingException() throw(); const char *getPath() const; virtual const char *what() const throw(); protected: SettingException(const Setting &setting); SettingException(const Setting &setting, int idx); SettingException(const Setting &setting, const char *name); SettingException(const char *path); private: char *_path; }; class LIBCONFIGXX_API SettingTypeException : public SettingException { friend class Config; friend class Setting; public: virtual const char *what() const throw(); private: SettingTypeException(const Setting &setting); SettingTypeException(const Setting &setting, int idx); SettingTypeException(const Setting &setting, const char *name); }; class LIBCONFIGXX_API SettingNotFoundException : public SettingException { friend class Config; friend class Setting; public: virtual const char *what() const throw(); private: SettingNotFoundException(const Setting &setting, int idx); SettingNotFoundException(const Setting &setting, const char *name); SettingNotFoundException(const char *path); }; class LIBCONFIGXX_API SettingNameException : public SettingException { friend class Config; friend class Setting; public: virtual const char *what() const throw(); private: SettingNameException(const Setting &setting, const char *name); }; class LIBCONFIGXX_API FileIOException : public ConfigException { public: virtual const char *what() const throw(); }; class LIBCONFIGXX_API ParseException : public ConfigException { friend class Config; public: ParseException(const ParseException &other); virtual ~ParseException() throw(); inline const char *getFile() const throw() { return(_file); } inline int getLine() const throw() { return(_line); } inline const char *getError() const throw() { return(_error); } virtual const char *what() const throw(); private: ParseException(const char *file, int line, const char *error); const char *_file; int _line; const char *_error; }; class LIBCONFIGXX_API Setting { friend class Config; public: enum Type { TypeNone = 0, // scalar types TypeInt, TypeInt64, TypeFloat, TypeString, TypeBoolean, // aggregate types TypeGroup, TypeArray, TypeList }; enum Format { FormatDefault = 0, FormatHex = 1 }; private: config_setting_t *_setting; Type _type; Format _format; Setting(config_setting_t *setting); void assertType(Type type) const throw(SettingTypeException); static Setting & wrapSetting(config_setting_t *setting); Setting(const Setting& other); // not supported Setting& operator=(const Setting& other); // not supported public: virtual ~Setting() throw(); inline Type getType() const throw() { return(_type); } inline Format getFormat() const throw() { return(_format); } void setFormat(Format format) throw(); operator bool() const throw(SettingTypeException); operator int() const throw(SettingTypeException); operator unsigned int() const throw(SettingTypeException); operator long() const throw(SettingTypeException); operator unsigned long() const throw(SettingTypeException); operator long long() const throw(SettingTypeException); operator unsigned long long() const throw(SettingTypeException); operator double() const throw(SettingTypeException); operator float() const throw(SettingTypeException); operator const char *() const throw(SettingTypeException); operator std::string() const throw(SettingTypeException); inline const char *c_str() const throw(SettingTypeException) { return operator const char*(); } Setting & operator=(bool value) throw(SettingTypeException); Setting & operator=(int value) throw(SettingTypeException); Setting & operator=(long value) throw(SettingTypeException); Setting & operator=(const long long &value) throw(SettingTypeException); Setting & operator=(const double &value) throw(SettingTypeException); Setting & operator=(float value) throw(SettingTypeException); Setting & operator=(const char *value) throw(SettingTypeException); Setting & operator=(const std::string &value) throw(SettingTypeException); Setting & operator[](const char *key) const throw(SettingTypeException, SettingNotFoundException); inline Setting & operator[](const std::string &key) const throw(SettingTypeException, SettingNotFoundException) { return(operator[](key.c_str())); } Setting & operator[](int index) const throw(SettingTypeException, SettingNotFoundException); bool lookupValue(const char *name, bool &value) const throw(); bool lookupValue(const char *name, int &value) const throw(); bool lookupValue(const char *name, unsigned int &value) const throw(); bool lookupValue(const char *name, long long &value) const throw(); bool lookupValue(const char *name, unsigned long long &value) const throw(); bool lookupValue(const char *name, double &value) const throw(); bool lookupValue(const char *name, float &value) const throw(); bool lookupValue(const char *name, const char *&value) const throw(); bool lookupValue(const char *name, std::string &value) const throw(); inline bool lookupValue(const std::string &name, bool &value) const throw() { return(lookupValue(name.c_str(), value)); } inline bool lookupValue(const std::string &name, int &value) const throw() { return(lookupValue(name.c_str(), value)); } inline bool lookupValue(const std::string &name, unsigned int &value) const throw() { return(lookupValue(name.c_str(), value)); } inline bool lookupValue(const std::string &name, long long &value) const throw() { return(lookupValue(name.c_str(), value)); } inline bool lookupValue(const std::string &name, unsigned long long &value) const throw() { return(lookupValue(name.c_str(), value)); } inline bool lookupValue(const std::string &name, double &value) const throw() { return(lookupValue(name.c_str(), value)); } inline bool lookupValue(const std::string &name, float &value) const throw() { return(lookupValue(name.c_str(), value)); } inline bool lookupValue(const std::string &name, const char *&value) const throw() { return(lookupValue(name.c_str(), value)); } inline bool lookupValue(const std::string &name, std::string &value) const throw() { return(lookupValue(name.c_str(), value)); } void remove(const char *name) throw(SettingTypeException, SettingNotFoundException); inline void remove(const std::string & name) throw(SettingTypeException, SettingNotFoundException) { remove(name.c_str()); } void remove(unsigned int idx) throw(SettingTypeException, SettingNotFoundException); inline Setting & add(const std::string & name, Type type) throw(SettingNameException, SettingTypeException) { return(add(name.c_str(), type)); } Setting & add(const char *name, Type type) throw(SettingNameException, SettingTypeException); Setting & add(Type type) throw(SettingTypeException); inline bool exists(const std::string &name) const throw() { return(exists(name.c_str())); } bool exists(const char *name) const throw(); int getLength() const throw(); const char *getName() const throw(); std::string getPath() const; int getIndex() const throw(); const Setting & getParent() const throw(SettingNotFoundException); Setting & getParent() throw(SettingNotFoundException); bool isRoot() const throw(); inline bool isGroup() const throw() { return(_type == TypeGroup); } inline bool isArray() const throw() { return(_type == TypeArray); } inline bool isList() const throw() { return(_type == TypeList); } inline bool isAggregate() const throw() { return(_type >= TypeGroup); } inline bool isScalar() const throw() { return((_type > TypeNone) && (_type < TypeGroup)); } inline bool isNumber() const throw() { return((_type == TypeInt) || (_type == TypeInt64) || (_type == TypeFloat)); } unsigned int getSourceLine() const throw(); const char *getSourceFile() const throw(); }; class LIBCONFIGXX_API Config { private: config_t *_config; static void ConfigDestructor(void *arg); Config(const Config& other); // not supported Config& operator=(const Config& other); // not supported public: Config(); virtual ~Config(); void setAutoConvert(bool flag); bool getAutoConvert() const; void setDefaultFormat(Setting::Format format); inline Setting::Format getDefaultFormat() const { return(_defaultFormat); } void setTabWidth(unsigned short width) throw(); unsigned short getTabWidth() const throw(); void setIncludeDir(const char *includeDir) throw(); const char *getIncludeDir() const throw(); void read(FILE *stream) throw(ParseException); void write(FILE *stream) const; void readString(const char *str) throw(ParseException); inline void readString(const std::string &str) throw(ParseException) { return(readString(str.c_str())); } void readFile(const char *filename) throw(FileIOException, ParseException); void writeFile(const char *filename) throw(FileIOException); inline Setting & lookup(const std::string &path) const throw(SettingNotFoundException) { return(lookup(path.c_str())); } Setting & lookup(const char *path) const throw(SettingNotFoundException); inline bool exists(const std::string & path) const throw() { return(exists(path.c_str())); } bool exists(const char *path) const throw(); bool lookupValue(const char *path, bool &value) const throw(); bool lookupValue(const char *path, int &value) const throw(); bool lookupValue(const char *path, unsigned int &value) const throw(); bool lookupValue(const char *path, long long &value) const throw(); bool lookupValue(const char *path, unsigned long long &value) const throw(); bool lookupValue(const char *path, double &value) const throw(); bool lookupValue(const char *path, float &value) const throw(); bool lookupValue(const char *path, const char *&value) const throw(); bool lookupValue(const char *path, std::string &value) const throw(); inline bool lookupValue(const std::string &path, bool &value) const throw() { return(lookupValue(path.c_str(), value)); } inline bool lookupValue(const std::string &path, int &value) const throw() { return(lookupValue(path.c_str(), value)); } inline bool lookupValue(const std::string &path, unsigned int &value) const throw() { return(lookupValue(path.c_str(), value)); } inline bool lookupValue(const std::string &path, long long &value) const throw() { return(lookupValue(path.c_str(), value)); } inline bool lookupValue(const std::string &path, unsigned long long &value) const throw() { return(lookupValue(path.c_str(), value)); } inline bool lookupValue(const std::string &path, double &value) const throw() { return(lookupValue(path.c_str(), value)); } inline bool lookupValue(const std::string &path, float &value) const throw() { return(lookupValue(path.c_str(), value)); } inline bool lookupValue(const std::string &path, const char *&value) const throw() { return(lookupValue(path.c_str(), value)); } inline bool lookupValue(const std::string &path, std::string &value) const throw() { return(lookupValue(path.c_str(), value)); } Setting & getRoot() const; private: Setting::Format _defaultFormat; void handleError() const; }; } // namespace libconfig #endif // __libconfig_hpp