From 8e07c1db6ba4bedd0f8fe537a6fb0ca80e5d25f4 Mon Sep 17 00:00:00 2001 From: Alex AUVOLAT Date: Sat, 19 May 2012 15:56:25 +0200 Subject: Better sprintf, vsprintf, String::sprintf, etc. --- src/user/lib/libc/std/stdio.c | 75 +++++++++---------------------------------- 1 file changed, 16 insertions(+), 59 deletions(-) (limited to 'src/user/lib/libc/std/stdio.c') diff --git a/src/user/lib/libc/std/stdio.c b/src/user/lib/libc/std/stdio.c index da2f094..23ec989 100644 --- a/src/user/lib/libc/std/stdio.c +++ b/src/user/lib/libc/std/stdio.c @@ -4,8 +4,8 @@ #include FILE term = 0; -void print(char *s) { fprint(term, s); } -void printf(char *format, ...) { +void print(const char *s) { fprint(term, s); } +void printf(const char *format, ...) { va_list ap; va_start(ap, format); vfprintf(term, format, ap); @@ -13,67 +13,24 @@ void printf(char *format, ...) { } char* readln() { return freadln(term); } -void fprintf(FILE f, char* format, ...) { +void fprint(FILE f, const char *s) { + write(f, 0, strlen(s), s); +} + +void fprintf(FILE f, const char* format, ...) { va_list ap; va_start(ap, format); vfprintf(f, format, ap); va_end(ap); } -// FUNCTIONS - -void fprint(FILE f, char *s) { - write(f, 0, strlen(s), s); -} - -void fprint_int(FILE f, int number) { - char s[32]; - char *v = format_int(s, number); - *v = 0; - fprint(f, s); -} - -void fprint_hex(FILE f, unsigned v) { - char s[11]; - char *e = format_hex(s, v); - *e = 0; - fprint(f, s); -} - -void vfprintf(FILE f, char *format, va_list ap) { - char bb[256]; - int bufl = 256; - - char *buf = bb; - char *end = buf; - - while (*format) { - if (*format == '%') { - // ASSUMPTION : (TODO) WE HAVE ENOUGH SPACE - NOT THE CASE!!! - 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') { - char *s = va_arg(ap, char*); - strcpy(end, s); - end += strlen(s); - } - format++; - } else { - *(end++) = *(format++); - } - if (end - buf > bufl - 2) { - bufl *= 2; - char *nbuf = (char*)malloc(bufl); - memcpy(nbuf, buf, end - buf); - end = nbuf + (end - buf); - if (buf != bb) free(buf); - buf = nbuf; - } - } - *end = 0; - fprint(f, buf); - if (buf != bb) free(buf); +void vfprintf(FILE f, const char *fmt, va_list ap) { + va_list ap2; + va_copy(ap2, ap); + int l = printf_str_len(fmt, ap2); + va_end(ap2); + char* buf = (char*) malloc(l+1); + l = vsprintf(buf, fmt, ap); + if (l > 0) write(f, 0, l, buf); + free(buf); } -- cgit v1.2.3