From cf757b1f8db42b78d19bc4466d8bdf53cd52b3e1 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Tue, 28 Sep 2004 01:14:19 +0000 Subject: [PATCH] Doxyfy ircd_snprintf.h and ircd_snprintf.c. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1184 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- include/ircd_snprintf.h | 166 +++++++++++++++++------------- ircd/ircd_snprintf.c | 220 ++++++++++++++++++++++++---------------- 2 files changed, 229 insertions(+), 157 deletions(-) diff --git a/include/ircd_snprintf.h b/include/ircd_snprintf.h index 520c0cc..d4d0ccf 100644 --- a/include/ircd_snprintf.h +++ b/include/ircd_snprintf.h @@ -31,18 +31,19 @@ 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 @@ -52,8 +53,8 @@ extern int ircd_snprintf(struct Client *dest, char *buf, size_t buf_len, 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 @@ -83,7 +84,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 parameter. The GNU %m extension, which inserts the +** the <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. @@ -99,9 +100,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: +** ** ** A field width or precision, or both, may be indicated by an ** asterisk `*' instead of a digit string. In this case, an int @@ -196,7 +205,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 +**
+**
diouxX
+**
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 @@ -204,9 +215,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.
** -** eE [NOT IMPLEMENTED] The double argument is rounded and +**
eE [NOT IMPLEMENTED]
+**
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; @@ -215,18 +227,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.
** -** f [NOT IMPLEMENTED] The double argument is rounded and +**
f [NOT IMPLEMENTED]
+**
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.
** -** g [NOT IMPLEMENTED] The double argument is converted in +**
g [NOT IMPLEMENTED]
+**
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 @@ -235,12 +249,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.
** -** c The int argument is converted to an unsigned char, and -** the resulting character is written. +**
c
+**
The int argument is converted to an unsigned char, and +** the resulting character is written.
** -** s The "char *" argument is expected to be a pointer to +**
s
+**
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 @@ -248,42 +264,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.
** -** p The "void *" pointer argument is printed in -** hexadecimal (as if by %#x or %#lx). +**
p
+**
The "void *" pointer argument is printed in +** hexadecimal (as if by %#x or %#lx).
** -** n The number of characters written so far is stored into +**
n
+**
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.
** -** m The error message associated with the current value of -** errno is printed as if by %s. +**
m
+**
The error message associated with the current value of +** errno is printed as if by %s.
** -** C The client argument identifier is printed under the -** control of the argument; if is NULL or +**
C
+**
The client argument identifier is printed under the +** control of the <dest> argument; if <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.
** -** H The channel argument identifier (channel name) is -** printed. +**
H
+**
The channel argument identifier (channel name) is +** printed.
** -** v The argument given must be a pointer to a struct +**
v
+**
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.
** -** % A `%' is written. No argument is converted. The -** complete conversion specification is `%%'. +**
%
+**
A `%' is written. No argument is converted. The +** complete conversion specification is `%%'.
+**
** ** 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 */ diff --git a/ircd/ircd_snprintf.c b/ircd/ircd_snprintf.c index 700aeba..5945afa 100644 --- a/ircd/ircd_snprintf.c +++ b/ircd/ircd_snprintf.c @@ -36,6 +36,7 @@ #if defined(__GNUC__) && defined(HAVE_LONG_LONG) # define EXTENSION __extension__ #else +/** Fallback (empty) definition of EXTENSION. */ # define EXTENSION #endif @@ -50,14 +51,18 @@ typedef _ularge_t _pointer_t; # define HAVE_POINTER_T # endif #else +/** Fallback definition of the largest integer type. */ typedef long _large_t; +/** Fallback definition of the largest unsigned integer type. */ typedef unsigned long _ularge_t; +/** Fallback definition of SIZEOF__LARGE_T. */ # define SIZEOF__LARGE_T SIZEOF_LONG #endif /* Select something for _pointer_t */ #ifndef HAVE_POINTER_T # if SIZEOF_LONG == SIZEOF_VOID_P +/** Unsigned integer type large enough to hold a pointer. */ typedef unsigned long _pointer_t; # elif SIZEOF_INT == SIZEOF_VOID_P typedef unsigned int _pointer_t; @@ -66,136 +71,144 @@ typedef unsigned int _pointer_t; # endif #endif /* HAVE_POINTER_T */ -/* rough length sufficient to hold an octal number, since those can be large */ +/** rough length sufficient to hold an octal number, since those can be large */ #define INTBUF_LEN (SIZEOF__LARGE_T * 3) +/** Return minimum of \a i1 and \a i2. */ #define SNP_MIN(i1, i2) ((i1) < (i2) ? (i1) : (i2)) +/** Return maximum of \a i1 and \a i2. */ #define SNP_MAX(i1, i2) ((i1) > (i2) ? (i1) : (i2)) +/** Indicate total number of bytes "pseudo-output" in buffer. */ #define TOTAL(buf_p) ((buf_p)->buf_loc + \ SNP_MAX((buf_p)->buf_overflow, (buf_p)->overflow)) -#define WIDTH_MAX 999 /* keep from overflowing width */ +#define WIDTH_MAX 999 /**< keep from overflowing width */ -/* data about the buffer */ +/** data about the output buffer */ struct BufData { - char *buf; /* pointer to buffer */ - size_t buf_size; /* maximum size of buffer */ - size_t buf_overflow; /* how much buffer has been overflowed */ - size_t buf_loc; /* where we are in the buffer */ - short limit; /* max # of chars to convert */ - size_t overflow; /* how much we overflowed the limit */ + char *buf; /**< pointer to buffer */ + size_t buf_size; /**< maximum size of buffer */ + size_t buf_overflow; /**< how much buffer has been overflowed */ + size_t buf_loc; /**< where we are in the buffer */ + short limit; /**< max # of chars to convert */ + size_t overflow; /**< how much we overflowed the limit */ }; +/** initializer for BufData */ #define BUFDATA_INIT { 0, 0, 0, 0, 0, 0 } -/* data about the fields */ +/** data about format fields */ struct FieldData { - unsigned int flags; /* flags describing argument */ - short base; /* base for integer conversions */ - short width; /* width of field */ - short prec; /* precision of field */ + unsigned int flags; /**< flags describing argument */ + short base; /**< base for integer conversions */ + short width; /**< width of field */ + short prec; /**< precision of field */ union { - _ularge_t v_int; /* an integer value */ - long double v_float; /* a floating point value -- NOT SUPPORTED */ - void *v_ptr; /* a pointer value */ - } value; /* value of a field */ + _ularge_t v_int; /**< an integer value */ + long double v_float; /**< a floating point value -- NOT SUPPORTED */ + void *v_ptr; /**< a pointer value */ + } value; /**< value of a field */ }; +/** initializer for FieldData */ #define FIELDDATA_INIT { 0, 0, 0, 0, { 0 } } /* Specifier flags */ -#define FLAG_MINUS 0x00000001 /* found a '-' flag */ -#define FLAG_PLUS 0x00000002 /* found a '+' flag */ -#define FLAG_SPACE 0x00000004 /* found a ' ' flag */ -#define FLAG_ALT 0x00000008 /* found a '#' flag */ -#define FLAG_ZERO 0x00000010 /* found a '0' flag */ -#define FLAG_COLON 0x00000020 /* found a ':' flag */ +#define FLAG_MINUS 0x00000001 /**< found a '-' flag */ +#define FLAG_PLUS 0x00000002 /**< found a '+' flag */ +#define FLAG_SPACE 0x00000004 /**< found a ' ' flag */ +#define FLAG_ALT 0x00000008 /**< found a '#' flag */ +#define FLAG_ZERO 0x00000010 /**< found a '0' flag */ +#define FLAG_COLON 0x00000020 /**< found a ':' flag */ -#define FLAG_RESERVED1 0x00000040 /* reserved for future expansion */ -#define FLAG_RESERVED0 0x00000080 +#define FLAG_RESERVED1 0x00000040 /**< reserved for future expansion */ +#define FLAG_RESERVED0 0x00000080 /**< reserved for future expansion */ /* integer types */ -#define TYPE_CHAR 0x00000100 /* number is a char */ -#define TYPE_SHORT 0x00000200 /* number is a short */ -#define TYPE_LONG 0x00000400 /* number is a long */ -#define TYPE_QUAD 0x00000800 /* number is a quad */ +#define TYPE_CHAR 0x00000100 /**< number is a char */ +#define TYPE_SHORT 0x00000200 /**< number is a short */ +#define TYPE_LONG 0x00000400 /**< number is a long */ +#define TYPE_QUAD 0x00000800 /**< number is a quad */ /* special integer types */ -#define TYPE_INTMAX 0x00001000 /* number is an intmax_t */ -#define TYPE_PTRDIFF 0x00002000 /* number is a ptrdiff_t */ -#define TYPE_SIZE 0x00004000 /* number is a size_t */ -#define TYPE_TIME 0x00008000 /* number is a time_t */ -#define TYPE_POINTER 0x00010000 /* number is a pointer_t */ +#define TYPE_INTMAX 0x00001000 /**< number is an intmax_t */ +#define TYPE_PTRDIFF 0x00002000 /**< number is a ptrdiff_t */ +#define TYPE_SIZE 0x00004000 /**< number is a size_t */ +#define TYPE_TIME 0x00008000 /**< number is a time_t */ +#define TYPE_POINTER 0x00010000 /**< number is a pointer_t */ /* floating point types */ -#define TYPE_LONGDOUBLE 0x00020000 /* number is a long double */ +#define TYPE_LONGDOUBLE 0x00020000 /**< number is a long double */ -#define TYPE_RESERVED1 0x00040000 /* reserved for future expansion */ -#define TYPE_RESERVED0 0x00080000 +#define TYPE_RESERVED1 0x00040000 /**< reserved for future expansion */ +#define TYPE_RESERVED0 0x00080000 /**< reserved for future expansion */ -/* Mask to get just the type data */ +/** Mask to get just the type data */ #define TYPE_MASK (TYPE_CHAR | TYPE_SHORT | TYPE_LONG | TYPE_QUAD | \ TYPE_INTMAX | TYPE_PTRDIFF | TYPE_SIZE | TYPE_TIME | \ TYPE_POINTER | TYPE_LONGDOUBLE) /* type of argument to extract */ -#define ARG_INT 0x00100000 /* argument is an integer */ -#define ARG_FLOAT 0x00200000 /* argument is a float */ -#define ARG_PTR 0x00300000 /* argument is a pointer */ - -#define ARG_RESERVED11 0x00400000 /* reserved for future expansion */ -#define ARG_RESERVED10 0x00500000 -#define ARG_RESERVED9 0x00600000 -#define ARG_RESERVED8 0x00700000 -#define ARG_RESERVED7 0x00800000 -#define ARG_RESERVED6 0x00900000 -#define ARG_RESERVED5 0x00a00000 -#define ARG_RESERVED4 0x00b00000 -#define ARG_RESERVED3 0x00c00000 -#define ARG_RESERVED2 0x00d00000 -#define ARG_RESERVED1 0x00e00000 -#define ARG_RESERVED0 0x00f00000 +#define ARG_INT 0x00100000 /**< argument is an integer */ +#define ARG_FLOAT 0x00200000 /**< argument is a float */ +#define ARG_PTR 0x00300000 /**< argument is a pointer */ + +#define ARG_RESERVED11 0x00400000 /**< reserved for future expansion */ +#define ARG_RESERVED10 0x00500000 /**< reserved for future expansion */ +#define ARG_RESERVED9 0x00600000 /**< reserved for future expansion */ +#define ARG_RESERVED8 0x00700000 /**< reserved for future expansion */ +#define ARG_RESERVED7 0x00800000 /**< reserved for future expansion */ +#define ARG_RESERVED6 0x00900000 /**< reserved for future expansion */ +#define ARG_RESERVED5 0x00a00000 /**< reserved for future expansion */ +#define ARG_RESERVED4 0x00b00000 /**< reserved for future expansion */ +#define ARG_RESERVED3 0x00c00000 /**< reserved for future expansion */ +#define ARG_RESERVED2 0x00d00000 /**< reserved for future expansion */ +#define ARG_RESERVED1 0x00e00000 /**< reserved for future expansion */ +#define ARG_RESERVED0 0x00f00000 /**< reserved for future expansion */ /* Mask to get just the argument data */ -#define ARG_MASK 0x00f00000 +#define ARG_MASK 0x00f00000 /**< masks off non-argument bits */ /* type of conversion to perform */ -#define CONV_INT 0x01000000 /* convert integers */ -#define CONV_FLOAT 0x02000000 /* convert floats */ -#define CONV_CHAR 0x03000000 /* convert chars */ -#define CONV_STRING 0x04000000 /* convert strings */ -#define CONV_VARARGS 0x05000000 /* convert a %v */ -#define CONV_CLIENT 0x06000000 /* convert a struct Client */ -#define CONV_CHANNEL 0x07000000 /* convert a struct Channel */ - -#define CONV_RESERVED7 0x08000000 /* reserved for future expansion */ -#define CONV_RESERVED6 0x09000000 -#define CONV_RESERVED5 0x0a000000 -#define CONV_RESERVED4 0x0b000000 -#define CONV_RESERVED3 0x0c000000 -#define CONV_RESERVED2 0x0d000000 -#define CONV_RESERVED1 0x0e000000 -#define CONV_RESERVED0 0x0f000000 +#define CONV_INT 0x01000000 /**< convert integers */ +#define CONV_FLOAT 0x02000000 /**< convert floats */ +#define CONV_CHAR 0x03000000 /**< convert chars */ +#define CONV_STRING 0x04000000 /**< convert strings */ +#define CONV_VARARGS 0x05000000 /**< convert a %v */ +#define CONV_CLIENT 0x06000000 /**< convert a struct Client */ +#define CONV_CHANNEL 0x07000000 /**< convert a struct Channel */ + +#define CONV_RESERVED7 0x08000000 /**< reserved for future expansion */ +#define CONV_RESERVED6 0x09000000 /**< reserved for future expansion */ +#define CONV_RESERVED5 0x0a000000 /**< reserved for future expansion */ +#define CONV_RESERVED4 0x0b000000 /**< reserved for future expansion */ +#define CONV_RESERVED3 0x0c000000 /**< reserved for future expansion */ +#define CONV_RESERVED2 0x0d000000 /**< reserved for future expansion */ +#define CONV_RESERVED1 0x0e000000 /**< reserved for future expansion */ +#define CONV_RESERVED0 0x0f000000 /**< reserved for future expansion */ /* Mask to get just the conversion data */ -#define CONV_MASK 0x0f000000 +#define CONV_MASK 0x0f000000 /**< masks off non-conversion bits */ /* Value information flags */ -#define INFO_RESERVED0 0x10000000 /* reserved for future expansion */ -#define INFO_UPPERCASE 0x20000000 /* use uppercase characters */ -#define INFO_UNSIGNED 0x40000000 /* number is unsigned */ -#define INFO_NEGATIVE 0x80000000 /* number is negative */ +#define INFO_RESERVED0 0x10000000 /**< reserved for future expansion */ +#define INFO_UPPERCASE 0x20000000 /**< use uppercase characters */ +#define INFO_UNSIGNED 0x40000000 /**< number is unsigned */ +#define INFO_NEGATIVE 0x80000000 /**< number is negative */ -#define BASE_OCTAL 9 /* octal base; bits-per-char * 3 */ -#define BASE_DECIMAL -1000 /* decimal base; 10 ** 3 */ -#define BASE_HEX 12 /* hexadecimal base; bits-per-char * 3 */ +#define BASE_OCTAL 9 /**< octal base; bits-per-char * 3 */ +#define BASE_DECIMAL -1000 /**< decimal base; 10 ** 3 */ +#define BASE_HEX 12 /**< hexadecimal base; bits-per-char * 3 */ /* padding... 1 2 3 4 5 */ /* 12345678901234567890123456789012345678901234567890 */ +/** Predefined space padding. */ static char spaces[] = " "; +/** Predefined zero padding. */ static char zeros[] = "00000000000000000000000000000000000000000000000000"; +/** Length of predefined padding strings. */ #define PAD_LENGTH (sizeof(spaces) - 1) /* @@ -203,7 +216,7 @@ static char zeros[] = "00000000000000000000000000000000000000000000000000"; * course, a reason for this; check out how they're built in doprintf. */ -/* string table for octal values */ +/** string table for octal values */ static char *octal[] = { "", "1", "2", "3", "4", "5", "6", "7", "01", "11", "21", "31", "41", "51", "61", "71", @@ -271,7 +284,7 @@ static char *octal[] = { "077", "177", "277", "377", "477", "577", "677", "777" }; -/* string table for decimal values */ +/** string table for decimal values */ static char *decimal[] = { "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "01", "11", "21", "31", "41", "51", "61", "71", "81", "91", @@ -375,7 +388,7 @@ static char *decimal[] = { "099", "199", "299", "399", "499", "599", "699", "799", "899", "999" }; -/* string table for lower-case hexadecimal values */ +/** string table for lower-case hexadecimal values */ static char *hex[] = { "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", @@ -891,7 +904,7 @@ static char *hex[] = { "8ff", "9ff", "aff", "bff", "cff", "dff", "eff", "fff" }; -/* string table for upper-case hexadecimal values */ +/** string table for upper-case hexadecimal values */ static char *HEX[] = { "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", @@ -1407,7 +1420,10 @@ static char *HEX[] = { "8FF", "9FF", "AFF", "BFF", "CFF", "DFF", "EFF", "FFF" }; -/* Add a character to the buffer */ +/** Append a single character to an output buffer. + * @param[in,out] buf_p Buffer to append to. + * @param[in] c Character to append. + */ static void addc(struct BufData *buf_p, int c) { @@ -1428,7 +1444,11 @@ addc(struct BufData *buf_p, int c) buf_p->buf[buf_p->buf_loc++] = c; } -/* Add a string to the buffer */ +/** Append a string to an output buffer. + * @param[in,out] buf_p Buffer to append to. + * @param[in] s_len Length of string to append. + * @param[in] s String to append. + */ static void adds(struct BufData *buf_p, int s_len, const char *s) { @@ -1458,7 +1478,11 @@ adds(struct BufData *buf_p, int s_len, const char *s) } } -/* Add padding */ +/** Add certain padding to an output buffer. + * @param[in,out] buf_p Buffer to append to. + * @param[in] padlen Length of padding to add. + * @param[in] pad Padding string (at least PAD_LENGTH bytes long). + */ static void do_pad(struct BufData *buf_p, int padlen, char *pad) { @@ -1470,7 +1494,11 @@ do_pad(struct BufData *buf_p, int padlen, char *pad) adds(buf_p, padlen, pad); } -/* Find string length up to maxlen */ +/** Return length of string, up to a maximum. + * @param[in] str String to find length for. + * @param[in] maxlen Maximum value to return. + * @return Minimum of \a maxlen and length of \a str. + */ static int my_strnlen(const char *str, int maxlen) { @@ -1482,7 +1510,12 @@ my_strnlen(const char *str, int maxlen) return len; } -/* the function that actually puts it all together */ +/** Workhorse printing function. + * @param[in] dest Client to format the message. + * @param[in,out] buf_p Description of output buffer. + * @param[in] fmt Message format string. + * @param[in] vp Variable-length argument list for format string. + */ static void doprintf(struct Client *dest, struct BufData *buf_p, const char *fmt, va_list vp) @@ -2086,6 +2119,7 @@ doprintf(struct Client *dest, struct BufData *buf_p, const char *fmt, } /* for (; *fmt; fmt++) { */ } +/* ircd_snprintf() has a big Doxygen comment in the header file. */ int ircd_snprintf(struct Client *dest, char *buf, size_t buf_len, const char *format, ...) @@ -2109,6 +2143,14 @@ ircd_snprintf(struct Client *dest, char *buf, size_t buf_len, return TOTAL(&buf_s); } +/** Like ircd_snprintf() but with a va_list argument list. + * @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. + * @param[in] args Variable-length argument list for format string. + * @return Number of bytes that would be written to \a buf without truncation. + */ int ircd_vsnprintf(struct Client *dest, char *buf, size_t buf_len, const char *format, va_list args) -- 2.20.1