+ if (!AllowedPrivs)
+ {
+ if (noisy)
+ this->WriteServ("NOTICE %s :Privset empty(!?)", this->nick.c_str());
+ return false;
+ }
+
+ if (AllowedPrivs->find(privstr) != AllowedPrivs->end())
+ {
+ return true;
+ }
+ else if (AllowedPrivs->find("*") != AllowedPrivs->end())
+ {
+ return true;
+ }
+
+ if (noisy)
+ this->WriteServ("NOTICE %s :Oper type %s does not have access to priv %s", this->nick.c_str(), this->oper.c_str(), privstr.c_str());
+ return false;
+}
+
+bool User::AddBuffer(const std::string &a)
+{
+ std::string::size_type start = 0;
+ std::string::size_type i = a.find('\r');
+
+ /*
+ * The old implementation here took a copy, and rfind() on \r, removing as it found them, before
+ * copying a second time onto the recvq. That's ok, but involves three copies minimum (recv() to buffer,
+ * buffer to here, here to recvq) - The new method now copies twice (recv() to buffer, buffer to recvq).
+ *
+ * We use find() instead of rfind() for clarity, however unlike the old code, our scanning of the string is
+ * contiguous: as we specify a startpoint, we never see characters we have scanned previously, making this
+ * marginally faster in cases with a number of \r hidden early on in the buffer.
+ *
+ * How it works:
+ * Start at first pos of string, find first \r, append everything in the chunk (excluding \r) to recvq. Set
+ * i ahead of the \r, search for next \r, add next chunk to buffer... repeat.
+ * -- w00t (7 may, 2008)
+ */
+ if (i == std::string::npos)
+ {
+ // no \r that we need to dance around, just add to buffer
+ recvq.append(a);
+ }
+ else
+ {
+ // While we can find the end of a chunk to add