aboutsummaryrefslogtreecommitdiffstats
path: root/calculate.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--calculate.c55
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;
+}