/* ZIniReader.hpp Author: James Russell Created: 4/27/2012 Purpose: Parses INI file format in memory. (File Begin) # This is a commented line ; This is too [SectionA] Key1=Value1 Key2 =Value2 Key3= Value3 Key4 = Value4 [SectionB] Key1 = Value1 ... (File End) Comments must be on their own line. Sections must be unique to a file. Keys can be repeated, but the final value seen is the value recorded. ZIniReader class does no I/O - it merely parses in-memory representations. The data structures it provides a read-only, but you can get a mutable copy of its data as a ZRegistry object. The data above would be loaded into a registry with the following layout: Root | +-> SectionA | | | +-> Key1 (Value1) | +-> Key2 (Value2) | +-> Key3 (Value3) | +-> Key4 (Value4) | +-> SectionB | +-> Key1 (Value1) License: TODO */ #ifndef _ZINIREADER_HPP #define _ZINIREADER_HPP #include /* IniReader class. */ class ZIniReader { public: /* Default constructor. */ ZIniReader() : ErrorMessage() { } /* Destructor. */ ~ZIniReader() { ClearData(); } /* public ZIniReader::Read Reads an INI file stored as a ZString. @param _iniData - string holding the data of an ini file, which will be parsed @return (bool) - True if successful, false if failure. Use GetErrorString() to get the message */ bool Read(const ZString& _iniData) { return Read(_iniData.Data(), _iniData.Length()); } /* public ZIniReader::Read Reads an INI file stored as memory block @param data - Pointer to INI data @param length - Length of INI data @return (bool) - true if successful, false if failure (use GetErrorString() to get the message) */ bool Read(const char* data, size_t length); /* public ZIniReader::GetErrorString Gets the error message generated while loading the data if loading failed. If loading the data was successful, this returns an empty string. @return (const ZString&) - error message string */ const ZString& GetErrorString() { return ErrorMessage; } /* public ZIniReader::GetSection Looks up a section by name and returns a pointer to the ZHashMap object. If the section does not exist, NULL is returned. The hashmap contains a list of key-value pairs found for that section @param sectionName - The name of the section @return (const ZHashMap*) - The section, or NULL if it does not exist */ const ZHashMap* GetSection(const ZString& sectionName); /* public ZIniReader::GetSection Looks up a section by ordinal and returns a pointer to the ZHashMap object. Sections are given in order of appearance in the file. The hashmap contains a list of key-value pairs found for that section. @param index - The index of the section, between 0 and GetSectionCount() - 1 @return (const ZHashMap*) - The section */ const ZHashMap* GetSection(size_t index) { return Sections[index]; } /* public ZIniReader::GetSectionCount Gets the number of sections parsed. If Read() returned true, this will be at least one. @return (size_t) - The number of sections parsed. */ size_t GetSectionCount() { return Sections.Size(); } /* public ZIniReader::GetSectionName Gets the name for a section by ordinal. Sections names are given in order of appearance in the file. @param index - The index of the section, between 0 and GetSectionCount()-1 @return (const ZString&) - The section name */ const ZString& GetSectionName(size_t index) { return SectionNames[index]; } /* public ZIniReader::GetKVTree Populates a ZKVTree using the read values. If loading the data has failed, no data is entered. To get values in the kv-tree, use the path string 'Section.Key'. @param _kvtree - the kv-tree to contain the parsed ini values @return (void) */ void GetKVTree(ZKVTree& _kvtree); private: DISABLE_COPY_AND_ASSIGN(ZIniReader); ZString ErrorMessage; // Error Message (if an error has happened) ZHashMap*> StringSectionMap; // String -> Hashmap table ZArray*> Sections; // Linear order in which sections were found ZArray SectionNames; // Name of sections parsed void SetError(const char* message, uint32_t line); // Sets the error message void ClearData(); // Clears previously read section data }; #endif