X-Git-Url: https://git.pterodactylus.net/?p=ecparse.git;a=blobdiff_plain;f=GrowingBuffer.cpp;h=2d26251d66587b3335be8af9b0ce175cc0ae7cc8;hp=602084cabb975609deacce65683f46bc2c0d9bba;hb=HEAD;hpb=6cdb1a3a8775e9816948c9366c75d212fbd986c4 diff --git a/GrowingBuffer.cpp b/GrowingBuffer.cpp index 602084c..2d26251 100644 --- a/GrowingBuffer.cpp +++ b/GrowingBuffer.cpp @@ -2,22 +2,25 @@ * © 2008 by David ‘Bombe’ Roden */ +#include #include #include -#include #include "GrowingBuffer.h" +#include "GlobalSettings.h" GrowingBuffer::GrowingBuffer(size_t initialSize) { - this->data = malloc(1024); - this->size = 1024; + this->data = malloc(initialSize); + this->size = initialSize; this->limit = 0; this->position = 0; + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] created new GrowingBuffer with a size of %d.\n", __FILE__, __LINE__, initialSize); } GrowingBuffer::~GrowingBuffer() { if (this->data) { free(this->data); } + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] destroyed GrowingBuffer.\n", __FILE__, __LINE__); } size_t GrowingBuffer::getPosition() { @@ -32,42 +35,56 @@ size_t GrowingBuffer::getSize() { return size; } +size_t GrowingBuffer::getRemaining() { + return limit - position; +} + void GrowingBuffer::seek(size_t position) { this->position = (position > limit) ? limit : position; + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] setting position to %d.\n", __FILE__, __LINE__, position); } void* GrowingBuffer::read(void* buffer, size_t length) { size_t bytesToCopy = (length > (limit - position)) ? (limit - position) : length; - memcpy(buffer, (ptrdiff_t*) data + position, bytesToCopy); + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] copying %d bytes (%d requested) into buffer from position %d.\n", __FILE__, __LINE__, bytesToCopy, length, position); + memcpy(buffer, (char*) data + position, bytesToCopy); + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] advancing position from %d to %d.\n", __FILE__, __LINE__, position, position + bytesToCopy); position += bytesToCopy; return buffer; } void GrowingBuffer::write(const void* buffer, size_t length) { - if (length > (size - position)) { + if (length > (size - limit)) { int newSize = size; do { newSize *= 2; - } while (length > (newSize - position)); + } while (length > (newSize - limit)); + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] resizing buffer from %d to %d bytes to fit in %d bytes.\n", __FILE__, __LINE__, size, newSize, length); void* newData = malloc(newSize); - memcpy(newData, data, position); + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] copying %d bytes into new buffer.\n", __FILE__, __LINE__, limit); + memcpy(newData, data, limit); free(data); data = newData; } - memcpy((ptrdiff_t*) data + position, buffer, length); + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] writing %d bytes to buffer at position %d.\n", __FILE__, __LINE__, length, limit); + memcpy((char*) data + limit, buffer, length); + limit += length; } void GrowingBuffer::cut() { - memcpy(data, (ptrdiff_t*) data + position, position); - limit = position; + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] discarding %d bytes, %d bytes remaining.\n", __FILE__, __LINE__, position, limit - position); + memmove(data, (char*) data + position, limit); + limit -= position; position = 0; } void GrowingBuffer::truncate() { + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] truncating %d bytes at position %d.\n", __FILE__, __LINE__, (limit - position), position); limit = position; } void GrowingBuffer::clear() { + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] clearing buffer, discarding %d bytes.\n", __FILE__, __LINE__, limit); position = 0; limit = 0; } @@ -77,6 +94,7 @@ void GrowingBuffer::resize(double factor) { factor = 1.0; } if (size != (limit * factor)) { + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] resizing buffer from %d to %d bytes.\n", __FILE__, __LINE__, size, (size_t) (limit * factor)); void* newData = malloc((size_t) (limit * factor)); memcpy(newData, data, limit); free(data); @@ -84,3 +102,15 @@ void GrowingBuffer::resize(double factor) { } } +size_t GrowingBuffer::indexOf(char c, size_t start) { + void* foundIndex; + + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] searching for (char) 0x%02x from %d to %d.\n", __FILE__, __LINE__, c, position + start, position + (limit - start)); + foundIndex = memchr((char*) data + position + start, c, (limit - (position + start))); + if (foundIndex) { + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] found character at %d.\n", __FILE__, __LINE__, (char*) foundIndex - ((char*) data + position)); + return (char*) foundIndex - ((char*) data - position); + } + return (size_t) -1; +} +