aboutsummaryrefslogtreecommitdiff
path: root/text.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2020-09-27 14:42:13 +0200
committerMarc André Tanner <mat@brain-dump.org>2020-10-10 10:03:17 +0200
commit38ac824360d28eb447558f916696c6032ef8cd0e (patch)
treeaf8af6f250dc759d55495495edeb6e0fbd9d3d0d /text.c
parent08aee6721db1b1eba6f9e2d58b4e4ffe37a9ecd1 (diff)
downloadvis-38ac824360d28eb447558f916696c6032ef8cd0e.tar.gz
vis-38ac824360d28eb447558f916696c6032ef8cd0e.tar.xz
text: simplify reading of initial file content
Avoid unnecessary copy and system calls in block_read.
Diffstat (limited to 'text.c')
-rw-r--r--text.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/text.c b/text.c
index 2e7c7ef..e66cfe7 100644
--- a/text.c
+++ b/text.c
@@ -212,20 +212,21 @@ static Block *block_read(Text *txt, size_t size, int fd) {
Block *blk = block_alloc(txt, size);
if (!blk)
return NULL;
- while (size > 0) {
- char data[4096];
- ssize_t len = read(fd, data, MIN(sizeof(data), size));
+ char *data = blk->data;
+ size_t rem = size;
+ while (rem > 0) {
+ ssize_t len = read(fd, data, rem);
if (len == -1) {
- txt->blocks = blk->next;
block_free(blk);
return NULL;
} else if (len == 0) {
break;
} else {
- block_append(blk, data, len);
- size -= len;
+ data += len;
+ rem -= len;
}
}
+ blk->len = size - rem;
return blk;
}