summaryrefslogtreecommitdiff
path: root/firmware/lib/utility_string.c
blob: 63e43c681777b933f9924b7f9b86507bf894acf2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* 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;
}