1 /* vsnprintf( char *, size_t, const char *, va_list ap )
3 This file is part of the Public Domain C Library (PDCLib).
4 Permission is granted to use, modify, and / or redistribute at will.
12 #include <_PDCLIB_io.h>
14 /* returns true if callback-based output succeeded; else false */
15 static inline bool cbout(
16 struct _PDCLIB_status_t * status,
20 size_t rv = status->write( status->ctx, buf, size );
27 size_t ( *cb ) ( void *p, const char *buf, size_t size ),
31 struct _PDCLIB_status_t status;
41 va_copy( status.arg, arg );
43 /* Alternate between outputing runs of verbatim text and conversions */
44 while ( *format != '\0' )
46 const char *mark = format;
47 while ( *format != '\0' && *format != '%')
54 if ( !cbout(&status, mark, format - mark) )
58 if ( *format == '%' ) {
59 int consumed = _PDCLIB_print( format, &status );
64 else if ( consumed == 0 )
66 /* not a conversion specifier, print verbatim */
67 if ( !cbout(&status, format++, 1) )
72 /* I/O callback error */
85 #define _PDCLIB_FILEID "stdio/_vcbprintf.c"
86 #define _PDCLIB_STRINGIO
89 #include <_PDCLIB_test.h>
93 static size_t testcb( void *p, const char *buf, size_t size )
96 memcpy(*destbuf, buf, size);
101 static int testprintf( char * s, const char * format, ... )
105 va_start( arg, format );
106 i = _vcbprintf( &s, testcb, format, arg );
118 #include "printf_testcases.h"