* +------------------------------------+
*
* InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
* This is provided as a pointer so that modules can change it to their custom mapping tables,
* e.g. for national character support.
*/
-extern unsigned const char *national_case_insensitive_map;
+CoreExport extern unsigned const char *national_case_insensitive_map;
/** Case insensitive map, ASCII rules.
* That is;
#endif
+template<typename T> const T& SearchAndReplace(T& text, const T& pattern, const T& replace)
+{
+ T replacement;
+ if ((!pattern.empty()) && (!text.empty()))
+ {
+ for (std::string::size_type n = 0; n != text.length(); ++n)
+ {
+ if (text.length() >= pattern.length() && text.substr(n, pattern.length()) == pattern)
+ {
+ /* Found the pattern in the text, replace it, and advance */
+ replacement.append(replace);
+ n = n + pattern.length() - 1;
+ }
+ else
+ {
+ replacement += text[n];
+ }
+ }
+ }
+ text = replacement;
+ return text;
+}
+
/** The irc namespace contains a number of helper classes.
*/
namespace irc
class CoreExport modestacker : public classbase
{
private:
- InspIRCd* ServerInstance;
-
/** The mode sequence and its parameters
*/
std::deque<std::string> sequence;
* @param add True if the stack is adding modes,
* false if it is removing them
*/
- modestacker(InspIRCd* Instance, bool add);
+ modestacker(bool add);
/** Push a modeletter and its parameter onto the stack.
* No checking is performed as to if this mode actually
* @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
* 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 deque to populate. This will
+ * @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.
* returns 0, in case there are multiple lines of
* mode changes to be obtained.
*/
- int GetStackedLine(std::deque<std::string> &result, int max_line_size = 360);
+ int GetStackedLine(std::vector<std::string> &result, int max_line_size = 360);
+
+ /** deprecated compatability interface - TODO remove */
+ int GetStackedLine(std::deque<std::string> &result, int max_line_size = 360) {
+ std::vector<std::string> r;
+ int n = GetStackedLine(r, max_line_size);
+ result.clear();
+ result.insert(result.end(), r.begin(), r.end());
+ return n;
+ }
};
/** irc::tokenstream reads a string formatted as per RFC1459 and RFC2812.
class CoreExport tokenstream : public classbase
{
private:
-
+
/** Original string
*/
std::string tokens;
/** Used to split on commas
*/
commasepstream* sep;
-
+
/** Current position in a range of ports
*/
long in_range;
-
+
/** Starting port in a range of ports
*/
long range_begin;
-
+
/** Ending port in a range of ports
*/
long range_end;
-
+
/** Allow overlapped port ranges
*/
bool overlapped;
-
+
/** Used to determine overlapping of ports
* without O(n) algorithm being used
*/
std::map<long, bool> overlap_set;
-
+
/** Returns true if val overlaps an existing range
*/
bool Overlaps(long val);
public:
-
+
/** Create a portparser and fill it with the provided data
* @param source The source text to parse from
* @param allow_overlapped Allow overlapped ranges
*/
portparser(const std::string &source, bool allow_overlapped = true);
-
+
/** Frees the internal commasepstream object
*/
~portparser();
-
+
/** Fetch the next token from the stream
* @return The next port number is returned, or 0 if none remain
*/
}
/** Hashing stuff is totally different on vc++'s hash_map implementation, so to save a buttload of
- * #ifdefs we'll just do it all at once
+ * #ifdefs we'll just do it all at once. Except, of course, with TR1, when it's the same as GCC.
*/
BEGIN_HASHMAP_NAMESPACE
/** Hashing function to hash irc::string
*/
-#ifdef WINDOWS
+#if defined(WINDOWS) && !defined(HAS_TR1_UNORDERED)
template<> class CoreExport hash_compare<irc::string, std::less<irc::string> >
{
public:
* @param s A string to hash
* @return The hash value
*/
- size_t operator()(const irc::string &s) const;
+ size_t CoreExport operator()(const irc::string &s) const;
};
/* XXX FIXME: Implement a hash function overriding std::string's that works with TR1! */
#ifdef HASHMAP_DEPRECATED
struct insensitive
#else
- template<> struct hash<std::string>
+ CoreExport template<> struct hash<std::string>
#endif
{
- size_t operator()(const std::string &s) const;
+ size_t CoreExport operator()(const std::string &s) const;
};
#endif
END_HASHMAP_NAMESPACE
#endif
-