aboutsummaryrefslogtreecommitdiffstats
path: root/format_result.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--format_result.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/format_result.c b/format_result.c
new file mode 100644
index 0000000..bb0bd29
--- /dev/null
+++ b/format_result.c
@@ -0,0 +1,42 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+
+void
+format_result(struct algorithm *algorithm, const char *file, enum format format)
+{
+ char *p;
+ size_t size = algorithm->hasher.hash_size + 1U;
+ size += (format & WITH_ALGOSTR) ? strlen(algorithm->algostr) + 1U : 0U;
+ size += (format & WITH_FILENAME) ? 2U + strlen(file) : 0U;
+ size += (format & WITH_NUL) ? 1U : 0U;
+ size += (format & WITH_LF) ? 1U : 0U;
+ size += ((format & FORMAT_MASK) != BINARY) ? algorithm->hasher.hash_size : 0U;
+ if (size > algorithm->result_size) {
+ algorithm->result = erealloc(algorithm->result, size);
+ algorithm->result_size = size;
+ }
+ algorithm->result_length = size - 1U;
+ p = algorithm->result;
+ if (format & WITH_ALGOSTR)
+ p = stpcpy(stpcpy(p, algorithm->algostr), ":");
+ switch (format & FORMAT_MASK) {
+ case BINARY:
+ p = mempcpy(p, algorithm->hasher.hash_output, algorithm->hasher.hash_size);
+ break;
+ case LOWERCASE_HEX:
+ p = hex(p, algorithm->hasher.hash_output, algorithm->hasher.hash_size, "0123456789abcdef");
+ break;
+ case UPPERCASE_HEX:
+ p = hex(p, algorithm->hasher.hash_output, algorithm->hasher.hash_size, "0123456789ABCDEF");
+ break;
+ default:
+ abort();
+ }
+ if (format & WITH_FILENAME)
+ p = stpcpy(stpcpy(p, " "), file);
+ if (format & WITH_NUL)
+ *p++ = '\0';
+ if (format & WITH_LF)
+ *p++ = '\n';
+}