1/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 2 * Use of this source code is governed by a BSD-style license that can be 3 * found in the LICENSE file. 4 * 5 * String utility functions that need to be built as part of the firmware. 6 */ 7 8#include "sysincludes.h" 9 10#include "utility.h" 11 12 13uint32_t Uint64ToString(char *buf, uint32_t bufsize, uint64_t value, 14 uint32_t radix, uint32_t zero_pad_width) 15{ 16 char ibuf[UINT64_TO_STRING_MAX]; 17 char *s; 18 uint32_t usedsize = 1; 19 20 if (!buf) 21 return 0; 22 23 /* Clear output buffer in case of error */ 24 *buf = '\0'; 25 26 /* Sanity-check input args */ 27 if (radix < 2 || radix > 36 || zero_pad_width >= UINT64_TO_STRING_MAX) 28 return 0; 29 30 /* Start at end of string and work backwards */ 31 s = ibuf + UINT64_TO_STRING_MAX - 1; 32 *(s) = '\0'; 33 do { 34 int v = value % radix; 35 value /= radix; 36 37 *(--s) = (char)(v < 10 ? v + '0' : v + 'a' - 10); 38 if (++usedsize > bufsize) 39 return 0; /* Result won't fit in buffer */ 40 } while (value); 41 42 /* Zero-pad if necessary */ 43 while (usedsize <= zero_pad_width) { 44 *(--s) = '0'; 45 if (++usedsize > bufsize) 46 return 0; /* Result won't fit in buffer */ 47 } 48 49 /* Now copy the string back to the input buffer. */ 50 Memcpy(buf, s, usedsize); 51 52 /* Don't count the terminating null in the bytes used */ 53 return usedsize - 1; 54} 55 56uint32_t StrnAppend(char *dest, const char *src, uint32_t destlen) 57{ 58 uint32_t used = 0; 59 60 if (!dest || !src || !destlen) 61 return 0; 62 63 /* Skip past existing string in destination.*/ 64 while (dest[used] && used < destlen - 1) 65 used++; 66 67 /* Now copy source */ 68 while (*src && used < destlen - 1) 69 dest[used++] = *src++; 70 71 /* Terminate destination and return count of non-null characters */ 72 dest[used] = 0; 73 return used; 74} 75