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
|
/* Copyright (c) 2011 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 Strncat(char *dest, const char *src, uint32_t destlen) {
uint32_t used = 0;
if (!dest || !src)
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;
}
|