mirror of
https://github.com/hrydgard/ppsspp.git
synced 2024-11-22 21:09:52 +00:00
Buffer: Optimize scanning for the next crlf
This commit is contained in:
parent
129c64c6b8
commit
305453b52d
@ -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;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void Buffer::Printf(const char *fmt, ...) {
|
||||
|
@ -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() {
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user