]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/helperfuncs.cpp
Watch mode names with ModeWatchers instead of mode letters
[user/henk/code/inspircd.git] / src / helperfuncs.cpp
index ab2ed5682414cbc46422797624f513f2f02c5c06..e86c0bc7076d8c911791822e83b8b9d28932486e 100644 (file)
@@ -331,7 +331,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",LOG_DEFAULT,"Can't start as root");
+               this->Logs->Log("STARTUP", LOG_DEFAULT, "Can't start as root");
                Exit(EXIT_STATUS_ROOT);
        }
 #endif
@@ -350,13 +350,9 @@ void InspIRCd::SendWhoisLine(User* user, User* dest, int numeric, const std::str
 
 void InspIRCd::SendWhoisLine(User* user, User* dest, int numeric, const char* format, ...)
 {
-       char textbuffer[MAXBUF];
-       va_list argsPtr;
-       va_start (argsPtr, format);
-       vsnprintf(textbuffer, MAXBUF, format, argsPtr);
-       va_end(argsPtr);
-
-       this->SendWhoisLine(user, dest, numeric, std::string(textbuffer));
+       std::string textbuffer;
+       VAFORMAT(textbuffer, format, format)
+       this->SendWhoisLine(user, dest, numeric, textbuffer);
 }
 
 /** Refactored by Brain, Jun 2009. Much faster with some clever O(1) array
@@ -402,17 +398,32 @@ unsigned long InspIRCd::Duration(const std::string &str)
        return total + subtotal;
 }
 
-const char* InspIRCd::Format(const char* formatString, ...)
+const char* InspIRCd::Format(va_list &vaList, const char* formatString)
 {
        static std::vector<char> formatBuffer(1024);
-       int vsnret = 0;
 
-       va_list vaList;
-       va_start(vaList, formatString);
-       while ((vsnret = vsnprintf(&formatBuffer[0], formatBuffer.size(), formatString, vaList)) < 0 || static_cast<unsigned int>(vsnret) >= formatBuffer.size())
+       while (true)
+       {
+               va_list dst;
+               va_copy(dst, vaList);
+
+               int vsnret = vsnprintf(&formatBuffer[0], formatBuffer.size(), formatString, dst);
+               if (vsnret > 0 && static_cast<unsigned>(vsnret) < formatBuffer.size())
+               {
+                       return &formatBuffer[0];
+               }
+
                formatBuffer.resize(formatBuffer.size() * 2);
-       va_end(vaList);
-       return &formatBuffer[0];
+       }
+
+       throw CoreException();
+}
+
+const char* InspIRCd::Format(const char* formatString, ...)
+{
+       const char* ret;
+       VAFORMAT(ret, formatString, formatString);
+       return ret;
 }
 
 bool InspIRCd::ULine(const std::string& sserver)