#include <stdarg.h> #include <pfmt.h> int vlfmt(FILE *stream, long flags, char *format, va_list ap);
The <stdarg.h> header file defines
the type va_list and a set of macros for advancing through a list of arguments
whose number and types may vary. The argument ap to vlfmt() is of type va_list.
This argument is used with the <stdarg.h> header file macros va_start(), va_arg()
and va_end().
[ see va_start(), va_arg(), and va_end() in stdarg(5)
]. The EXAMPLE
section
below shows their use with vlfmt().
The macro va_alist is used as the parameter list in a function definition as in the function called errlog() in the example below. The macro va_start(ap, ), where ap is of type va_list, must be called before any attempt to traverse and access unnamed arguments. Calls to va_arg(ap, atype) traverse the argument list. Each execution of va_arg() expands to an expression with the value and type of the next argument in the list ap, which is the same object initialized by va_start. The argument atype is the type that the returned argument is expected to be. The va_end(ap) macro must be invoked when all desired arguments have been accessed. (The argument list in ap can be traversed again if va_start() is called again after va_end().) In the example below, va_arg() is executed first to retrieve the format string passed to errlog(). The remainting errlog() arguments, arg1, arg2, ..., are given to vlfmt() in the argument ap.
#include <pfmt.h> #include <stdarg.h> /* * errlog should be called like * errlog(log_info, format, arg1, ...); */ void errlog(long log_info, ...) { va_list ap; char *format; va_start(ap, ); format = va_arg(ap, char *); (void) vlfmt(stderr, log_info|MM_ERROR, format, ap); va_end(ap); (void) abort(); }