added gnutls backend and moved backend code into new files
[ircu2.10.12-pk.git] / include / ircd_snprintf.h
index 28bcc5cce4eb5c5e262cc63af80e5ceeca0eb6ac..23fa826b45b71bf04b84996e4032967ccede1bd1 100644 (file)
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id$
  */
-#ifndef INCLUDED_config_h
-#include "config.h"
-#endif
+/** @file
+ * @brief IRC-specific printf() clone interface.
+ * @version $Id$
+ */
 #ifndef INCLUDED_sys_types_h
 #include <sys/types.h>
 #define INCLUDED_sys_types_h
 
 struct Client;
 
-/* structure passed as argument for %v conversion */
+/** structure passed as argument for %v conversion */
 struct VarData {
-  size_t       vd_chars;       /* number of characters inserted */
-  size_t       vd_overflow;    /* number of characters that couldn't be */
-  const char   *vd_format;     /* format string */
-  va_list      vd_args;        /* arguments for %v */
+  size_t       vd_chars;       /**< number of characters inserted */
+  size_t       vd_overflow;    /**< number of characters that couldn't be */
+  const char   *vd_format;     /**< format string */
+  va_list      vd_args;        /**< arguments for %v */
 };
 
+#ifndef HAVE_VA_COPY
+#if HAVE___VA_COPY
+#define va_copy(DEST, SRC) __va_copy(DEST, SRC)
+#else
+/** Fallback macro to copy to \a DEST from \a SRC. */
+#define va_copy(DEST, SRC) memcpy(&(DEST), &(SRC), sizeof(DEST))
+#endif
+#endif
+
 extern int ircd_snprintf(struct Client *dest, char *buf, size_t buf_len,
                         const char *format, ...);
 extern int ircd_vsnprintf(struct Client *dest, char *buf, size_t buf_len,
                          const char *format, va_list args);
 
-/*
-** ircd_(v)snprintf
+/** @fn int ircd_snprintf(struct Client *dest, char *buf, size_t
+                        buf_len, const char *format, ...)
 **
 **   These functions are intended to be a complete replacement for
 ** sprintf and sprintf_irc.  They are a (nearly) complete
@@ -78,7 +86,7 @@ extern int ircd_vsnprintf(struct Client *dest, char *buf, size_t buf_len,
 ** instance; %qu and %hhu are also supported.  The extensions added
 ** for use in ircu are %Tu, which takes a time_t, and the new %C
 ** conversion, which inserts either a numeric or a nick, dependant on
-** the <dest> parameter.  The GNU %m extension, which inserts the
+** the &lt;dest> parameter.  The GNU %m extension, which inserts the
 ** strerror() string corresponding to the current value of errno, is
 ** also supported, as is a special %v extension, which essentially
 ** does a recursive call to ircd_snprintf.
@@ -94,9 +102,10 @@ extern int ircd_vsnprintf(struct Client *dest, char *buf, size_t buf_len,
 ** correspond properly (after type promotion) with the conversion
 ** specifier.  After the %, the following appear in sequence:
 **
-** * Zero or more of the following flags:
+** <ul><li>Zero or more of the following flags:<dl>
 **
-**   # specifying that the value should be converted to an
+** <dt>#</dt>
+**      <dd>specifying that the value should be converted to an
 **     "alternate form."  For c, d, i, n, p, s, and u conversions,
 **     this option has no effect.  For o conversions, the precision
 **     of the number is increased to force the first character of the
@@ -108,74 +117,86 @@ extern int ircd_vsnprintf(struct Client *dest, char *buf, size_t buf_len,
 **     (normally, a decimal point appears in the results of those
 **     conversions only if a digit follows).  For g and G
 **     conversions, trailing zeros are not removed from the result as
-**     they would otherwise be.
+**     they would otherwise be.  For C conversions, if the
+**     destination is local and the origin is a user, the
+**     nick!user\@host form is used.</dd>
 **
-**   0 specifying zero padding.  For all conversions except n, the
+** <dt>0</dt>
+**      <dd> specifying zero padding.  For all conversions except n, the
 **     converted value is padded on the left with zeros rather than
 **     blanks.  If a precision is given with a numeric conversion (d,
-**     i, o, u, i, x, and X), the 0 flag is ignored.
+**     i, o, u, i, x, and X), the 0 flag is ignored.</dd>
 **
-**   - (a negative field width flag) indicates the converted value is
+** <dt>-</dt>
+**      <dd>(a negative field width flag) indicates the converted value is
 **     to be left adjusted on the field boundary.  Except for n
 **     conversions, the converted value is padded on the right with
 **     blanks, rather than on the left with blanks or zeros.  A -
-**     overrides a 0 if both are given.
+**     overrides a 0 if both are given.</dd>
 **
-**  ' '        (a space) specifying that a blank should be left before a
+** <dt>' ' (a space)</dt>
+**      <dd>specifying that a blank should be left before a
 **     positive number produced by a signed conversion (d, e, E, f,
-**     g, G, or i).
+**     g, G, or i).</dd>
 **
-**   + specifying that a sign always be placed before a number
+** <dt>+</dt>
+**      <dd>specifying that a sign always be placed before a number
 **     produced by a signed conversion.  A + overrides a space if
-**     both are used.
+**     both are used.</dd>
+**
+** <dt>:</dt>
+**      <dd>specifying that a struct Client name should be preceded by a
+**     ':' character if the destination is a user.</dd>
+** </dl></li>
 **
-** An optional decimal digit string specifying a minimum field
+** <li>An optional decimal digit string specifying a minimum field
 **   width.  If the converted value has fewer characters than the
 **   field width, it will be padded with spaces on the left (or right,
 **   if the left-adjustment flag has been given) to fill out the field
-**   width.
+**   width.</li>
 **
-** An optional precision, in the form of a period (`.') followed by
+** <li>An optional precision, in the form of a period (`.') followed by
 **   an optional digit string.  If  the digit string is omitted, the
 **   precision is taken as zero.  This gives the minimum number of
 **   digits to appear for d, i, o, u, x, and X conversions, the number
 **   of digits to appear after the decimal-point for e, E, and f
 **   conversions, the maximum number of significant digits for g and G
 **   conversions, or the maximum number of characters to be printed
-**   from a string for s conversions.
+**   from a string for s conversions.</li>
 **
-** The optional character h, specifying that a following d, i, o, u,
+** <li>The optional character h, specifying that a following d, i, o, u,
 **   x, or X conversion corresponds to a short int or unsigned short
 **   int argument, or that a following n conversion corresponds to a
 **   pointer to a short int argument.  If the h character is given
-**   again, char is used instead of short int.
+**   again, char is used instead of short int.</li>
 **
-** The optional character l (ell) specifying that a following d, i,
+** <li>The optional character l (ell) specifying that a following d, i,
 **   o, u, x, or X conversion applies to a pointer to a long int or
 **   unsigned long int argument, or that a following n conversion
-**   corresponds to a pointer to a long int argument.
+**   corresponds to a pointer to a long int argument.</li>
 **
-** The character L specifying that a following e, E, f, g, or G
+** <li>The character L specifying that a following e, E, f, g, or G
 **   conversion corresponds to a long double argument, or a following
 **   d, i, o, u, x, or X conversion corresponds to a long long
 **   argument.  Note that long long is not specified in ANSI C and
-**   therefore not portable to all architectures.
+**   therefore not portable to all architectures.</li>
 **
-** * The optional character q.  This is equivalent to L.
+** <li>The optional character q.  This is equivalent to L.</li>
 **
-** A j character specifying that the following integer (d, i, o, u,
-**   x, or X) conversion corresponds to an intmax_t argument.
+** <li>A j character specifying that the following integer (d, i, o, u,
+**   x, or X) conversion corresponds to an intmax_t argument.</li>
 **
-** A t character specifying that the following integer (d, i, o, u,
-**   x, or X) conversion corresponds to a ptrdiff_t argument.
+** <li>A t character specifying that the following integer (d, i, o, u,
+**   x, or X) conversion corresponds to a ptrdiff_t argument.</li>
 **
-** A z character specifying that the following integer (d, i, o, u,
-**   x, or X) conversion corresponds to a size_t argument.
+** <li>A z character specifying that the following integer (d, i, o, u,
+**   x, or X) conversion corresponds to a size_t argument.</li>
 **
-** A T character specifying that the following integer (d, i, o, u,
-**   x, or X) conversion corresponds to a time_t argument.
+** <li>A T character specifying that the following integer (d, i, o, u,
+**   x, or X) conversion corresponds to a time_t argument.</li>
 **
-** * A character that specifies the type of conversion to be applied.
+** <li>A character that specifies the type of conversion to be applied.</li>
+** </ul>
 **
 **   A field width or precision, or both, may be indicated by an
 ** asterisk `*' instead of a digit string.  In this case, an int
@@ -186,7 +207,9 @@ extern int ircd_vsnprintf(struct Client *dest, char *buf, size_t buf_len,
 **
 ** The conversion specifiers and their meanings are:
 **
-** diouxX      The int (or appropriate variant) argument is converted
+** <dl>
+** <dt>diouxX</dt>
+**             <dd>The int (or appropriate variant) argument is converted
 **             to signed decimal (d and i), unsigned octal (o),
 **             unsigned decimal (u), or unsigned hexadecimal (x and
 **             X) notation.  The letters abcdef are used for x
@@ -194,9 +217,10 @@ extern int ircd_vsnprintf(struct Client *dest, char *buf, size_t buf_len,
 **             conversions.  The precision, if any, gives the minimum
 **             number of digits that must appear; if the converted
 **             value requires fewer digits, it is padded on the left
-**             with zeros.
+**             with zeros.</dd>
 **
-** eE          [NOT IMPLEMENTED] The double argument is rounded and
+** <dt>eE [NOT IMPLEMENTED]</dt>
+**             <dd>The double argument is rounded and
 **             converted in the style [-]d.dddedd where there is one
 **             digit before the decimal-point character and the
 **             number of digits after it is equal to the precision;
@@ -205,18 +229,20 @@ extern int ircd_vsnprintf(struct Client *dest, char *buf, size_t buf_len,
 **             An E conversion uses the letter E (rather than e) to
 **             introduce the exponent.  The exponent always contains
 **             at least two digits; if the value is zero, the
-**             exponent is 00.
+**             exponent is 00.</dd>
 **
-** f           [NOT IMPLEMENTED] The double argument is rounded and
+** <dt>f [NOT IMPLEMENTED]</dt>
+**             <dd>The double argument is rounded and
 **             converted to  decimal notation in the style
 **             [-]ddd.ddd, where the number of digits after the
 **             decimal-point character is equal to the precision
 **             specification.  If the precision is missing, it is
 **             taken as 6; if the precision is explicitly zero, no
 **             decimal-point character appears.  If a decimal point
-**             appears, at least one digit appears before it.
+**             appears, at least one digit appears before it.</dd>
 **
-** g           [NOT IMPLEMENTED] The double argument is converted in
+** <dt>g [NOT IMPLEMENTED]</dt>
+**             <dd>The double argument is converted in
 **             style f or e (or E for G conversions).  The precision
 **             specifies the number of significant digits.  If the
 **             precision is missing, 6 digits are given; if the
@@ -225,12 +251,14 @@ extern int ircd_vsnprintf(struct Client *dest, char *buf, size_t buf_len,
 **             -4 or greater than or equal to the precision.
 **             Trailing zeros are removed from the fractional part of
 **             the result; a decimal point appears only if it is
-**             followed by at least one digit.
+**             followed by at least one digit.</dd>
 **
-** c           The int argument is converted to an unsigned char, and
-**             the resulting character is written.
+** <dt>c</dt>
+**             <dd>The int argument is converted to an unsigned char, and
+**             the resulting character is written.</dd>
 **
-** s           The "char *" argument is expected to be a pointer to
+** <dt>s</dt>
+**             <dd>The "char *" argument is expected to be a pointer to
 **             an array of character type (pointer to a string).
 **             Characters from the array are written up to (but not
 **             including) a terminating NUL character; if a precision
@@ -238,39 +266,56 @@ extern int ircd_vsnprintf(struct Client *dest, char *buf, size_t buf_len,
 **             written.  If a precision is given, no null character
 **             need be present; if the precision is not specified, or
 **             is greater than the size of the array, the array must
-**             contain a terminating NUL character.
+**             contain a terminating NUL character.</dd>
 **
-** p           The "void *" pointer argument is printed in
-**             hexadecimal (as if by %#x or %#lx).
+** <dt>p</dt>
+**             <dd>The "void *" pointer argument is printed in
+**             hexadecimal (as if by %#x or %#lx).</dd>
 **
-** n           The number of characters written so far is stored into
+** <dt>n</dt>
+**             <dd>The number of characters written so far is stored into
 **             the integer indicated by the ``int *'' (or variant)
-**             pointer argument.  No argument is converted.
+**             pointer argument.  No argument is converted.</dd>
 **
-** m           The error message associated with the current value of
-**             errno is printed as if by %s.
+** <dt>m</dt>
+**             <dd>The error message associated with the current value of
+**             errno is printed as if by %s.</dd>
 **
-** C           The client argument identifier is printed under the
-**             control of the <dest> argument; if <dest> is NULL or
+** <dt>C</dt>
+**             <dd>The client argument identifier is printed under the
+**             control of the &lt;dest> argument; if &lt;dest> is NULL or
 **             is a user, the client's name (nickname or server name)
 **             is printed; otherwise, the client's network numeric is
-**             printed.
+**             printed.</dd>
 **
-** v           The argument given must be a pointer to a struct
+** <dt>H</dt>
+**             <dd>The channel argument identifier (channel name) is
+**             printed.</dd>
+**
+** <dt>v</dt>
+**             <dd>The argument given must be a pointer to a struct
 **             VarData with vd_format and vd_args must be initialized
 **             appropriately.  On return, vd_chars will contain the
 **             number of characters added to the buffer, and
 **             vd_overflow will contain the number of characters that
 **             could not be added due to buffer overflow or due to a
-**             precision.
+**             precision.</dd>
 **
-** %           A `%' is written.  No argument is converted.  The
-**             complete conversion specification is `%%'.
+** <dt>%<dt>
+**             <dd>A `%' is written.  No argument is converted.  The
+**             complete conversion specification is `%%'.</dd>
+** </dl>
 **
 **   In no case does a non-existent or small field width cause
 ** truncation of a field; if the result of a conversion is wider than
 ** the field width, the field is expanded to contain the conversion
 ** result.
+**
+** @param[in] dest Client receiving of message.
+** @param[out] buf Output buffer for formatted message.
+** @param[in] buf_len Number of bytes that can be written to \a buf.
+** @param[in] format Format string for message.
+** @return Number of bytes that would be written to \a buf without truncation.
 */
 
 #endif /* INCLUDED_ircd_snprintf_h */