/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * String utility functions that need to be built as part of the firmware.
 */

#include "sysincludes.h"

#include "utility.h"


uint32_t Uint64ToString(char *buf, uint32_t bufsize, uint64_t value,
			uint32_t radix, uint32_t zero_pad_width)
{
	char ibuf[UINT64_TO_STRING_MAX];
	char *s;
	uint32_t usedsize = 1;

	if (!buf)
		return 0;

	/* Clear output buffer in case of error */
	*buf = '\0';

	/* Sanity-check input args */
	if (radix < 2 || radix > 36 || zero_pad_width >= UINT64_TO_STRING_MAX)
		return 0;

	/* Start at end of string and work backwards */
	s = ibuf + UINT64_TO_STRING_MAX - 1;
	*(s) = '\0';
	do {
		int v = value % radix;
		value /= radix;

		*(--s) = (char)(v < 10 ? v + '0' : v + 'a' - 10);
		if (++usedsize > bufsize)
			return 0;  /* Result won't fit in buffer */
	} while (value);

	/* Zero-pad if necessary */
	while (usedsize <= zero_pad_width) {
		*(--s) = '0';
		if (++usedsize > bufsize)
			return 0;  /* Result won't fit in buffer */
	}

	/* Now copy the string back to the input buffer. */
	memcpy(buf, s, usedsize);

	/* Don't count the terminating null in the bytes used */
	return usedsize - 1;
}

uint32_t StrnAppend(char *dest, const char *src, uint32_t destlen)
{
	uint32_t used = 0;

	if (!dest || !src || !destlen)
		return 0;

	/* Skip past existing string in destination.*/
	while (dest[used] && used < destlen - 1)
		used++;

	/* Now copy source */
	while (*src && used < destlen - 1)
		dest[used++] = *src++;

	/* Terminate destination and return count of non-null characters */
	dest[used] = 0;
	return used;
}
