// SPDX-License-Identifier: MIT
// Copyright (C) 2018 Luc Van Oostenryck

#include "utils.h"
#include "allocate.h"
#include <string.h>
#include <stdarg.h>
#include <stdio.h>


unsigned int hexval(unsigned int c)
{
	int retval = 256;
	switch (c) {
	case '0'...'9':
		retval = c - '0';
		break;
	case 'a'...'f':
		retval = c - 'a' + 10;
		break;
	case 'A'...'F':
		retval = c - 'A' + 10;
		break;
	}
	return retval;
}

void *xmemdup(const void *src, size_t len)
{
	return memcpy(__alloc_bytes(len), src, len);
}

char *xstrdup(const char *src)
{
	return xmemdup(src, strlen(src) + 1);
}

char *xvasprintf(const char *fmt, va_list ap)
{
	va_list ap2;
	char *str;
	int n;

	va_copy(ap2, ap);
	n = vsnprintf(NULL, 0, fmt, ap2) + 1;
	va_end(ap2);

	str = __alloc_bytes(n);
	vsnprintf(str, n, fmt, ap);

	return str;
}

char *xasprintf(const char *fmt, ...)
{
	va_list ap;
	char *str;

	va_start(ap, fmt);
	str = xvasprintf(fmt, ap);
	va_end(ap);

	return str;
}
