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
This commit is contained in:
commit
0b2b83ea93
|
@ -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
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -108,6 +108,9 @@ int vprintf(const char *fmt, va_list args)
|
||||||
/* Check the format specifier */
|
/* Check the format specifier */
|
||||||
loop:
|
loop:
|
||||||
switch (*fmt) {
|
switch (*fmt) {
|
||||||
|
case '%':
|
||||||
|
(void)putchar('%');
|
||||||
|
break;
|
||||||
case 'i': /* Fall through to next one */
|
case 'i': /* Fall through to next one */
|
||||||
case 'd':
|
case 'd':
|
||||||
num = get_num_va_args(args, l_count);
|
num = get_num_va_args(args, l_count);
|
||||||
|
|
|
@ -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
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -10,16 +10,20 @@
|
||||||
#include <common/debug.h>
|
#include <common/debug.h>
|
||||||
#include <plat/common/platform.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,
|
static void string_print(char **s, size_t n, size_t *chars_printed,
|
||||||
const char *str)
|
const char *str)
|
||||||
{
|
{
|
||||||
while (*str != '\0') {
|
while (*str != '\0') {
|
||||||
if (*chars_printed < n) {
|
CHECK_AND_PUT_CHAR(*s, n, *chars_printed, *str);
|
||||||
*(*s) = *str;
|
|
||||||
(*s)++;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*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. */
|
/* Check the format specifier. */
|
||||||
loop:
|
loop:
|
||||||
switch (*fmt) {
|
switch (*fmt) {
|
||||||
|
case '%':
|
||||||
|
CHECK_AND_PUT_CHAR(s, n, chars_printed, '%');
|
||||||
|
break;
|
||||||
case '0':
|
case '0':
|
||||||
case '1':
|
case '1':
|
||||||
case '2':
|
case '2':
|
||||||
|
@ -158,12 +165,8 @@ loop:
|
||||||
num = va_arg(args, int);
|
num = va_arg(args, int);
|
||||||
|
|
||||||
if (num < 0) {
|
if (num < 0) {
|
||||||
if (chars_printed < n) {
|
CHECK_AND_PUT_CHAR(s, n, chars_printed,
|
||||||
*s = '-';
|
'-');
|
||||||
s++;
|
|
||||||
}
|
|
||||||
chars_printed++;
|
|
||||||
|
|
||||||
unum = (unsigned int)-num;
|
unum = (unsigned int)-num;
|
||||||
} else {
|
} else {
|
||||||
unum = (unsigned int)num;
|
unum = (unsigned int)num;
|
||||||
|
@ -210,13 +213,9 @@ loop:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chars_printed < n) {
|
CHECK_AND_PUT_CHAR(s, n, chars_printed, *fmt);
|
||||||
*s = *fmt;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt++;
|
fmt++;
|
||||||
chars_printed++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n > 0U) {
|
if (n > 0U) {
|
||||||
|
|
Loading…
Reference in New Issue