diff --git a/mlibc/include/stdarg.h b/mlibc/include/stdarg.h index 9ffcdf59..fa5a6332 100644 --- a/mlibc/include/stdarg.h +++ b/mlibc/include/stdarg.h @@ -43,6 +43,7 @@ typedef int va_list; #define va_copy(dest, src) dest = src int vprintf (char const* format, va_list ap); +int vsprintf (char *str, char const *format, va_list ap); int vsnprintf (char *str, size_t size, char const *format, va_list ap); #endif // ! (__GNUC__ && POSIX) diff --git a/mlibc/libc-gcc.c b/mlibc/libc-gcc.c index 22fd2d8d..2a636e8a 100644 --- a/mlibc/libc-gcc.c +++ b/mlibc/libc-gcc.c @@ -389,10 +389,8 @@ printf (char const* format, ...) } int -sprintf (char *str, char const* format, ...) +vsprintf (char *str, char const* format, va_list ap) { - va_list ap; - va_start (ap, format); char const *p = format; while (*p) if (*p != '%') @@ -411,8 +409,19 @@ sprintf (char *str, char const* format, ...) } p++; } + + *str = 0; + return strlen (str); +} + +int +sprintf (char *str, char const* format, ...) +{ + va_list ap; + va_start (ap, format); + int r = vsprintf (str, format, ap); va_end (ap); - return 0; + return r; } #endif diff --git a/mlibc/libc-mes+tcc.c b/mlibc/libc-mes+tcc.c index 275aed2d..23d7da59 100644 --- a/mlibc/libc-mes+tcc.c +++ b/mlibc/libc-mes+tcc.c @@ -248,8 +248,11 @@ sigemptyset (sigset_t *set) int snprintf(char *str, size_t size, char const *format, ...) { - eputs ("snprintf stub\n"); - return 0; + va_list ap; + va_start (ap, format); + int r = vsprintf (str, format, ap); + va_end (ap); + return r; } int @@ -337,27 +340,7 @@ time_t time (time_t *tloc) int vsnprintf (char *str, size_t size, char const *format, va_list ap) { - char const *p = format; - while (*p) - if (*p != '%') - *str++ = *p++; - else - { - p++; - char c = *p; - switch (c) - { - case '%': {*str++ = *p; break;} - case 'c': {char c; c = va_arg (ap, char); *str++=c; break;} - case 'd': {int d; d = va_arg (ap, int); strcpy (str, itoa (d)); break;} - case 's': {char *s; s = va_arg (ap, char *); strcpy (str, s); break;} - default: {*str++ = *p; break;} - } - p++; - } - va_end (ap); - *str = 0; - return strlen (str); + return vsprintf (str, format, ap); } void * diff --git a/mlibc/libc-mes.c b/mlibc/libc-mes.c index 154d1f4b..eee37500 100644 --- a/mlibc/libc-mes.c +++ b/mlibc/libc-mes.c @@ -416,10 +416,8 @@ printf (char const* format, ...) } int -sprintf (char *str, char const* format, ...) +vsprintf (char *str, char const* format, va_list ap) { - va_list ap; - va_start (ap, format); char const *p = format; while (*p) if (*p != '%') @@ -439,5 +437,16 @@ sprintf (char *str, char const* format, ...) p++; } va_end (ap); - return 0; + *str = 0; + return strlen (str); +} + +int +sprintf (char *str, char const* format, ...) +{ + va_list ap; + va_start (ap, format); + int r = vsprintf (str, format, ap); + va_end (ap); + return r; }