diff options
author | Madhukar Pappireddy <madhukar.pappireddy@arm.com> | 2021-01-21 21:34:09 +0000 |
---|---|---|
committer | TrustedFirmware Code Review <review@review.trustedfirmware.org> | 2021-01-21 21:34:09 +0000 |
commit | 0b2b83ea937cd877edb13b04f32d6ed191826730 (patch) | |
tree | 2ec999b2c0c78ade83424f15c1b6b2677b167125 | |
parent | d194afa71b4f946603ec86fab2309533a76cbc95 (diff) | |
parent | 7981c5043b3b77b87847148ea0df81e9ec59aa56 (diff) | |
download | arm-trusted-firmware-0b2b83ea937cd877edb13b04f32d6ed191826730.tar.gz |
Merge changes I2add6b4b,I9b296372,I7af2f1d1 into integration
* changes:
libc/snprintf: use macro to reduce duplicated code
libc/snprintf: add support to print "%" character
libc/printf: add support to print "%" character
-rw-r--r-- | lib/libc/printf.c | 5 | ||||
-rw-r--r-- | lib/libc/snprintf.c | 35 |
2 files changed, 21 insertions, 19 deletions
diff --git a/lib/libc/printf.c b/lib/libc/printf.c index 2715a72d4..45e153ec7 100644 --- a/lib/libc/printf.c +++ b/lib/libc/printf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2021, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -108,6 +108,9 @@ int vprintf(const char *fmt, va_list args) /* Check the format specifier */ loop: switch (*fmt) { + case '%': + (void)putchar('%'); + break; case 'i': /* Fall through to next one */ case 'd': num = get_num_va_args(args, l_count); diff --git a/lib/libc/snprintf.c b/lib/libc/snprintf.c index 6e80d8c03..3b175ed6a 100644 --- a/lib/libc/snprintf.c +++ b/lib/libc/snprintf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -10,16 +10,20 @@ #include <common/debug.h> #include <plat/common/platform.h> +#define CHECK_AND_PUT_CHAR(buf, size, chars_printed, ch) \ + do { \ + if ((chars_printed) < (size)) { \ + *(buf) = (ch); \ + (buf)++; \ + } \ + (chars_printed)++; \ + } while (false) + static void string_print(char **s, size_t n, size_t *chars_printed, const char *str) { while (*str != '\0') { - if (*chars_printed < n) { - *(*s) = *str; - (*s)++; - } - - (*chars_printed)++; + CHECK_AND_PUT_CHAR(*s, n, *chars_printed, *str); str++; } } @@ -130,6 +134,9 @@ int vsnprintf(char *s, size_t n, const char *fmt, va_list args) /* Check the format specifier. */ loop: switch (*fmt) { + case '%': + CHECK_AND_PUT_CHAR(s, n, chars_printed, '%'); + break; case '0': case '1': case '2': @@ -158,12 +165,8 @@ loop: num = va_arg(args, int); if (num < 0) { - if (chars_printed < n) { - *s = '-'; - s++; - } - chars_printed++; - + CHECK_AND_PUT_CHAR(s, n, chars_printed, + '-'); unum = (unsigned int)-num; } else { unum = (unsigned int)num; @@ -210,13 +213,9 @@ loop: continue; } - if (chars_printed < n) { - *s = *fmt; - s++; - } + CHECK_AND_PUT_CHAR(s, n, chars_printed, *fmt); fmt++; - chars_printed++; } if (n > 0U) { |