diff options
Diffstat (limited to 'purgatory/printf.c')
-rw-r--r-- | purgatory/printf.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/purgatory/printf.c b/purgatory/printf.c index 962683d..9a78243 100644 --- a/purgatory/printf.c +++ b/purgatory/printf.c @@ -33,19 +33,23 @@ PRINTF and friends %s - string Note: width specification not supported **************************************************************************/ -void printf(const char *fmt, ...) +void vsprintf(char *buffer, const char *fmt, va_list args) { - va_list args; char *p; - va_start(args, fmt); for ( ; *fmt != '\0'; ++fmt) { if (*fmt != '%') { - putchar(*fmt); + if (buffer) + *buffer++ = *fmt; + else + putchar(*fmt); continue; } if (*++fmt == 's') { for(p = va_arg(args, char *); *p != '\0'; p++) - putchar(*p); + if (buffer) + *buffer++ = *p; + else + putchar(*p); } else { /* Length of item is bounded */ char tmp[40], *q = tmp; @@ -121,8 +125,30 @@ void printf(const char *fmt, ...) *q++ = *fmt; /* now output the saved string */ for (p = tmp; p < q; ++p) - putchar(*p); + if (buffer) + *buffer++ = *p; + else + putchar(*p); } } + if (buffer) + *buffer = '\0'; +} + +void sprintf(char *buffer, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + vsprintf(buffer, fmt, args); + va_end(args); +} + +void printf(const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + vsprintf(0, fmt, args); va_end(args); } |