]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/helperfuncs.cpp
m_spanningtree atoi() to ConvToInt() conversion, add const where possible
[user/henk/code/inspircd.git] / src / helperfuncs.cpp
index a6df520c5d2d10fddb7a3306fd0ad35e9052d27e..fba76805c0495b1ae9ef5f0463783318b6f69332 100644 (file)
@@ -100,11 +100,6 @@ User* InspIRCd::FindNickOnly(const char* nick)
 }
 
 User *InspIRCd::FindUUID(const std::string &uid)
-{
-       return FindUUID(uid.c_str());
-}
-
-User *InspIRCd::FindUUID(const char *uid)
 {
        user_hash::iterator finduuid = this->Users->uuidlist->find(uid);
 
@@ -114,6 +109,11 @@ User *InspIRCd::FindUUID(const char *uid)
        return finduuid->second;
 }
 
+User *InspIRCd::FindUUID(const char *uid)
+{
+       return FindUUID(std::string(uid));
+}
+
 /* find a channel record by channel name and return a pointer to it */
 Channel* InspIRCd::FindChan(const char* chan)
 {
@@ -140,7 +140,7 @@ Channel* InspIRCd::FindChan(const std::string &chan)
 /* Send an error notice to all users, registered or not */
 void InspIRCd::SendError(const std::string &s)
 {
-       for (std::vector<LocalUser*>::const_iterator i = this->Users->local_users.begin(); i != this->Users->local_users.end(); i++)
+       for (LocalUserList::const_iterator i = this->Users->local_users.begin(); i != this->Users->local_users.end(); i++)
        {
                User* u = *i;
                if (u->registered == REG_ALL)
@@ -196,48 +196,120 @@ bool InspIRCd::IsValidMask(const std::string &mask)
        return true;
 }
 
-/* true for valid channel name, false else */
-bool IsChannelHandler::Call(const char *chname, size_t max)
+void InspIRCd::StripColor(std::string &sentence)
 {
-       const char *c = chname + 1;
+       /* refactor this completely due to SQUIT bug since the old code would strip last char and replace with \0 --peavey */
+       int seq = 0;
 
-       /* check for no name - don't check for !*chname, as if it is empty, it won't be '#'! */
-       if (!chname || *chname != '#')
+       for (std::string::iterator i = sentence.begin(); i != sentence.end();)
        {
-               return false;
+               if (*i == 3)
+                       seq = 1;
+               else if (seq && (( ((*i >= '0') && (*i <= '9')) || (*i == ',') ) ))
+               {
+                       seq++;
+                       if ( (seq <= 4) && (*i == ',') )
+                               seq = 1;
+                       else if (seq > 3)
+                               seq = 0;
+               }
+               else
+                       seq = 0;
+
+               if (seq || ((*i == 2) || (*i == 15) || (*i == 22) || (*i == 21) || (*i == 31)))
+                       i = sentence.erase(i);
+               else
+                       ++i;
        }
+}
 
-       while (*c)
+void InspIRCd::ProcessColors(file_cache& input)
+{
+       /*
+        * Replace all color codes from the special[] array to actual
+        * color code chars using C++ style escape sequences. You
+        * can append other chars to replace if you like -- Justasic
+        */
+       static struct special_chars
        {
-               switch (*c)
+               std::string character;
+               std::string replace;
+               special_chars(const std::string &c, const std::string &r) : character(c), replace(r) { }
+       }
+
+       special[] = {
+               special_chars("\\002", "\002"),  // Bold
+               special_chars("\\037", "\037"),  // underline
+               special_chars("\\003", "\003"),  // Color
+               special_chars("\\017", "\017"), // Stop colors
+               special_chars("\\u", "\037"),    // Alias for underline
+               special_chars("\\b", "\002"),    // Alias for Bold
+               special_chars("\\x", "\017"),    // Alias for stop
+               special_chars("\\c", "\003"),    // Alias for color
+               special_chars("", "")
+       };
+
+       for(file_cache::iterator it = input.begin(), it_end = input.end(); it != it_end; it++)
+       {
+               std::string ret = *it;
+               for(int i = 0; special[i].character.empty() == false; ++i)
                {
-                       case ' ':
-                       case ',':
-                       case 7:
-                               return false;
+                       std::string::size_type pos = ret.find(special[i].character);
+                       if(pos == std::string::npos) // Couldn't find the character, skip this line
+                               continue;
+
+                       if((pos > 0) && (ret[pos-1] == '\\') && (ret[pos] == '\\'))
+                               continue; // Skip double slashes.
+
+                       // Replace all our characters in the array
+                       while(pos != std::string::npos)
+                       {
+                               ret = ret.substr(0, pos) + special[i].replace + ret.substr(pos + special[i].character.size());
+                               pos = ret.find(special[i].character, pos + special[i].replace.size());
+                       }
                }
 
-               c++;
+               // Replace double slashes with a single slash before we return
+               std::string::size_type pos = ret.find("\\\\");
+               while(pos != std::string::npos)
+               {
+                       ret = ret.substr(0, pos) + "\\" + ret.substr(pos + 2);
+                       pos = ret.find("\\\\", pos + 1);
+               }
+               *it = ret;
        }
+}
 
-       size_t len = c - chname;
-       /* too long a name - note funky pointer arithmetic here. */
-       if (len > max)
+/* true for valid channel name, false else */
+bool IsChannelHandler::Call(const std::string& chname, size_t max)
+{
+       if (chname.empty() || chname.length() > max)
+               return false;
+
+       if (chname[0] != '#')
+               return false;
+
+       for (std::string::const_iterator i = chname.begin()+1; i != chname.end(); ++i)
        {
-                       return false;
+               switch (*i)
+               {
+                       case ' ':
+                       case ',':
+                       case 7:
+                               return false;
+               }
        }
 
        return true;
 }
 
 /* true for valid nickname, false else */
-bool IsNickHandler::Call(const char* n, size_t max)
+bool IsNickHandler::Call(const std::string& n, size_t max)
 {
-       if (!n || !*n)
+       if (n.empty() || n.length() > max)
                return false;
 
-       unsigned int p = 0;
-       for (const char* i = n; *i; i++, p++)
+       for (std::string::const_iterator i = n.begin(); i != n.end(); ++i)
        {
                if ((*i >= 'A') && (*i <= '}'))
                {
@@ -245,7 +317,7 @@ bool IsNickHandler::Call(const char* n, size_t max)
                        continue;
                }
 
-               if ((((*i >= '0') && (*i <= '9')) || (*i == '-')) && (i > n))
+               if ((((*i >= '0') && (*i <= '9')) || (*i == '-')) && (i != n.begin()))
                {
                        /* "0"-"9", "-" can occur anywhere BUT the first char of a nickname */
                        continue;
@@ -255,17 +327,16 @@ bool IsNickHandler::Call(const char* n, size_t max)
                return false;
        }
 
-       /* too long? or not -- pointer arithmetic rocks */
-       return (p < max);
+       return true;
 }
 
 /* return true for good ident, false else */
-bool IsIdentHandler::Call(const char* n)
+bool IsIdentHandler::Call(const std::string& n)
 {
-       if (!n || !*n)
+       if (n.empty())
                return false;
 
-       for (const char* i = n; *i; i++)
+       for (std::string::const_iterator i = n.begin(); i != n.end(); ++i)
        {
                if ((*i >= 'A') && (*i <= '}'))
                {
@@ -283,7 +354,7 @@ bool IsIdentHandler::Call(const char* n)
        return true;
 }
 
-bool IsSIDHandler::Call(const std::string &str)
+bool InspIRCd::IsSID(const std::string &str)
 {
        /* Returns true if the string given is exactly 3 characters long,
         * starts with a digit, and the other two characters are A-Z or digits
@@ -308,7 +379,7 @@ bool InspIRCd::OpenLog(char**, int)
        }
 
        FileWriter* fw = new FileWriter(startup);
-       FileLogStream *f = new FileLogStream((Config->cmdline.forcedebug ? DEBUG : DEFAULT), fw);
+       FileLogStream *f = new FileLogStream((Config->cmdline.forcedebug ? LOG_DEBUG : LOG_DEFAULT), fw);
 
        this->Logs->AddLogType("*", f, true);
 
@@ -321,7 +392,7 @@ void InspIRCd::CheckRoot()
        if (geteuid() == 0)
        {
                std::cout << "ERROR: You are running an irc server as root! DO NOT DO THIS!" << std::endl << std::endl;
-               this->Logs->Log("STARTUP",DEFAULT,"Can't start as root");
+               this->Logs->Log("STARTUP",LOG_DEFAULT,"Can't start as root");
                Exit(EXIT_STATUS_ROOT);
        }
 #endif
@@ -352,7 +423,7 @@ void InspIRCd::SendWhoisLine(User* user, User* dest, int numeric, const char* fo
 /** Refactored by Brain, Jun 2009. Much faster with some clever O(1) array
  * lookups and pointer maths.
  */
-long InspIRCd::Duration(const std::string &str)
+unsigned long InspIRCd::Duration(const std::string &str)
 {
        unsigned char multiplier = 0;
        long total = 0;
@@ -414,26 +485,6 @@ 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 = tok.find(" EXTBAN=,");
-
-       if (ebpos == std::string::npos)
-       {
-               tok.append(" EXTBAN=,");
-               tok.push_back(c);
-       }
-       else
-       {
-               ebpos += 9;
-               while (isalpha(tok[ebpos]) && tok[ebpos] < c)
-                       ebpos++;
-               tok.insert(ebpos, 1, c);
-       }
-}
-
 std::string InspIRCd::GenRandomStr(int length, bool printable)
 {
        char* buf = new char[length];