int asprintf (FAR char **ptr, const char *fmt, ...) { struct lib_outstream_s nulloutstream; struct lib_memoutstream_s memoutstream; FAR char *buf; va_list ap; int nbytes; DEBUGASSERT(ptr && fmt); /* First, use a nullstream to get the size of the buffer. The number * of bytes returned may or may not include the null terminator. */ lib_nulloutstream(&nulloutstream); va_start(ap, fmt); nbytes = lib_vsprintf((FAR struct lib_outstream_s *)&nulloutstream, fmt, ap); va_end(ap); /* Then allocate a buffer to hold that number of characters, adding one * for the null terminator. */ buf = (FAR char *)malloc(nulloutstream.nput + 1); if (!buf) { return ERROR; } /* Initialize a memory stream to write into the allocated buffer. The * memory stream will reserve one byte at the end of the buffer for the * null terminator and will not report this in the number of output bytes. */ lib_memoutstream((FAR struct lib_memoutstream_s *)&memoutstream, buf, nulloutstream.nput + 1); /* Then let lib_vsprintf do it's real thing */ va_start(ap, fmt); nbytes = lib_vsprintf((FAR struct lib_outstream_s *)&memoutstream.public, fmt, ap); va_end(ap); /* Return a pointer to the string to the caller. NOTE: the memstream put() * method has already added the NUL terminator to the end of the string (not * included in the nput count). * * Hmmm.. looks like the memory would be stranded if lib_vsprintf() returned * an error. Does that ever happen? */ DEBUGASSERT(nbytes < 0 || nbytes == nulloutstream.nput); *ptr = buf; return nbytes; }
int vsprintf(FAR char *dest, FAR const IPTR char *src, va_list ap) { struct lib_memoutstream_s memoutstream; /* Wrap the destination buffer in a stream object and let * libc/stdio/lib_vsprintf do the work. */ lib_memoutstream((FAR struct lib_memoutstream_s *)&memoutstream, dest, LIB_BUFLEN_UNKNOWN); return lib_vsprintf((FAR struct lib_outstream_s *)&memoutstream.public, src, ap); }
int vsnprintf(FAR char *buf, size_t size, const char *format, va_list ap) { struct lib_memoutstream_s memoutstream; int n; /* Initialize a memory stream to write to the buffer */ lib_memoutstream((FAR struct lib_memoutstream_s *)&memoutstream, buf, size); /* Then let lib_vsprintf do the real work */ n = lib_vsprintf((FAR struct lib_outstream_s *)&memoutstream.public, format, ap); return n; }
int sprintf (FAR char *buf, const char *fmt, ...) { struct lib_memoutstream_s memoutstream; va_list ap; int n; /* Initialize a memory stream to write to the buffer */ lib_memoutstream((FAR struct lib_memoutstream_s *)&memoutstream, buf, LIB_BUFLEN_UNKNOWN); /* Then let lib_vsprintf do the real work */ va_start(ap, fmt); n = lib_vsprintf((FAR struct lib_outstream_s *)&memoutstream.public, fmt, ap); va_end(ap); return n; }