diff -r 2cfbcbe86a7c -r 9cd98da9ee17 src/buffer.c --- a/src/buffer.c Sat Apr 30 09:03:17 2022 +0200 +++ b/src/buffer.c Sat Apr 30 09:47:20 2022 +0200 @@ -32,6 +32,7 @@ #include #include #include +#include int cxBufferInit( CxBuffer *buffer, @@ -53,8 +54,12 @@ } buffer->capacity = capacity; buffer->size = 0; + buffer->pos = 0; - buffer->pos = 0; + buffer->flush_func = NULL; + buffer->flush_blkmax = 0; + buffer->flush_blksize = 4096; + buffer->flush_threshold = SIZE_MAX; return 0; } @@ -134,6 +139,7 @@ size_t nitems, CxBuffer *buffer ) { + // TODO: optimize for special case size == nitems == 1 size_t len; if (cx_szmul(size, nitems, &len)) { return 0; @@ -143,15 +149,27 @@ return 0; } + bool perform_flush = false; if (required > buffer->capacity) { - if ((buffer->flags & CX_BUFFER_AUTO_EXTEND) == CX_BUFFER_AUTO_EXTEND) { - if (cxBufferMinimumCapacity(buffer, required)) { - return 0; + if ((buffer->flags & CX_BUFFER_AUTO_EXTEND) == CX_BUFFER_AUTO_EXTEND && required) { + if (buffer->flush_blkmax > 0 && required > buffer->flush_threshold) { + perform_flush = true; + } else { + if (cxBufferMinimumCapacity(buffer, required)) { + return 0; + } } } else { - len = buffer->capacity - buffer->pos; - if (size > 1) { - len -= len % size; + if (buffer->flush_blkmax > 0) { + perform_flush = true; + } else { + // truncate data to be written, if we can neither extend nor flush + len = buffer->capacity - buffer->pos; + if (size > 1) { + // TODO: this is bugged - it would only discard one element and not as many as required + len -= len % size; + nitems = len / size; + } } } } @@ -160,13 +178,25 @@ return len; } - memcpy(buffer->bytes + buffer->pos, ptr, len); - buffer->pos += len; - if (buffer->pos > buffer->size) { - buffer->size = buffer->pos; + if (perform_flush) { + // TODO: implement flushing + // (1) determine how many bytes to flush (use flushmax = blkmax * blksize) + // (2) if len is larger than the number computed in (1) we need more flush cycles, compute how many + // (3) determine how many bytes from the buffer shall be flushed + // (4) if something remains in the buffer, shift the buffer to the left + // (4a) if buffer was shifted, append the new data to the buffer + // (4b) if the buffer was flushed entirely AND the new data also fits into flushmax, + // directly write the new data to the flush sink + return 0; // remove this after implementation + } else { + memcpy(buffer->bytes + buffer->pos, ptr, len); + buffer->pos += len; + if (buffer->pos > buffer->size) { + buffer->size = buffer->pos; + } } - return len / size; + return nitems; } int cxBufferPut(