1*2e9d4914SAndroid Build Coastguard Worker/* ---------------------------------------------------------------------------- 2*2e9d4914SAndroid Build Coastguard Worker libconfig - A library for processing structured configuration files 3*2e9d4914SAndroid Build Coastguard Worker Copyright (C) 2005-2018 Mark A Lindner 4*2e9d4914SAndroid Build Coastguard Worker 5*2e9d4914SAndroid Build Coastguard Worker This file is part of libconfig. 6*2e9d4914SAndroid Build Coastguard Worker 7*2e9d4914SAndroid Build Coastguard Worker This library is free software; you can redistribute it and/or 8*2e9d4914SAndroid Build Coastguard Worker modify it under the terms of the GNU Lesser General Public License 9*2e9d4914SAndroid Build Coastguard Worker as published by the Free Software Foundation; either version 2.1 of 10*2e9d4914SAndroid Build Coastguard Worker the License, or (at your option) any later version. 11*2e9d4914SAndroid Build Coastguard Worker 12*2e9d4914SAndroid Build Coastguard Worker This library is distributed in the hope that it will be useful, but 13*2e9d4914SAndroid Build Coastguard Worker WITHOUT ANY WARRANTY; without even the implied warranty of 14*2e9d4914SAndroid Build Coastguard Worker MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15*2e9d4914SAndroid Build Coastguard Worker Lesser General Public License for more details. 16*2e9d4914SAndroid Build Coastguard Worker 17*2e9d4914SAndroid Build Coastguard Worker You should have received a copy of the GNU Library General Public 18*2e9d4914SAndroid Build Coastguard Worker License along with this library; if not, see 19*2e9d4914SAndroid Build Coastguard Worker <http://www.gnu.org/licenses/>. 20*2e9d4914SAndroid Build Coastguard Worker ---------------------------------------------------------------------------- 21*2e9d4914SAndroid Build Coastguard Worker*/ 22*2e9d4914SAndroid Build Coastguard Worker 23*2e9d4914SAndroid Build Coastguard Worker#ifndef __libconfig_hpp 24*2e9d4914SAndroid Build Coastguard Worker#define __libconfig_hpp 25*2e9d4914SAndroid Build Coastguard Worker 26*2e9d4914SAndroid Build Coastguard Worker#include <stdio.h> 27*2e9d4914SAndroid Build Coastguard Worker#include <exception> 28*2e9d4914SAndroid Build Coastguard Worker#include <string> 29*2e9d4914SAndroid Build Coastguard Worker 30*2e9d4914SAndroid Build Coastguard Worker#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) 31*2e9d4914SAndroid Build Coastguard Worker#if defined(LIBCONFIGXX_STATIC) 32*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_API 33*2e9d4914SAndroid Build Coastguard Worker#elif defined(LIBCONFIGXX_EXPORTS) 34*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_API __declspec(dllexport) 35*2e9d4914SAndroid Build Coastguard Worker#else /* ! LIBCONFIGXX_EXPORTS */ 36*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_API __declspec(dllimport) 37*2e9d4914SAndroid Build Coastguard Worker#endif /* LIBCONFIGXX_STATIC */ 38*2e9d4914SAndroid Build Coastguard Worker#else /* ! WIN32 */ 39*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_API 40*2e9d4914SAndroid Build Coastguard Worker#endif /* WIN32 */ 41*2e9d4914SAndroid Build Coastguard Worker 42*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_VER_MAJOR 1 43*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_VER_MINOR 7 44*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_VER_REVISION 0 45*2e9d4914SAndroid Build Coastguard Worker 46*2e9d4914SAndroid Build Coastguard Worker#if __cplusplus < 201103L 47*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_NOEXCEPT throw() 48*2e9d4914SAndroid Build Coastguard Worker#else 49*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_NOEXCEPT noexcept 50*2e9d4914SAndroid Build Coastguard Worker#endif 51*2e9d4914SAndroid Build Coastguard Worker 52*2e9d4914SAndroid Build Coastguard Workerstruct config_t; // fwd decl 53*2e9d4914SAndroid Build Coastguard Workerstruct config_setting_t; // fwd decl 54*2e9d4914SAndroid Build Coastguard Worker 55*2e9d4914SAndroid Build Coastguard Workernamespace libconfig { 56*2e9d4914SAndroid Build Coastguard Worker 57*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API ConfigException : public std::exception { }; 58*2e9d4914SAndroid Build Coastguard Worker 59*2e9d4914SAndroid Build Coastguard Workerclass Setting; // fwd decl 60*2e9d4914SAndroid Build Coastguard Workerclass SettingIterator; 61*2e9d4914SAndroid Build Coastguard Workerclass SettingConstIterator; 62*2e9d4914SAndroid Build Coastguard Worker 63*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingException : public ConfigException 64*2e9d4914SAndroid Build Coastguard Worker{ 65*2e9d4914SAndroid Build Coastguard Worker public: 66*2e9d4914SAndroid Build Coastguard Worker 67*2e9d4914SAndroid Build Coastguard Worker SettingException(const Setting &setting); 68*2e9d4914SAndroid Build Coastguard Worker SettingException(const Setting &setting, int idx); 69*2e9d4914SAndroid Build Coastguard Worker SettingException(const Setting &setting, const char *name); 70*2e9d4914SAndroid Build Coastguard Worker SettingException(const char *path); 71*2e9d4914SAndroid Build Coastguard Worker 72*2e9d4914SAndroid Build Coastguard Worker SettingException(const SettingException &other); 73*2e9d4914SAndroid Build Coastguard Worker SettingException& operator=(const SettingException &other); 74*2e9d4914SAndroid Build Coastguard Worker 75*2e9d4914SAndroid Build Coastguard Worker virtual ~SettingException() LIBCONFIGXX_NOEXCEPT; 76*2e9d4914SAndroid Build Coastguard Worker 77*2e9d4914SAndroid Build Coastguard Worker const char *getPath() const; 78*2e9d4914SAndroid Build Coastguard Worker 79*2e9d4914SAndroid Build Coastguard Worker virtual const char *what() const LIBCONFIGXX_NOEXCEPT; 80*2e9d4914SAndroid Build Coastguard Worker 81*2e9d4914SAndroid Build Coastguard Worker private: 82*2e9d4914SAndroid Build Coastguard Worker 83*2e9d4914SAndroid Build Coastguard Worker char *_path; 84*2e9d4914SAndroid Build Coastguard Worker}; 85*2e9d4914SAndroid Build Coastguard Worker 86*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingTypeException : public SettingException 87*2e9d4914SAndroid Build Coastguard Worker{ 88*2e9d4914SAndroid Build Coastguard Worker public: 89*2e9d4914SAndroid Build Coastguard Worker 90*2e9d4914SAndroid Build Coastguard Worker SettingTypeException(const Setting &setting); 91*2e9d4914SAndroid Build Coastguard Worker SettingTypeException(const Setting &setting, int idx); 92*2e9d4914SAndroid Build Coastguard Worker SettingTypeException(const Setting &setting, const char *name); 93*2e9d4914SAndroid Build Coastguard Worker 94*2e9d4914SAndroid Build Coastguard Worker virtual const char *what() const LIBCONFIGXX_NOEXCEPT; 95*2e9d4914SAndroid Build Coastguard Worker}; 96*2e9d4914SAndroid Build Coastguard Worker 97*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingNotFoundException : public SettingException 98*2e9d4914SAndroid Build Coastguard Worker{ 99*2e9d4914SAndroid Build Coastguard Worker public: 100*2e9d4914SAndroid Build Coastguard Worker 101*2e9d4914SAndroid Build Coastguard Worker SettingNotFoundException(const char *path); 102*2e9d4914SAndroid Build Coastguard Worker SettingNotFoundException(const Setting &setting, int idx); 103*2e9d4914SAndroid Build Coastguard Worker SettingNotFoundException(const Setting &setting, const char *name); 104*2e9d4914SAndroid Build Coastguard Worker 105*2e9d4914SAndroid Build Coastguard Worker virtual const char *what() const LIBCONFIGXX_NOEXCEPT; 106*2e9d4914SAndroid Build Coastguard Worker}; 107*2e9d4914SAndroid Build Coastguard Worker 108*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingNameException : public SettingException 109*2e9d4914SAndroid Build Coastguard Worker{ 110*2e9d4914SAndroid Build Coastguard Worker public: 111*2e9d4914SAndroid Build Coastguard Worker 112*2e9d4914SAndroid Build Coastguard Worker SettingNameException(const Setting &setting, const char *name); 113*2e9d4914SAndroid Build Coastguard Worker 114*2e9d4914SAndroid Build Coastguard Worker virtual const char *what() const LIBCONFIGXX_NOEXCEPT; 115*2e9d4914SAndroid Build Coastguard Worker}; 116*2e9d4914SAndroid Build Coastguard Worker 117*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API FileIOException : public ConfigException 118*2e9d4914SAndroid Build Coastguard Worker{ 119*2e9d4914SAndroid Build Coastguard Worker public: 120*2e9d4914SAndroid Build Coastguard Worker 121*2e9d4914SAndroid Build Coastguard Worker virtual const char *what() const LIBCONFIGXX_NOEXCEPT; 122*2e9d4914SAndroid Build Coastguard Worker}; 123*2e9d4914SAndroid Build Coastguard Worker 124*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API ParseException : public ConfigException 125*2e9d4914SAndroid Build Coastguard Worker{ 126*2e9d4914SAndroid Build Coastguard Worker public: 127*2e9d4914SAndroid Build Coastguard Worker 128*2e9d4914SAndroid Build Coastguard Worker ParseException(const char *file, int line, const char *error); 129*2e9d4914SAndroid Build Coastguard Worker 130*2e9d4914SAndroid Build Coastguard Worker ParseException(const ParseException &other); 131*2e9d4914SAndroid Build Coastguard Worker 132*2e9d4914SAndroid Build Coastguard Worker virtual ~ParseException() LIBCONFIGXX_NOEXCEPT; 133*2e9d4914SAndroid Build Coastguard Worker 134*2e9d4914SAndroid Build Coastguard Worker inline const char *getFile() const 135*2e9d4914SAndroid Build Coastguard Worker { return(_file); } 136*2e9d4914SAndroid Build Coastguard Worker 137*2e9d4914SAndroid Build Coastguard Worker inline int getLine() const 138*2e9d4914SAndroid Build Coastguard Worker { return(_line); } 139*2e9d4914SAndroid Build Coastguard Worker 140*2e9d4914SAndroid Build Coastguard Worker inline const char *getError() const 141*2e9d4914SAndroid Build Coastguard Worker { return(_error); } 142*2e9d4914SAndroid Build Coastguard Worker 143*2e9d4914SAndroid Build Coastguard Worker virtual const char *what() const LIBCONFIGXX_NOEXCEPT; 144*2e9d4914SAndroid Build Coastguard Worker 145*2e9d4914SAndroid Build Coastguard Worker private: 146*2e9d4914SAndroid Build Coastguard Worker 147*2e9d4914SAndroid Build Coastguard Worker const char *_file; 148*2e9d4914SAndroid Build Coastguard Worker int _line; 149*2e9d4914SAndroid Build Coastguard Worker const char *_error; 150*2e9d4914SAndroid Build Coastguard Worker}; 151*2e9d4914SAndroid Build Coastguard Worker 152*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API Setting 153*2e9d4914SAndroid Build Coastguard Worker{ 154*2e9d4914SAndroid Build Coastguard Worker friend class Config; 155*2e9d4914SAndroid Build Coastguard Worker 156*2e9d4914SAndroid Build Coastguard Worker public: 157*2e9d4914SAndroid Build Coastguard Worker 158*2e9d4914SAndroid Build Coastguard Worker enum Type 159*2e9d4914SAndroid Build Coastguard Worker { 160*2e9d4914SAndroid Build Coastguard Worker TypeNone = 0, 161*2e9d4914SAndroid Build Coastguard Worker // scalar types 162*2e9d4914SAndroid Build Coastguard Worker TypeInt, 163*2e9d4914SAndroid Build Coastguard Worker TypeInt64, 164*2e9d4914SAndroid Build Coastguard Worker TypeFloat, 165*2e9d4914SAndroid Build Coastguard Worker TypeString, 166*2e9d4914SAndroid Build Coastguard Worker TypeBoolean, 167*2e9d4914SAndroid Build Coastguard Worker // aggregate types 168*2e9d4914SAndroid Build Coastguard Worker TypeGroup, 169*2e9d4914SAndroid Build Coastguard Worker TypeArray, 170*2e9d4914SAndroid Build Coastguard Worker TypeList 171*2e9d4914SAndroid Build Coastguard Worker }; 172*2e9d4914SAndroid Build Coastguard Worker 173*2e9d4914SAndroid Build Coastguard Worker enum Format 174*2e9d4914SAndroid Build Coastguard Worker { 175*2e9d4914SAndroid Build Coastguard Worker FormatDefault = 0, 176*2e9d4914SAndroid Build Coastguard Worker FormatHex = 1 177*2e9d4914SAndroid Build Coastguard Worker }; 178*2e9d4914SAndroid Build Coastguard Worker 179*2e9d4914SAndroid Build Coastguard Worker typedef SettingIterator iterator; 180*2e9d4914SAndroid Build Coastguard Worker typedef SettingConstIterator const_iterator; 181*2e9d4914SAndroid Build Coastguard Worker 182*2e9d4914SAndroid Build Coastguard Worker public: 183*2e9d4914SAndroid Build Coastguard Worker 184*2e9d4914SAndroid Build Coastguard Worker virtual ~Setting(); 185*2e9d4914SAndroid Build Coastguard Worker 186*2e9d4914SAndroid Build Coastguard Worker inline Type getType() const { return(_type); } 187*2e9d4914SAndroid Build Coastguard Worker 188*2e9d4914SAndroid Build Coastguard Worker inline Format getFormat() const { return(_format); } 189*2e9d4914SAndroid Build Coastguard Worker void setFormat(Format format); 190*2e9d4914SAndroid Build Coastguard Worker 191*2e9d4914SAndroid Build Coastguard Worker operator bool() const; 192*2e9d4914SAndroid Build Coastguard Worker operator int() const; 193*2e9d4914SAndroid Build Coastguard Worker operator unsigned int() const; 194*2e9d4914SAndroid Build Coastguard Worker operator long() const; 195*2e9d4914SAndroid Build Coastguard Worker operator unsigned long() const; 196*2e9d4914SAndroid Build Coastguard Worker operator long long() const; 197*2e9d4914SAndroid Build Coastguard Worker operator unsigned long long() const; 198*2e9d4914SAndroid Build Coastguard Worker operator double() const; 199*2e9d4914SAndroid Build Coastguard Worker operator float() const; 200*2e9d4914SAndroid Build Coastguard Worker operator const char *() const; 201*2e9d4914SAndroid Build Coastguard Worker operator std::string() const; 202*2e9d4914SAndroid Build Coastguard Worker 203*2e9d4914SAndroid Build Coastguard Worker inline const char *c_str() const 204*2e9d4914SAndroid Build Coastguard Worker { return operator const char *(); } 205*2e9d4914SAndroid Build Coastguard Worker 206*2e9d4914SAndroid Build Coastguard Worker Setting & operator=(bool value); 207*2e9d4914SAndroid Build Coastguard Worker Setting & operator=(int value); 208*2e9d4914SAndroid Build Coastguard Worker Setting & operator=(long value); 209*2e9d4914SAndroid Build Coastguard Worker Setting & operator=(const long long &value); 210*2e9d4914SAndroid Build Coastguard Worker Setting & operator=(const double &value); 211*2e9d4914SAndroid Build Coastguard Worker Setting & operator=(float value); 212*2e9d4914SAndroid Build Coastguard Worker Setting & operator=(const char *value); 213*2e9d4914SAndroid Build Coastguard Worker Setting & operator=(const std::string &value); 214*2e9d4914SAndroid Build Coastguard Worker 215*2e9d4914SAndroid Build Coastguard Worker Setting & lookup(const char *path) const; 216*2e9d4914SAndroid Build Coastguard Worker inline Setting & lookup(const std::string &path) const 217*2e9d4914SAndroid Build Coastguard Worker { return(lookup(path.c_str())); } 218*2e9d4914SAndroid Build Coastguard Worker 219*2e9d4914SAndroid Build Coastguard Worker Setting & operator[](const char *name) const; 220*2e9d4914SAndroid Build Coastguard Worker 221*2e9d4914SAndroid Build Coastguard Worker inline Setting & operator[](const std::string &name) const 222*2e9d4914SAndroid Build Coastguard Worker { return(operator[](name.c_str())); } 223*2e9d4914SAndroid Build Coastguard Worker 224*2e9d4914SAndroid Build Coastguard Worker Setting & operator[](int index) const; 225*2e9d4914SAndroid Build Coastguard Worker 226*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *name, bool &value) const; 227*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *name, int &value) const; 228*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *name, unsigned int &value) const; 229*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *name, long long &value) const; 230*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *name, unsigned long long &value) const; 231*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *name, double &value) const; 232*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *name, float &value) const; 233*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *name, const char *&value) const; 234*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *name, std::string &value) const; 235*2e9d4914SAndroid Build Coastguard Worker 236*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &name, bool &value) const 237*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(name.c_str(), value)); } 238*2e9d4914SAndroid Build Coastguard Worker 239*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &name, int &value) const 240*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(name.c_str(), value)); } 241*2e9d4914SAndroid Build Coastguard Worker 242*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &name, unsigned int &value) const 243*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(name.c_str(), value)); } 244*2e9d4914SAndroid Build Coastguard Worker 245*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &name, long long &value) const 246*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(name.c_str(), value)); } 247*2e9d4914SAndroid Build Coastguard Worker 248*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &name, 249*2e9d4914SAndroid Build Coastguard Worker unsigned long long &value) const 250*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(name.c_str(), value)); } 251*2e9d4914SAndroid Build Coastguard Worker 252*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &name, double &value) const 253*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(name.c_str(), value)); } 254*2e9d4914SAndroid Build Coastguard Worker 255*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &name, float &value) const 256*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(name.c_str(), value)); } 257*2e9d4914SAndroid Build Coastguard Worker 258*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &name, const char *&value) const 259*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(name.c_str(), value)); } 260*2e9d4914SAndroid Build Coastguard Worker 261*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &name, std::string &value) const 262*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(name.c_str(), value)); } 263*2e9d4914SAndroid Build Coastguard Worker 264*2e9d4914SAndroid Build Coastguard Worker void remove(const char *name); 265*2e9d4914SAndroid Build Coastguard Worker 266*2e9d4914SAndroid Build Coastguard Worker inline void remove(const std::string &name) 267*2e9d4914SAndroid Build Coastguard Worker { remove(name.c_str()); } 268*2e9d4914SAndroid Build Coastguard Worker 269*2e9d4914SAndroid Build Coastguard Worker void remove(unsigned int idx); 270*2e9d4914SAndroid Build Coastguard Worker 271*2e9d4914SAndroid Build Coastguard Worker Setting & add(const char *name, Type type); 272*2e9d4914SAndroid Build Coastguard Worker 273*2e9d4914SAndroid Build Coastguard Worker inline Setting & add(const std::string &name, Type type) 274*2e9d4914SAndroid Build Coastguard Worker { return(add(name.c_str(), type)); } 275*2e9d4914SAndroid Build Coastguard Worker 276*2e9d4914SAndroid Build Coastguard Worker Setting & add(Type type); 277*2e9d4914SAndroid Build Coastguard Worker 278*2e9d4914SAndroid Build Coastguard Worker bool exists(const char *name) const; 279*2e9d4914SAndroid Build Coastguard Worker 280*2e9d4914SAndroid Build Coastguard Worker inline bool exists(const std::string &name) const 281*2e9d4914SAndroid Build Coastguard Worker { return(exists(name.c_str())); } 282*2e9d4914SAndroid Build Coastguard Worker 283*2e9d4914SAndroid Build Coastguard Worker int getLength() const; 284*2e9d4914SAndroid Build Coastguard Worker const char *getName() const; 285*2e9d4914SAndroid Build Coastguard Worker std::string getPath() const; 286*2e9d4914SAndroid Build Coastguard Worker int getIndex() const; 287*2e9d4914SAndroid Build Coastguard Worker 288*2e9d4914SAndroid Build Coastguard Worker const Setting & getParent() const; 289*2e9d4914SAndroid Build Coastguard Worker Setting & getParent(); 290*2e9d4914SAndroid Build Coastguard Worker 291*2e9d4914SAndroid Build Coastguard Worker bool isRoot() const; 292*2e9d4914SAndroid Build Coastguard Worker 293*2e9d4914SAndroid Build Coastguard Worker inline bool isGroup() const 294*2e9d4914SAndroid Build Coastguard Worker { return(_type == TypeGroup); } 295*2e9d4914SAndroid Build Coastguard Worker 296*2e9d4914SAndroid Build Coastguard Worker inline bool isArray() const 297*2e9d4914SAndroid Build Coastguard Worker { return(_type == TypeArray); } 298*2e9d4914SAndroid Build Coastguard Worker 299*2e9d4914SAndroid Build Coastguard Worker inline bool isList() const 300*2e9d4914SAndroid Build Coastguard Worker { return(_type == TypeList); } 301*2e9d4914SAndroid Build Coastguard Worker 302*2e9d4914SAndroid Build Coastguard Worker inline bool isAggregate() const 303*2e9d4914SAndroid Build Coastguard Worker { return(_type >= TypeGroup); } 304*2e9d4914SAndroid Build Coastguard Worker 305*2e9d4914SAndroid Build Coastguard Worker inline bool isScalar() const 306*2e9d4914SAndroid Build Coastguard Worker { return((_type > TypeNone) && (_type < TypeGroup)); } 307*2e9d4914SAndroid Build Coastguard Worker 308*2e9d4914SAndroid Build Coastguard Worker inline bool isNumber() const 309*2e9d4914SAndroid Build Coastguard Worker { 310*2e9d4914SAndroid Build Coastguard Worker return((_type == TypeInt) || (_type == TypeInt64) || (_type == TypeFloat)); 311*2e9d4914SAndroid Build Coastguard Worker } 312*2e9d4914SAndroid Build Coastguard Worker 313*2e9d4914SAndroid Build Coastguard Worker inline bool isString() const 314*2e9d4914SAndroid Build Coastguard Worker { return(_type == TypeString); } 315*2e9d4914SAndroid Build Coastguard Worker 316*2e9d4914SAndroid Build Coastguard Worker unsigned int getSourceLine() const; 317*2e9d4914SAndroid Build Coastguard Worker const char *getSourceFile() const; 318*2e9d4914SAndroid Build Coastguard Worker 319*2e9d4914SAndroid Build Coastguard Worker iterator begin(); 320*2e9d4914SAndroid Build Coastguard Worker iterator end(); 321*2e9d4914SAndroid Build Coastguard Worker 322*2e9d4914SAndroid Build Coastguard Worker const_iterator begin() const; 323*2e9d4914SAndroid Build Coastguard Worker const_iterator end() const; 324*2e9d4914SAndroid Build Coastguard Worker 325*2e9d4914SAndroid Build Coastguard Worker private: 326*2e9d4914SAndroid Build Coastguard Worker 327*2e9d4914SAndroid Build Coastguard Worker config_setting_t *_setting; 328*2e9d4914SAndroid Build Coastguard Worker Type _type; 329*2e9d4914SAndroid Build Coastguard Worker Format _format; 330*2e9d4914SAndroid Build Coastguard Worker 331*2e9d4914SAndroid Build Coastguard Worker Setting(config_setting_t *setting); 332*2e9d4914SAndroid Build Coastguard Worker 333*2e9d4914SAndroid Build Coastguard Worker void assertType(Type type) const; 334*2e9d4914SAndroid Build Coastguard Worker static Setting & wrapSetting(config_setting_t *setting); 335*2e9d4914SAndroid Build Coastguard Worker 336*2e9d4914SAndroid Build Coastguard Worker Setting(const Setting& other); // not supported 337*2e9d4914SAndroid Build Coastguard Worker Setting& operator=(const Setting& other); // not supported 338*2e9d4914SAndroid Build Coastguard Worker}; 339*2e9d4914SAndroid Build Coastguard Worker 340*2e9d4914SAndroid Build Coastguard Worker 341*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingIterator 342*2e9d4914SAndroid Build Coastguard Worker{ 343*2e9d4914SAndroid Build Coastguard Worker public: 344*2e9d4914SAndroid Build Coastguard Worker 345*2e9d4914SAndroid Build Coastguard Worker SettingIterator(Setting &setting, bool endIterator = false); 346*2e9d4914SAndroid Build Coastguard Worker SettingIterator(const SettingIterator &other); 347*2e9d4914SAndroid Build Coastguard Worker SettingIterator& operator=(const SettingIterator &other); 348*2e9d4914SAndroid Build Coastguard Worker 349*2e9d4914SAndroid Build Coastguard Worker // Equality comparison. 350*2e9d4914SAndroid Build Coastguard Worker inline bool operator==(SettingIterator const &other) const 351*2e9d4914SAndroid Build Coastguard Worker { return((_setting == other._setting) && (_idx == other._idx)); } 352*2e9d4914SAndroid Build Coastguard Worker 353*2e9d4914SAndroid Build Coastguard Worker inline bool operator!=(SettingIterator const &other) const 354*2e9d4914SAndroid Build Coastguard Worker { return(!operator==(other)); } 355*2e9d4914SAndroid Build Coastguard Worker 356*2e9d4914SAndroid Build Coastguard Worker bool operator<(SettingIterator const &other) const; 357*2e9d4914SAndroid Build Coastguard Worker 358*2e9d4914SAndroid Build Coastguard Worker // Dereference operators. 359*2e9d4914SAndroid Build Coastguard Worker inline Setting & operator*() 360*2e9d4914SAndroid Build Coastguard Worker { return((*_setting)[_idx]); } 361*2e9d4914SAndroid Build Coastguard Worker 362*2e9d4914SAndroid Build Coastguard Worker inline Setting * operator->() 363*2e9d4914SAndroid Build Coastguard Worker { return(&(*_setting)[_idx]); } 364*2e9d4914SAndroid Build Coastguard Worker 365*2e9d4914SAndroid Build Coastguard Worker inline const Setting & operator*() const 366*2e9d4914SAndroid Build Coastguard Worker { return(*_setting)[_idx]; } 367*2e9d4914SAndroid Build Coastguard Worker inline const Setting * operator->() const 368*2e9d4914SAndroid Build Coastguard Worker { return(&(*_setting)[_idx]); } 369*2e9d4914SAndroid Build Coastguard Worker 370*2e9d4914SAndroid Build Coastguard Worker // Increment and decrement operators. 371*2e9d4914SAndroid Build Coastguard Worker SettingIterator & operator++(); 372*2e9d4914SAndroid Build Coastguard Worker SettingIterator operator++(int); 373*2e9d4914SAndroid Build Coastguard Worker 374*2e9d4914SAndroid Build Coastguard Worker SettingIterator & operator--(); 375*2e9d4914SAndroid Build Coastguard Worker SettingIterator operator--(int); 376*2e9d4914SAndroid Build Coastguard Worker 377*2e9d4914SAndroid Build Coastguard Worker // Arithmetic operators. 378*2e9d4914SAndroid Build Coastguard Worker SettingIterator operator+(int offset) const; 379*2e9d4914SAndroid Build Coastguard Worker SettingIterator & operator+=(int offset); 380*2e9d4914SAndroid Build Coastguard Worker 381*2e9d4914SAndroid Build Coastguard Worker SettingIterator operator-(int offset) const; 382*2e9d4914SAndroid Build Coastguard Worker SettingIterator & operator-=(int offset); 383*2e9d4914SAndroid Build Coastguard Worker 384*2e9d4914SAndroid Build Coastguard Worker int operator-(const SettingIterator &other) const; 385*2e9d4914SAndroid Build Coastguard Worker 386*2e9d4914SAndroid Build Coastguard Worker private: 387*2e9d4914SAndroid Build Coastguard Worker 388*2e9d4914SAndroid Build Coastguard Worker Setting *_setting; 389*2e9d4914SAndroid Build Coastguard Worker 390*2e9d4914SAndroid Build Coastguard Worker int _count; 391*2e9d4914SAndroid Build Coastguard Worker int _idx; 392*2e9d4914SAndroid Build Coastguard Worker}; 393*2e9d4914SAndroid Build Coastguard Worker 394*2e9d4914SAndroid Build Coastguard WorkerSettingIterator operator+(int offset, const SettingIterator &si); 395*2e9d4914SAndroid Build Coastguard Worker 396*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingConstIterator 397*2e9d4914SAndroid Build Coastguard Worker{ 398*2e9d4914SAndroid Build Coastguard Worker public: 399*2e9d4914SAndroid Build Coastguard Worker 400*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator(const Setting &setting, bool endIterator = false); 401*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator(const SettingConstIterator &rhs); 402*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator& operator=(const SettingConstIterator &rhs); 403*2e9d4914SAndroid Build Coastguard Worker 404*2e9d4914SAndroid Build Coastguard Worker // Equality comparison. 405*2e9d4914SAndroid Build Coastguard Worker bool operator==(SettingConstIterator const &other) const 406*2e9d4914SAndroid Build Coastguard Worker { return((_setting == other._setting) && (_idx == other._idx)); } 407*2e9d4914SAndroid Build Coastguard Worker 408*2e9d4914SAndroid Build Coastguard Worker inline bool operator!=(SettingConstIterator const &other) const 409*2e9d4914SAndroid Build Coastguard Worker { return(!operator==(other)); } 410*2e9d4914SAndroid Build Coastguard Worker 411*2e9d4914SAndroid Build Coastguard Worker // Dereference operators. 412*2e9d4914SAndroid Build Coastguard Worker inline Setting const & operator*() 413*2e9d4914SAndroid Build Coastguard Worker { return((*_setting)[_idx]); } 414*2e9d4914SAndroid Build Coastguard Worker inline Setting const * operator->() 415*2e9d4914SAndroid Build Coastguard Worker { return(&(*_setting)[_idx]); } 416*2e9d4914SAndroid Build Coastguard Worker 417*2e9d4914SAndroid Build Coastguard Worker inline const Setting& operator*() const 418*2e9d4914SAndroid Build Coastguard Worker { return((*_setting)[_idx]); } 419*2e9d4914SAndroid Build Coastguard Worker inline const Setting * operator->() const 420*2e9d4914SAndroid Build Coastguard Worker { return(&(*_setting)[_idx]); } 421*2e9d4914SAndroid Build Coastguard Worker 422*2e9d4914SAndroid Build Coastguard Worker // Increment and decrement operators. 423*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator & operator++(); 424*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator operator++(int); 425*2e9d4914SAndroid Build Coastguard Worker 426*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator & operator--(); 427*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator operator--(int); 428*2e9d4914SAndroid Build Coastguard Worker 429*2e9d4914SAndroid Build Coastguard Worker // Arithmetic operators. 430*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator operator+(int offset) const; 431*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator & operator+=(int offset); 432*2e9d4914SAndroid Build Coastguard Worker 433*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator operator-(int offset) const; 434*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator & operator-=(int offset); 435*2e9d4914SAndroid Build Coastguard Worker 436*2e9d4914SAndroid Build Coastguard Worker int operator-(const SettingConstIterator &other) const; 437*2e9d4914SAndroid Build Coastguard Worker 438*2e9d4914SAndroid Build Coastguard Worker private: 439*2e9d4914SAndroid Build Coastguard Worker 440*2e9d4914SAndroid Build Coastguard Worker const Setting *_setting; 441*2e9d4914SAndroid Build Coastguard Worker 442*2e9d4914SAndroid Build Coastguard Worker int _count; 443*2e9d4914SAndroid Build Coastguard Worker int _idx; 444*2e9d4914SAndroid Build Coastguard Worker}; 445*2e9d4914SAndroid Build Coastguard Worker 446*2e9d4914SAndroid Build Coastguard WorkerSettingConstIterator operator+(int offset, const SettingConstIterator &si); 447*2e9d4914SAndroid Build Coastguard Worker 448*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API Config 449*2e9d4914SAndroid Build Coastguard Worker{ 450*2e9d4914SAndroid Build Coastguard Worker public: 451*2e9d4914SAndroid Build Coastguard Worker 452*2e9d4914SAndroid Build Coastguard Worker enum Option 453*2e9d4914SAndroid Build Coastguard Worker { 454*2e9d4914SAndroid Build Coastguard Worker OptionNone = 0, 455*2e9d4914SAndroid Build Coastguard Worker OptionAutoConvert = 0x01, 456*2e9d4914SAndroid Build Coastguard Worker OptionSemicolonSeparators = 0x02, 457*2e9d4914SAndroid Build Coastguard Worker OptionColonAssignmentForGroups = 0x04, 458*2e9d4914SAndroid Build Coastguard Worker OptionColonAssignmentForNonGroups = 0x08, 459*2e9d4914SAndroid Build Coastguard Worker OptionOpenBraceOnSeparateLine = 0x10, 460*2e9d4914SAndroid Build Coastguard Worker OptionAllowScientificNotation = 0x20, 461*2e9d4914SAndroid Build Coastguard Worker OptionFsync = 0x40, 462*2e9d4914SAndroid Build Coastguard Worker OptionAllowOverrides = 0x80 463*2e9d4914SAndroid Build Coastguard Worker }; 464*2e9d4914SAndroid Build Coastguard Worker 465*2e9d4914SAndroid Build Coastguard Worker Config(); 466*2e9d4914SAndroid Build Coastguard Worker virtual ~Config(); 467*2e9d4914SAndroid Build Coastguard Worker 468*2e9d4914SAndroid Build Coastguard Worker void clear(); 469*2e9d4914SAndroid Build Coastguard Worker 470*2e9d4914SAndroid Build Coastguard Worker void setOptions(int options); 471*2e9d4914SAndroid Build Coastguard Worker int getOptions() const; 472*2e9d4914SAndroid Build Coastguard Worker 473*2e9d4914SAndroid Build Coastguard Worker void setOption(Config::Option option, bool flag); 474*2e9d4914SAndroid Build Coastguard Worker bool getOption(Config::Option option) const; 475*2e9d4914SAndroid Build Coastguard Worker 476*2e9d4914SAndroid Build Coastguard Worker inline void setAutoConvert(bool flag) 477*2e9d4914SAndroid Build Coastguard Worker { setOption(Config::OptionAutoConvert, flag); } 478*2e9d4914SAndroid Build Coastguard Worker inline bool getAutoConvert() const 479*2e9d4914SAndroid Build Coastguard Worker { return(getOption(Config::OptionAutoConvert)); } 480*2e9d4914SAndroid Build Coastguard Worker 481*2e9d4914SAndroid Build Coastguard Worker void setDefaultFormat(Setting::Format format); 482*2e9d4914SAndroid Build Coastguard Worker inline Setting::Format getDefaultFormat() const 483*2e9d4914SAndroid Build Coastguard Worker { return(_defaultFormat); } 484*2e9d4914SAndroid Build Coastguard Worker 485*2e9d4914SAndroid Build Coastguard Worker void setTabWidth(unsigned short width); 486*2e9d4914SAndroid Build Coastguard Worker unsigned short getTabWidth() const; 487*2e9d4914SAndroid Build Coastguard Worker 488*2e9d4914SAndroid Build Coastguard Worker void setFloatPrecision(unsigned short digits); 489*2e9d4914SAndroid Build Coastguard Worker unsigned short getFloatPrecision() const; 490*2e9d4914SAndroid Build Coastguard Worker 491*2e9d4914SAndroid Build Coastguard Worker void setIncludeDir(const char *includeDir); 492*2e9d4914SAndroid Build Coastguard Worker const char *getIncludeDir() const; 493*2e9d4914SAndroid Build Coastguard Worker 494*2e9d4914SAndroid Build Coastguard Worker virtual const char **evaluateIncludePath(const char *path, 495*2e9d4914SAndroid Build Coastguard Worker const char **error); 496*2e9d4914SAndroid Build Coastguard Worker 497*2e9d4914SAndroid Build Coastguard Worker void read(FILE *stream); 498*2e9d4914SAndroid Build Coastguard Worker void write(FILE *stream) const; 499*2e9d4914SAndroid Build Coastguard Worker 500*2e9d4914SAndroid Build Coastguard Worker void readString(const char *str); 501*2e9d4914SAndroid Build Coastguard Worker inline void readString(const std::string &str) 502*2e9d4914SAndroid Build Coastguard Worker { return(readString(str.c_str())); } 503*2e9d4914SAndroid Build Coastguard Worker 504*2e9d4914SAndroid Build Coastguard Worker void readFile(const char *filename); 505*2e9d4914SAndroid Build Coastguard Worker inline void readFile(const std::string &filename) 506*2e9d4914SAndroid Build Coastguard Worker { readFile(filename.c_str()); } 507*2e9d4914SAndroid Build Coastguard Worker 508*2e9d4914SAndroid Build Coastguard Worker void writeFile(const char *filename); 509*2e9d4914SAndroid Build Coastguard Worker inline void writeFile(const std::string &filename) 510*2e9d4914SAndroid Build Coastguard Worker { writeFile(filename.c_str()); } 511*2e9d4914SAndroid Build Coastguard Worker 512*2e9d4914SAndroid Build Coastguard Worker Setting & lookup(const char *path) const; 513*2e9d4914SAndroid Build Coastguard Worker inline Setting & lookup(const std::string &path) const 514*2e9d4914SAndroid Build Coastguard Worker { return(lookup(path.c_str())); } 515*2e9d4914SAndroid Build Coastguard Worker 516*2e9d4914SAndroid Build Coastguard Worker bool exists(const char *path) const; 517*2e9d4914SAndroid Build Coastguard Worker inline bool exists(const std::string &path) const 518*2e9d4914SAndroid Build Coastguard Worker { return(exists(path.c_str())); } 519*2e9d4914SAndroid Build Coastguard Worker 520*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *path, bool &value) const; 521*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *path, int &value) const; 522*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *path, unsigned int &value) const; 523*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *path, long long &value) const; 524*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *path, unsigned long long &value) const; 525*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *path, double &value) const; 526*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *path, float &value) const; 527*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *path, const char *&value) const; 528*2e9d4914SAndroid Build Coastguard Worker bool lookupValue(const char *path, std::string &value) const; 529*2e9d4914SAndroid Build Coastguard Worker 530*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &path, bool &value) const 531*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(path.c_str(), value)); } 532*2e9d4914SAndroid Build Coastguard Worker 533*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &path, int &value) const 534*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(path.c_str(), value)); } 535*2e9d4914SAndroid Build Coastguard Worker 536*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &path, unsigned int &value) const 537*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(path.c_str(), value)); } 538*2e9d4914SAndroid Build Coastguard Worker 539*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &path, long long &value) const 540*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(path.c_str(), value)); } 541*2e9d4914SAndroid Build Coastguard Worker 542*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &path, 543*2e9d4914SAndroid Build Coastguard Worker unsigned long long &value) const 544*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(path.c_str(), value)); } 545*2e9d4914SAndroid Build Coastguard Worker 546*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &path, double &value) const 547*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(path.c_str(), value)); } 548*2e9d4914SAndroid Build Coastguard Worker 549*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &path, float &value) const 550*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(path.c_str(), value)); } 551*2e9d4914SAndroid Build Coastguard Worker 552*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &path, const char *&value) const 553*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(path.c_str(), value)); } 554*2e9d4914SAndroid Build Coastguard Worker 555*2e9d4914SAndroid Build Coastguard Worker inline bool lookupValue(const std::string &path, std::string &value) const 556*2e9d4914SAndroid Build Coastguard Worker { return(lookupValue(path.c_str(), value)); } 557*2e9d4914SAndroid Build Coastguard Worker 558*2e9d4914SAndroid Build Coastguard Worker Setting & getRoot() const; 559*2e9d4914SAndroid Build Coastguard Worker 560*2e9d4914SAndroid Build Coastguard Worker private: 561*2e9d4914SAndroid Build Coastguard Worker 562*2e9d4914SAndroid Build Coastguard Worker static void ConfigDestructor(void *arg); 563*2e9d4914SAndroid Build Coastguard Worker void handleError() const; 564*2e9d4914SAndroid Build Coastguard Worker 565*2e9d4914SAndroid Build Coastguard Worker config_t *_config; 566*2e9d4914SAndroid Build Coastguard Worker Setting::Format _defaultFormat; 567*2e9d4914SAndroid Build Coastguard Worker 568*2e9d4914SAndroid Build Coastguard Worker Config(const Config& other); // not supported 569*2e9d4914SAndroid Build Coastguard Worker Config& operator=(const Config& other); // not supported 570*2e9d4914SAndroid Build Coastguard Worker}; 571*2e9d4914SAndroid Build Coastguard Worker 572*2e9d4914SAndroid Build Coastguard Worker} // namespace libconfig 573*2e9d4914SAndroid Build Coastguard Worker 574*2e9d4914SAndroid Build Coastguard Worker#endif // __libconfig_hpp 575