Name
ap_vformatter — general-purpose formatter
Synopsis
int ap_vformatter(int (*flush_func)(ap_vformatter_buff *), ap_vformatter_buff *vbuff, const char *fmt, va_list ap)
Because Apache has several requirements for formatting functions
(e.g., ap_bprintf()
, ap_psprintf(
)
) and it is actually not possible to implement them safely
using standard functions, Apache has its own printf(
)
-style routines. This function is the interface to them.
It takes a buffer-flushing function as an argument and an
ap_vformatter_buff
structure, which looks like
this:
typedef struct { char *curpos; char *endpos; } ap_vformatter_buff;
It also takes the usual format string, fmt
, and
varargs
list, ap
.
ap_vformatter()
fills the buffer (at
vbuff->curpos
) until vbuff->curpos
== vbuff->endpos
; then flush_func()
is called with vbuff
as the argument.
flush_func()
should empty the buffer and reset
the values in vbuff
to allow the formatting to
proceed. flush_func()
is not called when
formatting is complete (unless it happens to fill the buffer). It is
the responsibility of the function that calls ap_vformatter(
)
to finish things off.
Since flush_func()
almost always needs more
information than that found in vbuff
, the
following ghastly hack is frequently employed. First, a structure
with an ap_vformatter_buff
as its first element is
defined:[7]
struct extra_data { ap_vformatter_buff vbuff; int some_extra_data; ... };
Next, the printf()
-style routine calls
ap_vformatter
with an instance of this structure:
struct ...
Get Apache: The Definitive Guide, 3rd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.