1f08c3bdfSopenharmony_ci// SPDX-License-Identifier: MIT
2f08c3bdfSopenharmony_ci// Copyright (C) 2018 Luc Van Oostenryck
3f08c3bdfSopenharmony_ci
4f08c3bdfSopenharmony_ci#include "utils.h"
5f08c3bdfSopenharmony_ci#include "allocate.h"
6f08c3bdfSopenharmony_ci#include <string.h>
7f08c3bdfSopenharmony_ci#include <stdarg.h>
8f08c3bdfSopenharmony_ci#include <stdio.h>
9f08c3bdfSopenharmony_ci
10f08c3bdfSopenharmony_ci
11f08c3bdfSopenharmony_ciunsigned int hexval(unsigned int c)
12f08c3bdfSopenharmony_ci{
13f08c3bdfSopenharmony_ci	int retval = 256;
14f08c3bdfSopenharmony_ci	switch (c) {
15f08c3bdfSopenharmony_ci	case '0'...'9':
16f08c3bdfSopenharmony_ci		retval = c - '0';
17f08c3bdfSopenharmony_ci		break;
18f08c3bdfSopenharmony_ci	case 'a'...'f':
19f08c3bdfSopenharmony_ci		retval = c - 'a' + 10;
20f08c3bdfSopenharmony_ci		break;
21f08c3bdfSopenharmony_ci	case 'A'...'F':
22f08c3bdfSopenharmony_ci		retval = c - 'A' + 10;
23f08c3bdfSopenharmony_ci		break;
24f08c3bdfSopenharmony_ci	}
25f08c3bdfSopenharmony_ci	return retval;
26f08c3bdfSopenharmony_ci}
27f08c3bdfSopenharmony_ci
28f08c3bdfSopenharmony_civoid *xmemdup(const void *src, size_t len)
29f08c3bdfSopenharmony_ci{
30f08c3bdfSopenharmony_ci	return memcpy(__alloc_bytes(len), src, len);
31f08c3bdfSopenharmony_ci}
32f08c3bdfSopenharmony_ci
33f08c3bdfSopenharmony_cichar *xstrdup(const char *src)
34f08c3bdfSopenharmony_ci{
35f08c3bdfSopenharmony_ci	return xmemdup(src, strlen(src) + 1);
36f08c3bdfSopenharmony_ci}
37f08c3bdfSopenharmony_ci
38f08c3bdfSopenharmony_cichar *xvasprintf(const char *fmt, va_list ap)
39f08c3bdfSopenharmony_ci{
40f08c3bdfSopenharmony_ci	va_list ap2;
41f08c3bdfSopenharmony_ci	char *str;
42f08c3bdfSopenharmony_ci	int n;
43f08c3bdfSopenharmony_ci
44f08c3bdfSopenharmony_ci	va_copy(ap2, ap);
45f08c3bdfSopenharmony_ci	n = vsnprintf(NULL, 0, fmt, ap2) + 1;
46f08c3bdfSopenharmony_ci	va_end(ap2);
47f08c3bdfSopenharmony_ci
48f08c3bdfSopenharmony_ci	str = __alloc_bytes(n);
49f08c3bdfSopenharmony_ci	vsnprintf(str, n, fmt, ap);
50f08c3bdfSopenharmony_ci
51f08c3bdfSopenharmony_ci	return str;
52f08c3bdfSopenharmony_ci}
53f08c3bdfSopenharmony_ci
54f08c3bdfSopenharmony_cichar *xasprintf(const char *fmt, ...)
55f08c3bdfSopenharmony_ci{
56f08c3bdfSopenharmony_ci	va_list ap;
57f08c3bdfSopenharmony_ci	char *str;
58f08c3bdfSopenharmony_ci
59f08c3bdfSopenharmony_ci	va_start(ap, fmt);
60f08c3bdfSopenharmony_ci	str = xvasprintf(fmt, ap);
61f08c3bdfSopenharmony_ci	va_end(ap);
62f08c3bdfSopenharmony_ci
63f08c3bdfSopenharmony_ci	return str;
64f08c3bdfSopenharmony_ci}
65