+/** Refactored by Brain, Jun 2008. Much faster with some clever O(1) array
+ * lookups and pointer maths.
+ */
+long InspIRCd::Duration(const std::string &str)
+{
+ unsigned char multiplier = 0;
+ long total = 0;
+ long times = 1;
+ long subtotal = 0;
+
+ /* Iterate each item in the string, looking for number or multiplier */
+ for (std::string::const_reverse_iterator i = str.rbegin(); i != str.rend(); ++i)
+ {
+ /* Found a number, queue it onto the current number */
+ if ((*i >= '0') && (*i <= '9'))
+ {
+ subtotal = subtotal + ((*i - '0') * times);
+ times = times * 10;
+ }
+ else
+ {
+ /* Found something thats not a number, find out how much
+ * it multiplies the built up number by, multiply the total
+ * and reset the built up number.
+ */
+ if (subtotal)
+ total += subtotal * duration_multi[multiplier];
+
+ /* Next subtotal please */
+ subtotal = 0;
+ multiplier = *i;
+ times = 1;
+ }
+ }
+ if (multiplier)
+ {
+ total += subtotal * duration_multi[multiplier];
+ subtotal = 0;
+ }
+ /* Any trailing values built up are treated as raw seconds */
+ return total + subtotal;
+}
+
+bool InspIRCd::ULine(const char* sserver)
+{
+ if (!sserver)
+ return false;
+ if (!*sserver)
+ return true;
+
+ return (Config->ulines.find(sserver) != Config->ulines.end());
+}
+
+bool InspIRCd::SilentULine(const char* sserver)
+{
+ std::map<irc::string,bool>::iterator n = Config->ulines.find(sserver);
+ if (n != Config->ulines.end())
+ return n->second;
+ else return false;
+}
+
+std::string InspIRCd::TimeString(time_t curtime)
+{
+ return std::string(ctime(&curtime),24);
+}
+
+// You should only pass a single character to this.
+void InspIRCd::AddExtBanChar(char c)
+{
+ std::string &tok = Config->data005;
+ std::string::size_type ebpos;
+
+ if ((ebpos = tok.find(" EXTBAN=:")) == std::string::npos)
+ {
+ tok.append(" EXTBAN=:");
+ tok.push_back(c);
+ }
+ else
+ tok.insert(ebpos + 9, 1, c);
+}