size_t CoreExport operator()(const std::string &s) const;
};
+ struct insensitive_swo
+ {
+ bool CoreExport operator()(const std::string& a, const std::string& b) const;
+ };
+
/** The irc_char_traits class is used for RFC-style comparison of strings.
* This class is used to implement irc::string, a case-insensitive, RFC-
* comparing string class.
*/
- struct irc_char_traits : std::char_traits<char> {
-
+ struct CoreExport irc_char_traits : public std::char_traits<char>
+ {
/** Check if two chars match.
* @param c1st First character
* @param c2nd Second character
* @return similar to strcmp, zero for equal, less than zero for str1
* being less and greater than zero for str1 being greater than str2.
*/
- static CoreExport int compare(const char* str1, const char* str2, size_t n);
+ static int compare(const char* str1, const char* str2, size_t n);
/** Find a char within a string up to position n.
* @param s1 String to find in
* @param c Character to search for
* @return Pointer to the first occurance of c in s1
*/
- static CoreExport const char* find(const char* s1, int n, char c);
+ static const char* find(const char* s1, int n, char c);
};
/** This typedef declares irc::string based upon irc_char_traits.
*/
typedef std::basic_string<char, irc_char_traits, std::allocator<char> > string;
- /** irc::stringjoiner joins string lists into a string, using
- * the given seperator string.
- * This class can join a vector of std::string, a deque of
- * std::string, or a const char* const* array, using overloaded
- * constructors.
+ /** Joins the contents of a vector to a string.
+ * @param sequence Zero or more items to join.
+ * @separator The character to place between the items.
*/
- class CoreExport stringjoiner
- {
- private:
+ std::string CoreExport stringjoiner(const std::vector<std::string>& sequence, char separator = ' ');
- /** Output string
+ /** irc::sepstream allows for splitting token seperated lists.
+ * Each successive call to sepstream::GetToken() returns
+ * the next token, until none remain, at which point the method returns
+ * an empty string.
+ */
+ class CoreExport sepstream
+ {
+ protected:
+ /** Original string.
*/
- std::string joined;
-
+ std::string tokens;
+ /** Separator value
+ */
+ char sep;
+ /** Current string position
+ */
+ size_t pos;
+ /** If set then GetToken() can return an empty string
+ */
+ bool allow_empty;
public:
+ /** Create a sepstream and fill it with the provided data
+ */
+ sepstream(const std::string &source, char separator, bool allowempty = false);
- /** Join elements of a vector, between (and including) begin and end
- * @param seperator The string to seperate values with
- * @param sequence One or more items to seperate
- * @param begin The starting element in the sequence to be joined
- * @param end The ending element in the sequence to be joined
+ /** Fetch the next token from the stream
+ * @param token The next token from the stream is placed here
+ * @return True if tokens still remain, false if there are none left
+ */
+ bool GetToken(std::string& token);
+
+ /** Fetch the entire remaining stream, without tokenizing
+ * @return The remaining part of the stream
*/
- stringjoiner(const std::string& seperator, const std::vector<std::string>& sequence, unsigned int begin, unsigned int end);
+ const std::string GetRemaining();
- /** Get the joined sequence
- * @return A constant reference to the joined string
+ /** Returns true if the end of the stream has been reached
+ * @return True if the end of the stream has been reached, otherwise false
*/
- const std::string& GetJoined() const;
+ bool StreamEnd();
};
- /** irc::modestacker stacks mode sequences into a list.
- * It can then reproduce this list, clamped to a maximum of MAXMODES
- * values per line.
+ /** A derived form of sepstream, which seperates on commas
*/
- class CoreExport modestacker
+ class CoreExport commasepstream : public sepstream
{
- 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
+ /** Initialize with comma separator
*/
- 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();
+ commasepstream(const std::string &source, bool allowempty = false) : sepstream(source, ',', allowempty)
+ {
+ }
+ };
- /** 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.
+ /** A derived form of sepstream, which seperates on spaces
+ */
+ class CoreExport spacesepstream : public sepstream
+ {
+ public:
+ /** Initialize with space separator
*/
- int GetStackedLine(std::vector<std::string> &result, int max_line_size = 360);
-
+ spacesepstream(const std::string &source, bool allowempty = false) : sepstream(source, ' ', allowempty)
+ {
+ }
};
/** irc::tokenstream reads a string formatted as per RFC1459 and RFC2812.
* list will be ":item". This is to allow for parsing 'source' fields
* from data.
*/
- class CoreExport tokenstream
+ class CoreExport tokenstream : private spacesepstream
{
- 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);
bool GetToken(long &token);
};
- /** irc::sepstream allows for splitting token seperated lists.
- * Each successive call to sepstream::GetToken() returns
- * the next token, until none remain, at which point the method returns
- * an empty string.
- */
- class CoreExport sepstream
- {
- 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;
- /** Seperator value
- */
- char sep;
- public:
- /** Create a sepstream and fill it with the provided data
- */
- sepstream(const std::string &source, char seperator);
-
- /** Fetch the next token from the stream
- * @param token The next token from the stream is placed here
- * @return True if tokens still remain, false if there are none left
- */
- bool GetToken(std::string& token);
-
- /** Fetch the entire remaining stream, without tokenizing
- * @return The remaining part of the stream
- */
- const std::string GetRemaining();
-
- /** Returns true if the end of the stream has been reached
- * @return True if the end of the stream has been reached, otherwise false
- */
- bool StreamEnd();
- };
-
- /** A derived form of sepstream, which seperates on commas
- */
- class CoreExport commasepstream : public sepstream
- {
- public:
- /** Initialize with comma seperator
- */
- commasepstream(const std::string &source) : sepstream(source, ',')
- {
- }
- };
-
- /** A derived form of sepstream, which seperates on spaces
- */
- class CoreExport spacesepstream : public sepstream
- {
- public:
- /** Initialize with space seperator
- */
- spacesepstream(const std::string &source) : sepstream(source, ' ')
- {
- }
- };
-
/** The portparser class seperates out a port range into integers.
* A port range may be specified in the input string in the form
* "6660,6661,6662-6669,7020". The end of the stream is indicated by