- /** irc::modestacker stacks mode sequences into a list.
- * It can then reproduce this list, clamped to a maximum of MAXMODES
- * values per line.
- */
- class CoreExport modestacker
- {
- private:
- /** The mode sequence and its parameters
- */
- std::deque<std::string> sequence;
-
- /** True if the mode sequence is initially adding
- * characters, false if it is initially removing
- * them
- */
- bool adding;
- public:
-
- /** Construct a new modestacker.
- * @param add True if the stack is adding modes,
- * false if it is removing them
- */
- modestacker(bool add);
-
- /** Push a modeletter and its parameter onto the stack.
- * No checking is performed as to if this mode actually
- * requires a parameter. If you stack invalid mode
- * sequences, they will be tidied if and when they are
- * passed to a mode parser.
- * @param modeletter The mode letter to insert
- * @param parameter The parameter for the mode
- */
- void Push(char modeletter, const std::string ¶meter);
-
- /** Push a modeletter without parameter onto the stack.
- * No checking is performed as to if this mode actually
- * requires a parameter. If you stack invalid mode
- * sequences, they will be tidied if and when they are
- * passed to a mode parser.
- * @param modeletter The mode letter to insert
- */
- void Push(char modeletter);
-
- /** Push a '+' symbol onto the stack.
- */
- void PushPlus();
-
- /** Push a '-' symbol onto the stack.
- */
- void PushMinus();
-
- /** Return zero or more elements which form the
- * mode line. This will be clamped to a max of
- * MAXMODES items (MAXMODES-1 mode parameters and
- * one mode sequence string), and max_line_size
- * characters. As specified below, this function
- * should be called in a loop until it returns zero,
- * indicating there are no more modes to return.
- * @param result The vector to populate. This will not
- * be cleared before it is used.
- * @param max_line_size The maximum size of the line
- * to build, in characters, seperate to MAXMODES.
- * @return The number of elements in the deque.
- * The function should be called repeatedly until it
- * returns 0, in case there are multiple lines of
- * mode changes to be obtained.
- */
- int GetStackedLine(std::vector<std::string> &result, int max_line_size = 360);
-
- };
-
- /** irc::tokenstream reads a string formatted as per RFC1459 and RFC2812.
- * It will split the string into 'tokens' each containing one parameter
- * from the string.
- * For instance, if it is instantiated with the string:
- * "PRIVMSG #test :foo bar baz qux"
- * then each successive call to tokenstream::GetToken() will return
- * "PRIVMSG", "#test", "foo bar baz qux", "".
- * Note that if the whole string starts with a colon this is not taken
- * to mean the string is all one parameter, and the first item in the
- * list will be ":item". This is to allow for parsing 'source' fields
- * from data.
- */
- class CoreExport tokenstream
- {
- private:
-
- /** Original string
- */
- std::string tokens;
-
- /** Last position of a seperator token
- */
- std::string::iterator last_starting_position;
-
- /** Current string position
- */
- std::string::iterator n;
-
- /** True if the last value was an ending value
- */
- bool last_pushed;
- public:
-
- /** Create a tokenstream and fill it with the provided data
- */
- tokenstream(const std::string &source);
-
- /** Destructor
- */
- ~tokenstream();
-
- /** Fetch the next token from the stream as a std::string
- * @param token The next token available, or an empty string if none remain
- * @return True if tokens are left to be read, false if the last token was just retrieved.
- */
- bool GetToken(std::string &token);
-
- /** Fetch the next token from the stream as an irc::string
- * @param token The next token available, or an empty string if none remain
- * @return True if tokens are left to be read, false if the last token was just retrieved.
- */
- bool GetToken(irc::string &token);
-
- /** Fetch the next token from the stream as an integer
- * @param token The next token available, or undefined if none remain
- * @return True if tokens are left to be read, false if the last token was just retrieved.
- */
- bool GetToken(int &token);
-
- /** Fetch the next token from the stream as a long integer
- * @param token The next token available, or undefined if none remain
- * @return True if tokens are left to be read, false if the last token was just retrieved.
- */
- bool GetToken(long &token);
- };
-
- /** irc::sepstream allows for splitting token seperated lists.