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