On Tue, Mar 04, 2025 at 08:10:55AM +0100, Thomas Weißschuh wrote: > Decouple the formatting logic from the writing logic to later enable > writing straight to a buffer in sprintf(). > > Signed-off-by: Thomas Weißschuh <thomas.weissschuh@xxxxxxxxxxxxx> > --- > tools/include/nolibc/stdio.h | 21 +++++++++++++++++---- > 1 file changed, 17 insertions(+), 4 deletions(-) > > diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h > index 262d0da4da9062e0c83b55661b2509f36548cf88..434fbaddae7a216159fecf618da85889d631dff7 100644 > --- a/tools/include/nolibc/stdio.h > +++ b/tools/include/nolibc/stdio.h > @@ -208,13 +208,15 @@ char *fgets(char *s, int size, FILE *stream) > } > > > -/* minimal vfprintf(). It supports the following formats: > +/* minimal printf(). It supports the following formats: > * - %[l*]{d,u,c,x,p} > * - %s > * - unknown modifiers are ignored. > */ > -static __attribute__((unused, format(printf, 2, 0))) > -int vfprintf(FILE *stream, const char *fmt, va_list args) > +typedef int (*_printf_cb)(intptr_t state, const char *buf, size_t size); Keep in mind these ones will appear in the application, so you'd rather appropriate the type name by prefixing it with "nolibc" as we've done in a few macros and internal structs. > +static __attribute__((unused, format(printf, 3, 0))) > +int _printf(_printf_cb cb, intptr_t state, const char *fmt, va_list args) ^^^^^^^ Here as well, since it's not meant to be exposed to the application. > +static int _fprintf_cb(intptr_t state, const char *buf, size_t size) Likewise here I think. Willy