diff options
Diffstat (limited to 'common/tf_snprintf.c')
-rw-r--r-- | common/tf_snprintf.c | 125 |
1 files changed, 0 insertions, 125 deletions
diff --git a/common/tf_snprintf.c b/common/tf_snprintf.c deleted file mode 100644 index 6df13772..00000000 --- a/common/tf_snprintf.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include <debug.h> -#include <platform.h> -#include <stdarg.h> - -static void string_print(char **s, size_t n, size_t *chars_printed, - const char *str) -{ - while (*str) { - if (*chars_printed < n) - *(*s)++ = *str; - (*chars_printed)++; - str++; - } -} - -static void unsigned_dec_print(char **s, size_t n, size_t *chars_printed, - unsigned int unum) -{ - /* Enough for a 32-bit unsigned decimal integer (4294967295). */ - unsigned char num_buf[10]; - int i = 0, rem; - - do { - rem = unum % 10; - num_buf[i++] = '0' + rem; - } while (unum /= 10); - - while (--i >= 0) { - if (*chars_printed < n) - *(*s)++ = num_buf[i]; - (*chars_printed)++; - } -} - -/******************************************************************* - * Reduced snprintf to be used for Trusted firmware. - * The following type specifiers are supported: - * - * %d or %i - signed decimal format - * %s - string format - * %u - unsigned decimal format - * - * The function panics on all other formats specifiers. - * - * It returns the number of characters that would be written if the - * buffer was big enough. If it returns a value lower than n, the - * whole string has been written. - *******************************************************************/ -int tf_snprintf(char *s, size_t n, const char *fmt, ...) -{ - va_list args; - int num; - unsigned int unum; - char *str; - size_t chars_printed = 0; - - if (n == 1) { - /* Buffer is too small to actually write anything else. */ - *s = '\0'; - n = 0; - } else if (n >= 2) { - /* Reserve space for the terminator character. */ - n--; - } - - va_start(args, fmt); - while (*fmt) { - - if (*fmt == '%') { - fmt++; - /* Check the format specifier. */ - switch (*fmt) { - case 'i': - case 'd': - num = va_arg(args, int); - - if (num < 0) { - if (chars_printed < n) - *s++ = '-'; - chars_printed++; - - unum = (unsigned int)-num; - } else { - unum = (unsigned int)num; - } - - unsigned_dec_print(&s, n, &chars_printed, unum); - break; - case 's': - str = va_arg(args, char *); - string_print(&s, n, &chars_printed, str); - break; - case 'u': - unum = va_arg(args, unsigned int); - unsigned_dec_print(&s, n, &chars_printed, unum); - break; - default: - /* Panic on any other format specifier. */ - ERROR("tf_snprintf: specifier with ASCII code '%d' not supported.", - *fmt); - plat_panic_handler(); - } - fmt++; - continue; - } - - if (chars_printed < n) - *s++ = *fmt; - fmt++; - chars_printed++; - } - - va_end(args); - - if (n > 0) - *s = '\0'; - - return chars_printed; -} |