diff --git a/os/various/chprintf.c b/os/various/chprintf.c index 787b6c7ab..ffb6650f8 100644 --- a/os/various/chprintf.c +++ b/os/various/chprintf.c @@ -13,8 +13,10 @@ See the License for the specific language governing permissions and limitations under the License. */ + /* - Concepts and parts of this file have been contributed by Fabio Utzig. + Concepts and parts of this file have been contributed by Fabio Utzig, + chvprintf() added by Brent Roman. */ /** @@ -25,8 +27,6 @@ * @{ */ -#include - #include "ch.h" #include "chprintf.h" @@ -86,7 +86,7 @@ static char *ftoa(char *p, double num) { /** * @brief System formatted output function. - * @details This function implements a minimal @p printf() like functionality + * @details This function implements a minimal @p vprintf()-like functionality * with output on a @p BaseSequentialStream. * The general parameters format is: %[-][width|*][.precision|*][l|L]p. * The following parameter types (p) are supported: @@ -104,9 +104,11 @@ static char *ftoa(char *p, double num) { * * @param[in] chp pointer to a @p BaseSequentialStream implementing object * @param[in] fmt formatting string + * @param[in] ap list of parameters + * + * @api */ -void chprintf(BaseSequentialStream *chp, const char *fmt, ...) { - va_list ap; +void chvprintf(BaseSequentialStream *chp, const char *fmt, va_list ap) { char *p, *s, c, filler; int i, precision, width; bool is_long, left_align; @@ -118,13 +120,10 @@ void chprintf(BaseSequentialStream *chp, const char *fmt, ...) { char tmpbuf[MAX_FILLER + 1]; #endif - va_start(ap, fmt); while (TRUE) { c = *fmt++; - if (c == 0) { - va_end(ap); + if (c == 0) return; - } if (c != '%') { chSequentialStreamPut(chp, (uint8_t)c); continue; diff --git a/os/various/chprintf.h b/os/various/chprintf.h index 1d758f680..306adc988 100644 --- a/os/various/chprintf.h +++ b/os/various/chprintf.h @@ -25,6 +25,8 @@ #ifndef _CHPRINTF_H_ #define _CHPRINTF_H_ +#include + /** * @brief Float type support. */ @@ -35,11 +37,42 @@ #ifdef __cplusplus extern "C" { #endif - void chprintf(BaseSequentialStream *chp, const char *fmt, ...); + void chvprintf(BaseSequentialStream *chp, const char *fmt, va_list ap); #ifdef __cplusplus } #endif +/** + * @brief System formatted output function. + * @details This function implements a minimal @p printf() like functionality + * with output on a @p BaseSequentialStream. + * The general parameters format is: %[-][width|*][.precision|*][l|L]p. + * The following parameter types (p) are supported: + * - x hexadecimal integer. + * - X hexadecimal long. + * - o octal integer. + * - O octal long. + * - d decimal signed integer. + * - D decimal signed long. + * - u decimal unsigned integer. + * - U decimal unsigned long. + * - c character. + * - s string. + * . + * + * @param[in] chp pointer to a @p BaseSequentialStream implementing object + * @param[in] fmt formatting string + * + * @api + */ +static inline void chprintf(BaseSequentialStream *chp, const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + chvprintf(chp, fmt, ap); + va_end(ap); +} + #endif /* _CHPRINTF_H_ */ /** @} */