int lib_rawvprintf(const char *fmt, va_list ap) { #if CONFIG_NFILE_DESCRIPTORS > 0 struct lib_rawoutstream_s rawoutstream; /* Wrap the stdout in a stream object and let lib_vsprintf * do the work. */ lib_rawoutstream(&rawoutstream, 1); return lib_vsprintf(&rawoutstream.public, fmt, ap); #elif defined(CONFIG_ARCH_LOWPUTC) struct lib_outstream_s stream; /* Wrap the low-level output in a stream object and let lib_vsprintf * do the work. */ lib_lowoutstream((FAR struct lib_outstream_s *)&stream); return lib_vsprintf((FAR struct lib_outstream_s *)&stream, fmt, ap); #else return 0; #endif }
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 lib_lowvprintf(const char *fmt, va_list ap) { struct lib_outstream_s stream; /* Wrap the stdout in a stream object and let lib_vsprintf * do the work. */ lib_lowoutstream((FAR struct lib_outstream_s *)&stream); return lib_vsprintf((FAR struct lib_outstream_s *)&stream, fmt, ap); }
int lib_sprintf(FAR struct lib_outstream_s *obj, const char *fmt, ...) { va_list ap; int n; /* Let lib_vsprintf do the real work */ va_start(ap, fmt); n = lib_vsprintf(obj, fmt, ap); va_end(ap); return n; }
static inline int lowvsyslog_internal(FAR const IPTR char *fmt, va_list ap) { struct lib_outstream_s stream; /* Wrap the stdout in a stream object and let lib_vsprintf do the work. */ #ifdef CONFIG_SYSLOG lib_syslogstream((FAR struct lib_outstream_s *)&stream); #else lib_lowoutstream((FAR struct lib_outstream_s *)&stream); #endif return lib_vsprintf((FAR struct lib_outstream_s *)&stream, fmt, ap); }
int _vsyslog(int priority, FAR const IPTR char *fmt, FAR va_list *ap) { struct lib_outstream_s stream; #ifdef CONFIG_SYSLOG_TIMESTAMP struct timespec ts; /* Get the current time. Since debug output may be generated very early * in the start-up sequence, hardware timer support may not yet be * available. */ if (!OSINIT_HW_READY() || clock_systimespec(&ts) < 0) { /* Timer hardware is not available, or clock_systimespec failed */ ts.tv_sec = 0; ts.tv_nsec = 0; } #endif /* Wrap the low-level output in a stream object and let lib_vsprintf * do the work. NOTE that emergency priority output is handled * differently.. it will use the SYSLOG emergency stream. */ if (priority == LOG_EMERG) { /* Use the SYSLOG emergency stream */ emergstream((FAR struct lib_outstream_s *)&stream); } else { /* Use the normal SYSLOG stream */ syslogstream((FAR struct lib_outstream_s *)&stream); } #if defined(CONFIG_SYSLOG_TIMESTAMP) /* Pre-pend the message with the current time, if available */ (void)lib_sprintf((FAR struct lib_outstream_s *)&stream, "[%6d.%06d]", ts.tv_sec, ts.tv_nsec/1000); #endif return lib_vsprintf((FAR struct lib_outstream_s *)&stream, fmt, *ap); }