]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/hashcomp.cpp
/who tidyup - needs QA'ing
[user/henk/code/inspircd.git] / src / hashcomp.cpp
index 060d78fe2f8a389db2c1d862cac674692021fddb..53483c7480f0322b078d7aed905648097b73b3ec 100644 (file)
@@ -335,19 +335,37 @@ void irc::modestacker::PushMinus()
        this->Push('-',"");
 }
 
-int irc::modestacker::GetStackedLine(std::deque<std::string> &result)
+int irc::modestacker::GetStackedLine(std::deque<std::string> &result, int max_line_size)
 {
+       if (sequence.empty())
+       {
+               result.clear();
+               return 0;
+       }
+
        int n = 0;
+       int size = 1; /* Account for initial +/- char */
+       int nextsize = 0;
        result.clear();
        result.push_back(adding ? "+" : "-");
 
-       while (!sequence[0].empty() && (sequence.size() > 1) && (result.size() < MAXMODES+1))
+       if (sequence.size() > 1)
+               nextsize = sequence[1].length() + 2;
+
+       while (!sequence[0].empty() && (sequence.size() > 1) && (result.size() < MAXMODES+1) && ((size + nextsize) < max_line_size))
        {
                result[0] += *(sequence[0].begin());
                if (!sequence[1].empty())
+               {
                        result.push_back(sequence[1]);
+                       size += nextsize; /* Account for mode character and whitespace */
+               }
                sequence[0].erase(sequence[0].begin());
                sequence.erase(sequence.begin() + 1);
+
+               if (sequence.size() > 1)
+                       nextsize = sequence[1].length() + 2;
+
                n++;
        }