// SPDX-License-Identifier: GPL-2.0+
/*
 * String functions
 *
 * Copyright (c) 2020 AKASHI Takahiro, Linaro Limited
 */

#define LOG_CATEGORY LOGC_EFI

#include <charset.h>
#include <efi_loader.h>
#include <malloc.h>

/**
 * efi_create_indexed_name - create a string name with an index
 * @buffer:	Buffer
 * @name:	Name string
 * @index:	Index
 *
 * Create a utf-16 string with @name, appending @index.
 * For example, u"Capsule0001"
 *
 * The caller must ensure that the buffer has enough space for the resulting
 * string including the trailing L'\0'.
 *
 * Return: A pointer to the next position after the created string
 *	   in @buffer, or NULL otherwise
 */
u16 *efi_create_indexed_name(u16 *buffer, size_t buffer_size, const char *name,
			     unsigned int index)
{
	u16 *p = buffer;
	char index_buf[5];
	size_t size;

	size = (utf8_utf16_strlen(name) * sizeof(u16) +
		sizeof(index_buf) * sizeof(u16));
	if (buffer_size < size)
		return NULL;
	utf8_utf16_strcpy(&p, name);
	snprintf(index_buf, sizeof(index_buf), "%04X", index);
	utf8_utf16_strcpy(&p, index_buf);

	return p;
}

/**
 * efi_convert_string - Convert an ASCII or UTF-8 string to UTF-16
 * @str:	String to be converted
 *
 * Return: Converted string in UTF-16 format. The caller is responsible for
 *         freeing this string when it is no longer needed.
 */
efi_string_t efi_convert_string(const char *str)
{
	efi_string_t str_16, tmp;
	size_t sz_16;

	sz_16 = utf8_utf16_strlen(str);
	str_16 = calloc(sz_16 + 1, sizeof(u16));
	if (!str_16)
		return NULL;

	tmp = str_16;
	utf8_utf16_strcpy(&tmp, str);

	return str_16;
}
