Page 1 of 1

Add chvsnprintf(...) to streams library

Posted: Thu Aug 16, 2018 3:13 pm
by FXCoder
For convenience when printing to a char buffer with a va_list passed as a parameter...

Code: Select all

Index: chprintf.c
===================================================================
--- chprintf.c   (revision 12211)
+++ chprintf.c   (working copy)
@@ -339,6 +339,45 @@
  */
 int chsnprintf(char *str, size_t size, const char *fmt, ...) {
   va_list ap;
+  int retval;
+
+  /* Performing the print operation.*/
+  va_start(ap, fmt);
+  retval = chvsnprintf(str, size, fmt, ap);
+  va_end(ap);
+
+  /* Return number of bytes that would have been written.*/
+  return retval;
+}
+
+/**
+ * @brief   System formatted output function.
+ * @details This function implements a minimal @p vsnprintf()-like functionality.
+ *          The general parameters format is: %[-][width|*][.precision|*][l|L]p.
+ *          The following parameter types (p) are supported:
+ *          - <b>x</b> hexadecimal integer.
+ *          - <b>X</b> hexadecimal long.
+ *          - <b>o</b> octal integer.
+ *          - <b>O</b> octal long.
+ *          - <b>d</b> decimal signed integer.
+ *          - <b>D</b> decimal signed long.
+ *          - <b>u</b> decimal unsigned integer.
+ *          - <b>U</b> decimal unsigned long.
+ *          - <b>c</b> character.
+ *          - <b>s</b> string.
+ *          .
+ * @post    @p str is NUL-terminated, unless @p size is 0.
+ *
+ * @param[in] str       pointer to a buffer
+ * @param[in] size      maximum size of the buffer
+ * @param[in] ap        list of parameters
+ * @return              The number of characters (excluding the
+ *                      terminating NUL byte) that would have been
+ *                      stored in @p str if there was room.
+ *
+ * @api
+ */
+int chvsnprintf(char *str, size_t size, const char *fmt, va_list ap) {
   MemoryStream ms;
   BaseSequentialStream *chp;
   size_t size_wo_nul;
@@ -355,9 +394,7 @@
 
   /* Performing the print operation using the common code.*/
   chp = (BaseSequentialStream *)(void *)&ms;
-  va_start(ap, fmt);
   retval = chvprintf(chp, fmt, ap);
-  va_end(ap);
 
   /* Terminate with a zero, unless size==0.*/
   if (ms.eos < size)
Index: chprintf.h
===================================================================
--- chprintf.h   (revision 12211)
+++ chprintf.h   (working copy)
@@ -40,6 +40,7 @@
   int chvprintf(BaseSequentialStream *chp, const char *fmt, va_list ap);
   int chprintf(BaseSequentialStream *chp, const char *fmt, ...);
   int chsnprintf(char *str, size_t size, const char *fmt, ...);
+  int chvsnprintf(char *str, size_t size, const char *fmt, va_list ap);
 #ifdef __cplusplus
 }
 #endif

Re: Add chvsnprintf(...) to streams library

Posted: Sun Jan 06, 2019 10:14 am
by Giovanni
Merged thanks.

Giovanni