diff --git a/include/lib/libc/stdio.h b/include/lib/libc/stdio.h index 2d9e655..ba13683 100644 --- a/include/lib/libc/stdio.h +++ b/include/lib/libc/stdio.h @@ -22,6 +22,7 @@ #ifdef STDARG_H int vprintf(const char *fmt, va_list args); +int vsnprintf(char *s, size_t n, const char *fmt, va_list args); #endif int putchar(int c); diff --git a/lib/libc/snprintf.c b/lib/libc/snprintf.c index 2686327..6e80d8c 100644 --- a/lib/libc/snprintf.c +++ b/lib/libc/snprintf.c @@ -77,7 +77,7 @@ } /******************************************************************* - * Reduced snprintf to be used for Trusted firmware. + * Reduced vsnprintf to be used for Trusted firmware. * The following type specifiers are supported: * * %x (or %X) - hexadecimal format @@ -97,9 +97,8 @@ * buffer was big enough. If it returns a value lower than n, the * whole string has been written. *******************************************************************/ -int snprintf(char *s, size_t n, const char *fmt, ...) +int vsnprintf(char *s, size_t n, const char *fmt, va_list args) { - va_list args; int num; unsigned long long int unum; char *str; @@ -120,7 +119,6 @@ n--; } - va_start(args, fmt); while (*fmt != '\0') { left = false; padc ='\0'; @@ -221,10 +219,42 @@ chars_printed++; } - va_end(args); - - if (n > 0U) + if (n > 0U) { *s = '\0'; + } return (int)chars_printed; } + +/******************************************************************* + * Reduced snprintf to be used for Trusted firmware. + * The following type specifiers are supported: + * + * %x (or %X) - hexadecimal format + * %d or %i - signed decimal format + * %s - string format + * %u - unsigned decimal format + * %p - pointer format + * + * The following padding specifiers are supported by this print + * %0NN - Left-pad the number with 0s (NN is a decimal number) + * %NN - Left-pad the number or string with spaces (NN is a decimal number) + * %-NN - Right-pad the number or string with spaces (NN is a decimal number) + * + * 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 snprintf(char *s, size_t n, const char *fmt, ...) +{ + int count; + va_list all_args; + + va_start(all_args, fmt); + count = vsnprintf(s, n, fmt, all_args); + va_end(all_args); + + return count; +}