From e9d7a3a5eee11b0d4eba5f8aec279b0db84be5e7 Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Fri, 23 Nov 2018 15:14:37 -0500 Subject: Move buffer length to blocks --- bin/edi/buffer.c | 86 ++++++++++++++++++++++++++++---------------------------- bin/edi/edi.h | 9 +++--- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/bin/edi/buffer.c b/bin/edi/buffer.c index 311d88c0..3852872c 100644 --- a/bin/edi/buffer.c +++ b/bin/edi/buffer.c @@ -27,15 +27,14 @@ static struct Block *blockAlloc(struct Block *prev, size_t cap) { struct Block *block = malloc(size); if (!block) err(EX_OSERR, "malloc"); block->prev = prev; + block->len = 0; return block; } struct Buffer bufferAlloc(size_t cap) { - struct Block *block = blockAlloc(NULL, cap); return (struct Buffer) { .cap = cap, - .slice = { block->chars, 0 }, - .block = block, + .block = blockAlloc(NULL, cap), }; } @@ -47,46 +46,47 @@ void bufferFree(struct Buffer *buf) { } } -void bufferInsert(struct Buffer *buf) { - buf->slice.ptr = &buf->block->chars[buf->len]; +void bufferSlice(struct Buffer *buf) { + buf->slice.ptr = &buf->block->chars[buf->block->len]; buf->slice.len = 0; } -void bufferAppend(struct Buffer *buf, wchar_t ch) { - if (buf->len == buf->cap) { +void bufferPush(struct Buffer *buf, wchar_t ch) { + if (buf->block->len == buf->cap) { if (buf->slice.len == buf->cap) buf->cap *= 2; - struct Block *block = blockAlloc(buf->block, buf->cap); - memcpy(block->chars, buf->slice.ptr, sizeof(wchar_t) * buf->slice.len); - buf->len = buf->slice.len; - buf->slice.ptr = block->chars; - buf->block = block; + buf->block = blockAlloc(buf->block, buf->cap); + memcpy( + buf->block->chars, buf->slice.ptr, + sizeof(wchar_t) * buf->slice.len + ); + buf->slice.ptr = buf->block->chars; + buf->block->len = buf->slice.len; } - buf->block->chars[buf->len++] = ch; + buf->block->chars[buf->block->len++] = ch; buf->slice.len++; } -void bufferDelete(struct Buffer *buf) { +void bufferPop(struct Buffer *buf) { if (!buf->slice.len) return; buf->slice.len--; - buf->len--; + buf->block->len--; } wchar_t *bufferDest(struct Buffer *buf, size_t len) { - if (buf->len + len > buf->cap) { + if (buf->block->len + len > buf->cap) { while (len > buf->cap) buf->cap *= 2; buf->block = blockAlloc(buf->block, buf->cap); - buf->len = 0; } - wchar_t *ptr = &buf->block->chars[buf->len]; + wchar_t *ptr = &buf->block->chars[buf->block->len]; buf->slice.ptr = ptr; buf->slice.len = len; - buf->len += len; + buf->block->len += len; return ptr; } void bufferTruncate(struct Buffer *buf, size_t len) { if (len > buf->slice.len) return; - buf->len -= buf->slice.len - len; + buf->block->len -= buf->slice.len - len; buf->slice.len = len; } @@ -96,43 +96,43 @@ void bufferTruncate(struct Buffer *buf, size_t len) { int main() { struct Buffer buf = bufferAlloc(6); - bufferInsert(&buf); - bufferAppend(&buf, L'A'); - bufferAppend(&buf, L'B'); + bufferSlice(&buf); + bufferPush(&buf, L'A'); + bufferPush(&buf, L'B'); assert(!wcsncmp(L"AB", buf.slice.ptr, buf.slice.len)); - bufferInsert(&buf); - bufferAppend(&buf, L'C'); - bufferAppend(&buf, L'D'); + bufferSlice(&buf); + bufferPush(&buf, L'C'); + bufferPush(&buf, L'D'); assert(!wcsncmp(L"CD", buf.slice.ptr, buf.slice.len)); - bufferInsert(&buf); - bufferAppend(&buf, L'E'); - bufferAppend(&buf, L'F'); - bufferAppend(&buf, L'G'); - bufferAppend(&buf, L'H'); + bufferSlice(&buf); + bufferPush(&buf, L'E'); + bufferPush(&buf, L'F'); + bufferPush(&buf, L'G'); + bufferPush(&buf, L'H'); assert(!wcsncmp(L"EFGH", buf.slice.ptr, buf.slice.len)); bufferFree(&buf); buf = bufferAlloc(4); - bufferInsert(&buf); - bufferAppend(&buf, L'A'); - bufferAppend(&buf, L'B'); - bufferAppend(&buf, L'C'); - bufferAppend(&buf, L'D'); - bufferAppend(&buf, L'E'); - bufferAppend(&buf, L'F'); + bufferSlice(&buf); + bufferPush(&buf, L'A'); + bufferPush(&buf, L'B'); + bufferPush(&buf, L'C'); + bufferPush(&buf, L'D'); + bufferPush(&buf, L'E'); + bufferPush(&buf, L'F'); assert(!wcsncmp(L"ABCDEF", buf.slice.ptr, buf.slice.len)); bufferFree(&buf); buf = bufferAlloc(4); - bufferInsert(&buf); - bufferAppend(&buf, L'A'); - bufferAppend(&buf, L'B'); - bufferDelete(&buf); + bufferSlice(&buf); + bufferPush(&buf, L'A'); + bufferPush(&buf, L'B'); + bufferPop(&buf); assert(!wcsncmp(L"A", buf.slice.ptr, buf.slice.len)); - bufferAppend(&buf, L'C'); + bufferPush(&buf, L'C'); assert(!wcsncmp(L"AC", buf.slice.ptr, buf.slice.len)); bufferFree(&buf); diff --git a/bin/edi/edi.h b/bin/edi/edi.h index fd3a2f33..819b0a36 100644 --- a/bin/edi/edi.h +++ b/bin/edi/edi.h @@ -33,18 +33,19 @@ struct Slice { }; struct Buffer { - size_t cap, len; + size_t cap; struct Slice slice; struct Block { struct Block *prev; + size_t len; wchar_t chars[]; } *block; }; struct Buffer bufferAlloc(size_t cap); void bufferFree(struct Buffer *buf); -void bufferInsert(struct Buffer *buf); -void bufferAppend(struct Buffer *buf, wchar_t ch); -void bufferDelete(struct Buffer *buf); +void bufferSlice(struct Buffer *buf); +void bufferPush(struct Buffer *buf, wchar_t ch); +void bufferPop(struct Buffer *buf); wchar_t *bufferDest(struct Buffer *buf, size_t len); void bufferTruncate(struct Buffer *buf, size_t len); -- cgit 1.4.1