On Tue, Mar 04, 2025 at 08:59:23AM +0100, Willy Tarreau wrote: > 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. Ack. Technically it should be fine as names with leading underscores are reserved for the implementation, but let's make it clearer. > > +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. Ack. > > +static int _fprintf_cb(intptr_t state, const char *buf, size_t size) > > Likewise here I think. Ack, also to the same remarks in the other patches.