#### 12.13.2 Conversion Specifier Options

If you define a meaning for ‘`%A`’, what if the template contains ‘`%+23A`’ or ‘`%-#A`’? To implement a sensible meaning for these, the handler when called needs to be able to get the options specified in the template.

Both the handler-function and arginfo-function accept an argument that points to a `struct printf_info`, which contains information about the options appearing in an instance of the conversion specifier. This data type is declared in the header file `printf.h`.

— Type: struct printf_info

> This structure is used to pass information about the options appearing in an instance of a conversion specifier in a `printf` template string to the handler and arginfo functions for that specifier. It contains the following members:

> `int prec`
>   This is the precision specified. The value is `-1` if no precision was specified. If the precision was given as ‘`*`’, the `printf_info` structure passed to the handler function contains the actual value retrieved from the argument list. But the structure passed to the arginfo function contains a value of `INT_MIN`, since the actual value is not known.
> `int width`
>   This is the minimum field width specified. The value is `0` if no width was specified. If the field width was given as ‘`*`’, the `printf_info` structure passed to the handler function contains the actual value retrieved from the argument list. But the structure passed to the arginfo function contains a value of `INT_MIN`, since the actual value is not known.
> `wchar_t spec`
>   This is the conversion specifier character specified. It's stored in the structure so that you can register the same handler function for multiple characters, but still have a way to tell them apart when the handler function is called.
> `unsigned int is_long_double`
>   This is a boolean that is true if the ‘`L`’, ‘`ll`’, or ‘`q`’ type modifier was specified. For integer conversions, this indicates `long long int`, as opposed to `long double` for floating point conversions.
> `unsigned int is_char`
>   This is a boolean that is true if the ‘`hh`’ type modifier was specified.
> `unsigned int is_short`
>   This is a boolean that is true if the ‘`h`’ type modifier was specified.
> `unsigned int is_long`
>   This is a boolean that is true if the ‘`l`’ type modifier was specified.
> `unsigned int alt`
>   This is a boolean that is true if the ‘`#`’ flag was specified.
> `unsigned int space`
>   This is a boolean that is true if the ‘`` ’ flag was specified.
> `unsigned int left`
>   This is a boolean that is true if the ‘`-`’ flag was specified.
> `unsigned int showsign`
>   This is a boolean that is true if the ‘`+`’ flag was specified.
> `unsigned int group`
>   This is a boolean that is true if the ‘`'`’ flag was specified.
> `unsigned int extra`
>   This flag has a special meaning depending on the context. It could be used freely by the user-defined handlers but when called from the `printf` function this variable always contains the value `0`.
> `unsigned int wide`
>   This flag is set if the stream is wide oriented.
> `wchar_t pad`
>   This is the character to use for padding the output to the minimum field width. The value is `'0'` if the ‘`0`’ flag was specified, and `' '` otherwise.