diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cache.c | 38 | ||||
-rw-r--r-- | src/stream.c | 34 | ||||
-rw-r--r-- | src/stream.h | 3 |
3 files changed, 39 insertions, 36 deletions
diff --git a/src/cache.c b/src/cache.c index e0852f4..f158e44 100644 --- a/src/cache.c +++ b/src/cache.c @@ -2,6 +2,7 @@ /* Copyright (C) 2020-2021 Gediminas Jakutis */ +#include <unistd.h> #include <errno.h> #include <stdlib.h> #include <string.h> @@ -11,6 +12,8 @@ #include "stream.h" #include "cache.h" +static int cache_readfile(struct stream * const in); + int cache_create(struct stream * const in) { int ret = 0; @@ -48,7 +51,7 @@ int cache_populate(struct stream * const in) } } } else if (in->type == stream_in) { - try_s((ret == stream_readfile(in)), err); + try_s((ret == cache_readfile(in)), err); } else { try(1, err, EINVAL, "cannot populate a non-reading stream cache"); } @@ -247,3 +250,36 @@ int cache_rewind(struct stream * const in) return ret; } + +static int cache_readfile(struct stream * const in) +{ + ssize_t ret = 0; + size_t remaining = in->n * in->settings->stride; + ssize_t bytesread = 0; + size_t i; + + try(in->fd < 3, err, EINVAL, "no file open for reading"); + + do { + ret = read(in->fd, in->cache + bytesread, remaining); + if (ret < 0) { + try(errno != EAGAIN, err, errno, "Writing to stream failed with %zi", ret); + } else { + bytesread += ret; + remaining -= ret; + } + } while (ret); + + /* if this is a list, we need to adjust the link pointers from file offsets + * to buffer addresses. 'Cept for the last one, which needs to be NULL. + */ + if (in->settings->format == list) { + for (i = 0; i < (in->n - 1); ++i) { + in->cache_l[i].nextaddr = in->cache + in->cache_l[i].offset; + } + in->cnode = in->cache_l; + } + +err: + return ret; +} diff --git a/src/stream.c b/src/stream.c index 9de9e83..e29d17d 100644 --- a/src/stream.c +++ b/src/stream.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-only */ -/* Copyright (C) 2020 Gediminas Jakutis */ +/* Copyright (C) 2020-2021 Gediminas Jakutis */ #include <sys/types.h> #include <sys/stat.h> @@ -96,38 +96,6 @@ err: return ret; } -int stream_readfile(struct stream * const in) -{ - ssize_t ret = 0; - size_t remaining = in->n * in->settings->stride; - ssize_t bytesread = 0; - size_t i; - - try(in->fd < 3, err, EINVAL, "no file open for reading"); - - do { - ret = read(in->fd, in->cache + bytesread, remaining); - if (ret < 0) { - try(errno != EAGAIN, err, errno, "Writing to stream failed with %zi", ret); - } else { - bytesread += ret; - remaining -= ret; - } - } while (ret); - - /* if this is a list, we need to adjust the link pointers from file offsets - * to buffer addresses. 'Cept for the last one, which needs to be NULL. - */ - if (in->settings->format == list) { - for (i = 0; i < (in->n - 1); ++i) { - in->cache_l[i].offset = (char *) in->cache_l[i].next - in->cache; - } - } - -err: - return ret; -} - int stream_shallow_copy(struct stream const * const restrict src, struct stream * const dest) { int ret = 0; diff --git a/src/stream.h b/src/stream.h index 7a429a4..d208bdb 100644 --- a/src/stream.h +++ b/src/stream.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-only */ -/* Copyright (C) 2020 Gediminas Jakutis */ +/* Copyright (C) 2020-2021 Gediminas Jakutis */ #ifndef ALGOS_IO_H_INCLUDED #define ALGOS_IO_H_INCLUDED @@ -9,7 +9,6 @@ int stream_open(struct stream * const in); int stream_close(struct stream * const in); -int stream_readfile(struct stream * const in); int direct_get_array(struct stream * const restrict in, ssize_t idx, struct entry_l * const data); int direct_get_list(struct stream * const restrict in, ssize_t idx, struct entry_l * const data); |