// NameValueParser.h // Declares the cNameValueParser class that parses strings in the "name=value;name2=value2" format into a stringmap #pragma once class cNameValueParser : public std::map { public: /** Creates an empty parser */ cNameValueParser(bool a_AllowsKeyOnly = true); /** Creates an empty parser, then parses the data given. Doesn't call Finish(), so more data can be parsed later */ cNameValueParser(const char * a_Data, size_t a_Size, bool a_AllowsKeyOnly = true); /** Parses the data given */ void Parse(const char * a_Data, size_t a_Size); /** Notifies the parser that no more data will be coming. Returns true if the parser state is valid */ bool Finish(void); /** Returns true if the data parsed so far was valid */ bool IsValid(void) const { return (m_State != psInvalid); } /** Returns true if the parser expects no more data */ bool IsFinished(void) const { return ((m_State == psInvalid) || (m_State == psFinished)); } protected: enum eState { psKeySpace, ///< Parsing the space in front of the next key psKey, ///< Currently adding more chars to the key in m_CurrentKey psEqualSpace, ///< Space after m_CurrentKey psEqual, ///< Just parsed the = sign after a name psValueInSQuotes, ///< Just parsed a Single-quote sign after the Equal sign psValueInDQuotes, ///< Just parsed a Double-quote sign after the Equal sign psValueRaw, ///< Just parsed a raw value without a quote psAfterValue, ///< Just finished parsing the value, waiting for semicolon or data end psInvalid, ///< The parser has encountered an invalid input; further parsing is skipped psFinished, ///< The parser has already been instructed to finish and doesn't expect any more data } ; /** The current state of the parser */ eState m_State; /** If true, the parser will accept keys without an equal sign and the value */ bool m_AllowsKeyOnly; /** Buffer for the current Key */ AString m_CurrentKey; /** Buffer for the current Value; */ AString m_CurrentValue; } ;