diff options
Diffstat (limited to 'src/user/lib/libc/std/string.c')
-rw-r--r-- | src/user/lib/libc/std/string.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/user/lib/libc/std/string.c b/src/user/lib/libc/std/string.c index d8e4a48..619b8c6 100644 --- a/src/user/lib/libc/std/string.c +++ b/src/user/lib/libc/std/string.c @@ -119,3 +119,57 @@ char* format_hex(char *buf, unsigned v) { } return buf; } + +int printf_str_len(const char *format, va_list ap) { + int l = 0; + while (*format) { + if (*format == '%') { + format++; + if (*format == 'd' || *format == 'i') { + l += 15; + va_arg(ap, int); + } else if (*format == 'p') { + l += 11; + va_arg(ap, void*); + } else if (*format == 's') { + l += strlen(va_arg(ap, const char*)); + } + } else { + l++; + } + format++; + } + return l; +} + +int sprintf(char *buf, const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + int ret = vsprintf(buf, fmt, ap); + va_end(ap); + return ret; +} + +int vsprintf(char *buf, const char *format, va_list ap) { + char *end = buf; + + while (*format) { + if (*format == '%') { + format++; + if (*format == 'd' || *format == 'i') { + end = format_int(end, va_arg(ap, int)); + } else if (*format == 'p') { + end = format_hex(end, va_arg(ap, uint32_t)); + } else if (*format == 's') { + const char *s = va_arg(ap, const char*); + strcpy(end, s); + end += strlen(s); + } + format++; + } else { + *(end++) = *(format++); + } + } + *end = 0; + return end - buf; +} |