From b35cea4b8d82a28994351f3b550e8191ee1d94bf Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 25 Aug 2024 23:28:25 +0200 Subject: First commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- calculate.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 calculate.c (limited to 'calculate.c') diff --git a/calculate.c b/calculate.c new file mode 100644 index 0000000..69181dd --- /dev/null +++ b/calculate.c @@ -0,0 +1,55 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" + + +static void +process(struct algorithm *algorithm, struct global_data *global) +{ + size_t r; + r = algorithm->hasher.process(&algorithm->hasher, + &global->buffer->buf[algorithm->offset], + global->buffer->length - algorithm->offset); + algorithm->offset += r; +} + + +static void +finalise(struct algorithm *algorithm, struct global_data *global) +{ + if (algorithm->hasher.finalise_const(&algorithm->hasher, &global->buffer->buf[algorithm->offset], + global->buffer->length - algorithm->offset, 0)) + abort(); + format_result(algorithm, global->file, global->format); +} + + +int +calculate(const char *file, struct barrier_group *group, struct global_data *global) +{ + int fd, is_new_fd, r, ret = -1; + const char *fname; + + global->nalgorithms = inithashers(global->algorithms, global->nalgorithms); + if (!global->nalgorithms) + return 0; + + fd = openfile(file, &is_new_fd, &fname); + if (fd < 0) + return -1; + + global->buffer->length = 0; + while (!(r = feedbuffer(fd, global->buffer, fname))) { + barriersend(group, global, &process); + shiftbuffer(global->algorithms, global->nalgorithms, global->buffer); + } + if (r < 0) + goto fail; + + barriersend(group, global, &finalise); + ret = 0; +fail: + destroyhashers(global->algorithms, global->nalgorithms); + if (is_new_fd) + close(fd); + return ret; +} -- cgit v1.2.3-70-g09d2