(libc.info.gz) Parsing a Template String
Info Catalog
(libc.info.gz) Variable Arguments Output
(libc.info.gz) Formatted Output
(libc.info.gz) Example of Parsing
12.12.10 Parsing a Template String
----------------------------------
You can use the function 'parse_printf_format' to obtain information
about the number and types of arguments that are expected by a given
template string. This function permits interpreters that provide
interfaces to 'printf' to avoid passing along invalid arguments from the
user's program, which could cause a crash.
All the symbols described in this section are declared in the header
file 'printf.h'.
-- Function: size_t parse_printf_format (const char *TEMPLATE, size_t
N, int *ARGTYPES)
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | POSIX
Safety Concepts.
This function returns information about the number and types of
arguments expected by the 'printf' template string TEMPLATE. The
information is stored in the array ARGTYPES; each element of this
array describes one argument. This information is encoded using
the various 'PA_' macros, listed below.
The argument N specifies the number of elements in the array
ARGTYPES. This is the maximum number of elements that
'parse_printf_format' will try to write.
'parse_printf_format' returns the total number of arguments
required by TEMPLATE. If this number is greater than N, then the
information returned describes only the first N arguments. If you
want information about additional arguments, allocate a bigger
array and call 'parse_printf_format' again.
The argument types are encoded as a combination of a basic type and
modifier flag bits.
-- Macro: int PA_FLAG_MASK
This macro is a bitmask for the type modifier flag bits. You can
write the expression '(argtypes[i] & PA_FLAG_MASK)' to extract just
the flag bits for an argument, or '(argtypes[i] & ~PA_FLAG_MASK)'
to extract just the basic type code.
Here are symbolic constants that represent the basic types; they
stand for integer values.
'PA_INT'
This specifies that the base type is 'int'.
'PA_CHAR'
This specifies that the base type is 'int', cast to 'char'.
'PA_STRING'
This specifies that the base type is 'char *', a null-terminated
string.
'PA_POINTER'
This specifies that the base type is 'void *', an arbitrary
pointer.
'PA_FLOAT'
This specifies that the base type is 'float'.
'PA_DOUBLE'
This specifies that the base type is 'double'.
'PA_LAST'
You can define additional base types for your own programs as
offsets from 'PA_LAST'. For example, if you have data types 'foo'
and 'bar' with their own specialized 'printf' conversions, you
could define encodings for these types as:
#define PA_FOO PA_LAST
#define PA_BAR (PA_LAST + 1)
Here are the flag bits that modify a basic type. They are combined
with the code for the basic type using inclusive-or.
'PA_FLAG_PTR'
If this bit is set, it indicates that the encoded type is a pointer
to the base type, rather than an immediate value. For example,
'PA_INT|PA_FLAG_PTR' represents the type 'int *'.
'PA_FLAG_SHORT'
If this bit is set, it indicates that the base type is modified
with 'short'. (This corresponds to the 'h' type modifier.)
'PA_FLAG_LONG'
If this bit is set, it indicates that the base type is modified
with 'long'. (This corresponds to the 'l' type modifier.)
'PA_FLAG_LONG_LONG'
If this bit is set, it indicates that the base type is modified
with 'long long'. (This corresponds to the 'L' type modifier.)
'PA_FLAG_LONG_DOUBLE'
This is a synonym for 'PA_FLAG_LONG_LONG', used by convention with
a base type of 'PA_DOUBLE' to indicate a type of 'long double'.
For an example of using these facilities, see Example of
Parsing.
Info Catalog
(libc.info.gz) Variable Arguments Output
(libc.info.gz) Formatted Output
(libc.info.gz) Example of Parsing
automatically generated by
info2html