summaryrefslogtreecommitdiffstatshomepage
path: root/stm/printf.c
diff options
context:
space:
mode:
Diffstat (limited to 'stm/printf.c')
-rw-r--r--stm/printf.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/stm/printf.c b/stm/printf.c
index d3f5a4d35c..8a59f8a986 100644
--- a/stm/printf.c
+++ b/stm/printf.c
@@ -232,9 +232,15 @@ void stdout_print_strn(void *data, const char *str, unsigned int len) {
static const pfenv_t pfenv_stdout = {0, stdout_print_strn};
int printf(const char *fmt, ...) {
- va_list args;
- va_start(args, fmt);
- return pfenv_printf(&pfenv_stdout, fmt, args);
+ va_list ap;
+ va_start(ap, fmt);
+ int ret = pfenv_printf(&pfenv_stdout, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+int vprintf(const char *fmt, va_list ap) {
+ return pfenv_printf(&pfenv_stdout, fmt, ap);
}
// need this because gcc optimises printf("%c", c) -> putchar(c), and printf("a") -> putchar('a')
@@ -267,16 +273,14 @@ void strn_print_strn(void *data, const char *str, unsigned int len) {
strn_pfenv->remain -= len;
}
-int snprintf(char *str, size_t size, const char *fmt, ...) {
+int vsnprintf(char *str, size_t size, const char *fmt, va_list ap) {
strn_pfenv_t strn_pfenv;
strn_pfenv.cur = str;
strn_pfenv.remain = size;
pfenv_t pfenv;
pfenv.data = &strn_pfenv;
pfenv.print_strn = strn_print_strn;
- va_list args;
- va_start(args, fmt);
- int len = pfenv_printf(&pfenv, fmt, args);
+ int len = pfenv_printf(&pfenv, fmt, ap);
// add terminating null byte
if (size > 0) {
if (strn_pfenv.remain == 0) {
@@ -287,3 +291,11 @@ int snprintf(char *str, size_t size, const char *fmt, ...) {
}
return len;
}
+
+int snprintf(char *str, size_t size, const char *fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ int ret = vsnprintf(str, size, fmt, ap);
+ va_end(ap);
+ return ret;
+}