Buffer: Optimize scanning for the next crlf

This commit is contained in:
Henrik Rydgård 2024-11-22 10:13:41 +01:00
parent 129c64c6b8
commit 305453b52d
4 changed files with 34 additions and 5 deletions

View File

@ -95,12 +95,12 @@ int Buffer::SkipLineCRLF() {
// This relies on having buffered data!
int Buffer::OffsetToAfterNextCRLF() {
for (int i = 0; i < (int)data_.size() - 1; i++) {
if (data_.peek(i) == '\r' && data_.peek(i + 1) == '\n') {
return i + 2;
}
}
int offset = data_.next_crlf_offset();
if (offset >= 0) {
return offset + 2;
} else {
return -1;
}
}
void Buffer::Printf(const char *fmt, ...) {

View File

@ -186,6 +186,27 @@ public:
head_ = b;
}
// If return value is negative, one wasn't found.
int next_crlf_offset() {
int offset = 0;
Block *b = head_;
do {
int remain = b->tail - b->head;
for (int i = 0; i < remain; i++) {
if (b->data[b->head + i] == '\r') {
// Use peek to avoid handling edge cases.
if (peek(offset + i + 1) == '\n') {
return offset + i;
}
}
}
offset += remain;
b = b->next;
} while (b);
// Ran out of data.
return -1;
}
private:
struct Block {
~Block() {

View File

@ -15,6 +15,10 @@
#define MSG_NOSIGNAL 0x00
#endif
#if _MSC_VER
#pragma warning(disable:4267)
#endif
#include "Common/File/FileDescriptor.h"
#include "Common/Log.h"
#include "Common/Net/NetBuffer.h"

View File

@ -1076,6 +1076,10 @@ bool TestCharQueue() {
queue.pop_front_bulk(dest, 4);
EXPECT_EQ_MEM(dest, "opqr", 4);
EXPECT_TRUE(queue.empty());
queue.push_back("asdf");
EXPECT_EQ_INT(queue.next_crlf_offset(), -1);
queue.push_back("\r\r\n");
EXPECT_EQ_INT(queue.next_crlf_offset(), 5);
return true;
}