diff options
Diffstat (limited to '')
-rw-r--r-- | calculate.c | 55 |
1 files changed, 55 insertions, 0 deletions
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; +} |