/* =========================================================================== Copyright (C) 2015 the OpenMoHAA team This file is part of OpenMoHAA source code. OpenMoHAA source code is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. OpenMoHAA source code 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 General Public License for more details. You should have received a copy of the GNU General Public License along with OpenMoHAA source code; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ // configurator.h: Config class for INI files. #ifndef __CONFIGURATOR_H__ #define __CONFIGURATOR_H__ #include #define MAX_CONFIGURATOR_ARRAY_SIZE 2048 typedef struct configValue_s { bool m_bNeedWrite; str value; } configValue_t; typedef struct configKey_s { bool m_bNeedWrite; str name; Container value; bool m_bArray; } configKey_t; typedef struct configSection_s { bool m_bNeedWrite; str name; Container key; } configSection_t; enum { LINE_EMPTY, LINE_COMMENT, LINE_SECTION, LINE_VALUE, LINE_ERROR }; class Configurator : public Class { private: str m_filename; bool m_bNoWrite; bool m_bNeedWrite; con_set m_sections; Container m_reverseSections; private: size_t GetLine(char* dest, const char* data, size_t size); str GetValue(const char* section, const char* key, str defaultValue, int index = -1); configKey_t* GetKey(const char* section, const char* key, int index = -1); int CutLine(char* data); bool SetupLine(char* line, int& lineno, size_t& len, size_t& last); bool FindData(int type, const char* section, const char* key, size_t* offset, const char* data, size_t size); void ParseData(const char* data, size_t size); void WriteData(char** data, size_t* size); void WriteData2(char** data, size_t* size); int ParseLine(char* line, char* section, char* key, char* value); configSection_t* CreateSection(const char* section); configSection_t* FindSection(const char* section); int GetKeyArray(char* key); int GetKeyArray(str& key); configKey_t* CreateKey(configSection_t* section, const char* key, unsigned int* index); configKey_t* FindKey(configSection_t* section, const char* key); void RemoveSection(configSection_t* section); void RemoveKey(configSection_t* section, configKey_t* key); public: CLASS_PROTOTYPE(Configurator); Configurator(const char* filename); Configurator(); ~Configurator(); void Parse(const char* filename); void Close(); void SetWrite(bool bWrite); str GetString(const char* section, const char* key, str defaultValue, int index = -1); int GetInteger(const char* section, const char* key, int defaultValue, int index = -1); float GetFloat(const char* section, const char* key, float defaultValue, int index = -1); void SetString(const char* section, const char* key, str value, int index = -1); void SetInteger(const char* section, const char* key, int value, int index = -1); void SetFloat(const char* section, const char* key, float value, int index = -1); }; void test_config(void); #endif /* __CONFIGURATOR_H__ */