diff options
Diffstat (limited to '')
-rw-r--r-- | format_result.c | 42 |
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'; +} |