aboutsummaryrefslogblamecommitdiffstats
path: root/format_result.c
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';
}