AutoOpts supports option processing; option state saving; and
program documentation with innumerable features. Here, we list
a few obvious ones and some important ones, but the full list is
really defined by all the attributes defined in the Option Definitions
section.
POSIX-compliant short (flag) option processing.
GNU-style long options processing. Long options
are recognized without case sensitivity, and they may be abbreviated.
Environment variable initializations, See environrc.
Initialization from configuration files (aka RC or INI files), and
saving the option state back into one, See loading rcfile.
Config files may be partitioned. One config file may be used by several
programs by partitioning it with lines containing,
[PROGRAM_NAME] or <?program-name>, See loading rcfile.
Config files may contain AutoOpts directives.
<?auto-options [[option-text]]>
may be used to set AutoOpts option processing options.
Viz., GNU usage layout versus AutoOpts conventional layout,
and misuse-usage versus no-misuse-usage, See usage attributes.
Options may be marked as dis-abled with a disablement prefix.
Such options may default to either an enabled or a disabled state. You
may also provide an enablement prefix, too, e.g., --allow-mumble
and --prevent-mumble (see Common Attributes).
Verify that required options are present between the minimum and maximum
number of times on the command line. Verify that conflicting options do not
appear together. Verify that options requiring the presence of other options
are, in fact, used in the presence of other options.
See See Common Attributes, and See Option Conflict Attributes.
There are several automatically supported options.
They will have short flags if any options have option flags and the flags
are not suppressed. The associated flag may be altered or suppressed by
specifying no value or an alternate character for xxx-value; in
the option definition file. xxx is the name of the option below:
‘--help’
‘--more-help’
These are always available. ‘--more-help’ will pass the full usage
text through a pager.
‘--usage’
This is added to the option list if usage-opt is specified.
It yields the abbreviated usage to stdout.
‘--version’
This is added to the option list if version = xxx; is specified.
‘--load-opts’
‘--save-opts’
These are added to the option list if homerc is specified. Mostly.
If, disable-save is specified, then --save-opts is disabled.
Various forms of main procedures can be added to the output,
See Generated main. There are four basic forms:
A program that processes the arguments and writes to standard out
portable shell commands containing the digested options.
A program that will generate portable shell commands to parse the defined
options. The expectation is that this result will be copied into a
shell script and used there.
A for-each main that will invoke a named function once for either
each non-option argument on the command line or, if there are none,
then once for each non-blank, non-comment input line read from stdin.
A main procedure of your own design. Its code can be supplied in the
option description template or by incorporating another template.
There are several methods for handling option arguments.
nothing (see OPT_ARG) option argument strings are globally available.
The generated usage text can be emitted in either AutoOpts standard format
(maximizing the information about each option), or GNU-ish normal form. The
default form is selected by either specifying or not specifying the
gnu-usage attribute (see information attributes). This can be
overridden by the user himself with the AUTOOPTS_USAGE environment
variable. If it exists and is set to the string ‘gnu’, it will force
GNU-ish style format; if it is set to the string ‘autoopts’, it will
force AutoOpts standard format; otherwise, it will have no effect.
The usage text and many other strings are stored in a single character array
(see string table functions). This reduces fixup
costs when loading the program or library. The downside is that if GCC
detects that any of these strings are used in a printf format, you may get the
warning, embedded '\0' in format. To eliminate the warning, you must
provide GCC with the -Wno-format-contains-nul option.
If you compile with ENABLE_NLS defined and _() defined to a
localization function (e.g. gettext(3GNU)), then the option processing
code will be localizable (see i18n). Provided also that you do not define
the no-xlate attribute to anything
(see presentation attributes).
You should also ensure that the ATTRIBUTE_FORMAT_ARG() gets
#define-ed to something useful. There is an autoconf macro
named AG_COMPILE_FORMAT_ARG in ag_macros.m4 that will
set it appropriately for you. If you do not do this, then translated
formatting strings may trigger GCC compiler warnings.
Provides a callable routine to parse
a text string as if it were from one of the rc/ini/config files,
hereafter referred to as a configuration file.
By adding a ‘doc’ and ‘arg-name’ attributes to each option,
AutoGen will also be able to produce a man page and the ‘invoking’
section of a texinfo document.
Intermingled option processing. AutoOpts options may be intermingled with
command line operands and options processed with other parsing techniques.
This is accomplished by setting the allow-errors
(see program attributes) attribute. When processing reaches a point
where optionProcess (see libopts-optionProcess) needs to be called
again, the current option can be set with RESTART_OPT(n)
(see RESTART_OPT) before calling optionProcess.
Library suppliers can specify command line options that their
client programs will accept. They specify option definitions
that get #include-d into the client option definitions
and they specify an "anchor" option that has a callback and must be invoked.
That will give the library access to the option state for their options.
library options. An AutoOpt-ed library may export its options for use in
an AutoOpt-ed program. This is done by providing an option definition file
that client programs #include into their own option definitions.
See “AutoOpt-ed Library for AutoOpt-ed Program” (see lib and program)
for more details.