blob: bb0bd29f5c63bf9cb1860d5059228a3bbb4e5fc0 (
plain) (
tree)
|
|
/* 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';
}
|