Content-type: text/html
#include <popt.h> poptContext poptGetContext(char * name, int argc, char ** argv, struct poptOption * options, int flags); void poptFreeContext(poptContext con); void poptResetContext(poptContext con); int poptGetNextOpt(poptContext con); char * poptGetOptArg(poptContext con); char * poptGetArg(poptContext con); char * poptPeekArg(poptContext con); char ** poptGetArgs(poptContext con); const char * poptStrerror(const int error); char * poptBadOption(poptContext con, int flags); int poptReadDefaultConfig(poptContext con, int flags); int poptReadConfigFile(poptContext con, char * fn); int poptAddAlias(poptContext con, struct poptAlias alias, int flags); int poptParseArgvString(char * s, int * argcPtr, char *** argvPtr); int poptStuffArgs(poptContext con, char ** argv);
Like getopt_long(), the popt library supports short and long style options. Recall that a short option consists of a - character followed by a single alphanumeric character. A long option, common in GNU utilities, consists of two - characters followed by a string made up of letters, numbers and hyphens. Long options are optionally allowed to begin with a single -, primarily to allow command-line compatibility between popt applications and X toolkit applications. Either type of option may be followed by an argument. A space separates a short option from its arguments; either a space or an = separates a long option from an argument.
The popt library is highly portable and should work on any POSIX platform. The latest version is always available from: ftp://ftp.redhat.com/pub/redhat/code/popt.
It may be redistributed under either the GNU General Public License or the GNU Library General Public License, at the distributor's discretion.
#include <popt.h>
struct poptOption { const char * longName; /* may be NULL */ char shortName; /* may be '\0' */ int argInfo; void * arg; /* depends on argInfo */ int val; /* 0 means don't return, just update flag */ char * descrip; /* description for autohelp -- may be NULL */ char * argDescrip; /* argument description for autohelp */ };
Each member of the table defines a single option that may be passed to the program. Long and short options are considered a single option that may occur in two different forms. The first two members, longName and shortName, define the names of the option; the first is a long name, while the latter is a single character.
The argInfo member tells popt what type of argument is expected after the argument. If no option is expected, POPT_ARG_NONE should be used. The rest of the valid values are shown in the following table:
If the argInfo value is bitwise or'd with POPT_ARGFLAG_ONEDASH, | ||||||||||||||
the long argument may be given with a single - instead of two. For example, | ||||||||||||||
| ||||||||||||||
| | | | | ||||||||||
| | | ||||||||||||
| | | | | ||||||||||
| | | | |||||||||||
| | | ||||||||||||
appropriate type, and an error returned if the conversion fails. | ||||||||||||||
POPT_ARG_VAL causes arg to be set to the (integer) value of | ||||||||||||||
val when the argument is found. This is most often useful for | ||||||||||||||
mutually-exclusive arguments in cases where it is not an error for | ||||||||||||||
multiple arguments to occur and where you want the last argument | ||||||||||||||
specified to win; for example, "rm -i -f". POPT_ARG_VAL causes | ||||||||||||||
the parsing function not to return a value, since the value of val | ||||||||||||||
has already been used. | ||||||||||||||
should return when the option is encountered. If it is 0, the parsing | ||||||||||||||
function does not return a value, instead parsing the next | ||||||||||||||
command-line argument. | ||||||||||||||
if automatic help messages are desired (automatic usage messages can | ||||||||||||||
arguments. | ||||||||||||||
see below) in the main one which provides the table entries for these | ||||||||||||||
use popt's automatical help, popt displays the appropriate message on | ||||||||||||||
stderr as soon as it finds the option, and exits the program with a | ||||||||||||||
return code of 0. If you want to use popt's automatic help generation in | ||||||||||||||
a different way, you need to explicitly add the option entries to your programs | ||||||||||||||
If the argInfo value is bitwise or'd with POPT_ARGFLAG_DOC_HIDDEN, | ||||||||||||||
the argument will not be shown in help output. | ||||||||||||||
The final structure in the table should have all the pointer values set | ||||||||||||||
end of the table. | ||||||||||||||
There are two types of option table entries which do not specify command | ||||||||||||||
line options. When either of these types of entries are used, the | ||||||||||||||
longName element must be NULL and the shortName element | ||||||||||||||
must be '\0'. | ||||||||||||||
The first of these special entry types allows the application to nest | ||||||||||||||
another option table in the current one; such nesting may extend quite | ||||||||||||||
deeply (the actual depth is limited by the program's stack). Including | ||||||||||||||
other option tables allows a library to provide a standard set of | ||||||||||||||
command-line options to every program which uses it (this is often done | ||||||||||||||
in graphical programming toolkits, for example). To do this, set | ||||||||||||||
the argInfo field to POPT_ARG_INCLUDE_TABLE and the | ||||||||||||||
arg field to point to the table which is being included. If | ||||||||||||||
automatic help generation is being used, the descrip field should | ||||||||||||||
contain a overall description of the option table being included. | ||||||||||||||
The other special option table entry type tells popt to call a function (a | ||||||||||||||
callback) when any option in that table is found. This is especially usefull | ||||||||||||||
when included option tables are being used, as the program which provides | ||||||||||||||
the top-level option table doesn't need to be aware of the other options | ||||||||||||||
which are provided by the included table. When a callback is set for | ||||||||||||||
a table, the parsing function never returns information on an option in | ||||||||||||||
the table. Instead, options information must be retained via the callback | ||||||||||||||
or by having popt set a variable through the option's arg field. | ||||||||||||||
Option callbacks should match the following prototype: | ||||||||||||||
The first parameter is the context which is being parsed (see the next | ||||||||||||||
section for information on contexts), opt points to the option | ||||||||||||||
which triggered this callback, and arg is the option's argument. | ||||||||||||||
If the option does not take an argument, arg is NULL. The | ||||||||||||||
final parameter, data is taken from the descrip field | ||||||||||||||
of the option table entry which defined the callback. As descrip | ||||||||||||||
is a pointer, this allows callback functions to be passed an arbitrary | ||||||||||||||
set of data (though a typecast will have to be used). | ||||||||||||||
The option table entry which defines a callback has an argInfo of | ||||||||||||||
POPT_ARG_CALLBACK, an arg which points to the callback | ||||||||||||||
function, and a descrip field which specifies an arbitrary pointer | ||||||||||||||
to be passed to the callback. | ||||||||||||||
popt can interleave the parsing of multiple command-line sets. It allows | ||||||||||||||
this by keeping all the state information for a particular set of | ||||||||||||||
command-line arguments in a | ||||||||||||||
modified outside the popt library. | ||||||||||||||
The first parameter, | ||||||||||||||
should be the name of the application whose options are being parsed, | ||||||||||||||
two arguments specify the command-line arguments to parse. These are | ||||||||||||||
which was described in the previous section. The final parameter, | ||||||||||||||
0 for compatibility with future versions of the popt library. | ||||||||||||||
parsed and which remain, among other things. If a program wishes to | ||||||||||||||
restart option processing of a set of arguments, it can reset the | ||||||||||||||
When argument processing is complete, the process should free the | ||||||||||||||
context is using. | ||||||||||||||
argument parsing. | ||||||||||||||
Taking the context as its sole argument, this function parses the next | ||||||||||||||
command-line argument found. After finding the next argument in the | ||||||||||||||
option table, the function fills in the object pointed to by the option | ||||||||||||||
non-0, the function then returns that value. Otherwise, | ||||||||||||||
parsed, and other negative values when errors occur. This makes it a | ||||||||||||||
good idea to | ||||||||||||||
pointers, command-line parsing is reduced to the following line of code: | ||||||||||||||
rc = poptGetNextOpt(poptcon); | ||||||||||||||
Many applications require more complex command-line parsing than this, | ||||||||||||||
however, and use the following structure: | ||||||||||||||
while ((rc = poptGetNextOpt(poptcon)) > 0) { | ||||||||||||||
switch (rc) { | ||||||||||||||
/* specific arguments are handled here */ | ||||||||||||||
} | ||||||||||||||
} | ||||||||||||||
When returned options are handled, the application needs to know the | ||||||||||||||
value of any arguments that were specified after the option. There are two | ||||||||||||||
ways to discover them. One is to ask popt to fill in a variable with the | ||||||||||||||
This function returns the argument given for the final option returned by | ||||||||||||||
Many applications take an arbitrary number of command-line arguments, | ||||||||||||||
such as a list of file names. When popt encounters an argument that does | ||||||||||||||
not begin with a -, it assumes it is such an argument and adds it to a list | ||||||||||||||
of leftover arguments. Three functions allow applications to access such | ||||||||||||||
arguments: | ||||||||||||||
This function returns the next leftover argument and marks it as | ||||||||||||||
processed. | ||||||||||||||
The next leftover argument is returned but not marked as processed. | ||||||||||||||
This allows an application to look ahead into the argument list, | ||||||||||||||
without modifying the list. | ||||||||||||||
All the leftover arguments are returned in a manner identical to | ||||||||||||||
The popt library can automatically generate help messages which | ||||||||||||||
describe the options a program accepts. There are two types of help | ||||||||||||||
messages which can be generated. Usage messages are a short messages | ||||||||||||||
which lists valid options, but does not describe them. Help messages | ||||||||||||||
describe each option on one (or more) lines, resulting in a longer, but | ||||||||||||||
more useful, message. Whenever automatic help messages are used, the | ||||||||||||||
descrip and argDescrip fields struct poptOption members | ||||||||||||||
should be filled in for each option. | ||||||||||||||
The POPT_AUTOHELP macro makes it easy to add --usage and | ||||||||||||||
--help messages to your program, and is described in part 1 | ||||||||||||||
of this man page. If more control is needed over your help messages, | ||||||||||||||
the following two functions are available: | ||||||||||||||
poptPrintHelp() displays the standard help message to the stdio file | ||||||||||||||
descriptor f, while poptPrintUsage() displays the shorter usage | ||||||||||||||
message. Both functions currently ignore the flags argument; it is | ||||||||||||||
there to allow future changes. | ||||||||||||||
All of the popt functions that can return errors return integers. | ||||||||||||||
When an error occurs, a negative error code is returned. The | ||||||||||||||
following table summarizes the error codes that occur: | ||||||||||||||
Here is a more detailed discussion of each error: | ||||||||||||||
An option that requires an argument was specified on the command | ||||||||||||||
line, but no argument was given. This can be returned only by | ||||||||||||||
A set of option aliases is nested too deeply. Currently, popt | ||||||||||||||
follows options only 10 levels to prevent infinite recursion. Only | ||||||||||||||
A parsed string has a quotation mismatch (such as a single quotation | ||||||||||||||
A conversion from a string to a number (int or long) failed due | ||||||||||||||
to the string containing nonnumeric characters. This occurs when | ||||||||||||||
A string-to-number conversion failed because the number was too | ||||||||||||||
contains the error from the system call. Both | ||||||||||||||
return this error. | ||||||||||||||
Two functions are available to make it easy for applications to provide | ||||||||||||||
good error messages. | ||||||||||||||
This function takes a popt error code and returns a string describing | ||||||||||||||
returned may have been specified through an alias. | ||||||||||||||
These two functions make popt error handling trivial for most | ||||||||||||||
applications. When an error is detected from most of the functions, | ||||||||||||||
an error message is printed along with the error string from | ||||||||||||||
code similiar to the following displays a useful error message: | ||||||||||||||
fprintf(stderr, "%s: %s\n", | ||||||||||||||
poptBadOption(optCon, POPT_BADOPTION_NOALIAS), | ||||||||||||||
poptStrerror(rc)); | ||||||||||||||
ability to use option aliasing. This lets the user specify options that | ||||||||||||||
popt expands into other options when they are specified. If the standard | ||||||||||||||
information in text files. | ||||||||||||||
an arbitrary number of lines formatted like this: | ||||||||||||||
being defined; currently popt configuration files support only aliases, but | ||||||||||||||
other abilities may be added in the future. The next option is the option | ||||||||||||||
that should be aliased, and it may be either a short or a long option. The | ||||||||||||||
rest of the line specifies the expansion for the alias. It is parsed | ||||||||||||||
similarly to a shell command, which allows \, ", and ' to be used for | ||||||||||||||
quoting. If a backslash is the final character on a line, the next line | ||||||||||||||
in the file is assumed to be a logical continuation of the line containing | ||||||||||||||
the backslash, just as in shell. | ||||||||||||||
as suggested at the beginning of this section. | ||||||||||||||
three functions that define aliases for a context: | ||||||||||||||
configuration file. This allows programs to use program-specific | ||||||||||||||
configuration files. | ||||||||||||||
Occasionally, processes want to specify aliases without having to | ||||||||||||||
read them from a configuration file. This function adds a new alias | ||||||||||||||
currently reserved for future expansion. The new alias is specified | ||||||||||||||
struct poptAlias { | ||||||||||||||
char * longName; /* may be NULL */ | ||||||||||||||
char shortName; /* may be '\0' */ | ||||||||||||||
int argc; | ||||||||||||||
char ** argv; /* must be free()able */ | ||||||||||||||
}; | ||||||||||||||
define the expansion to use when the aliases option is encountered. | ||||||||||||||
Although popt is usually used for parsing arguments already divided into | ||||||||||||||
are formatted identically to command lines. To facilitate this, popt | ||||||||||||||
provides a function that parses a string into an array of strings, | ||||||||||||||
using rules similiar to normal shell parsing. | ||||||||||||||
of elements parsed, and the pointer pointed to by the final parameter is | ||||||||||||||
set to point to the newly created array. The array is dynamically | ||||||||||||||
with it. | ||||||||||||||
Some applications implement the equivalent of option aliasing but need | ||||||||||||||
allows an application to insert new arguments into the current | ||||||||||||||
"stuffed" arguments are the first to be parsed. popt returns to the | ||||||||||||||
normal arguments once all the stuffed arguments have been exhausted. | ||||||||||||||
The following example is a simplified version of the program "robin" | ||||||||||||||
which appears in Chapter 15 of the text cited below. Robin has | ||||||||||||||
been stripped of everything but its argument-parsing logic, slightly | ||||||||||||||
reworked, and renamed "parse." It may prove useful in illustrating | ||||||||||||||
at least some of the features of the extremely rich popt library. | ||||||||||||||
#include <popt.h> | ||||||||||||||
#include <stdio.h> | ||||||||||||||
void usage(poptContext optCon, int exitcode, char *error, char *addl) { | ||||||||||||||
poptPrintUsage(optCon, stderr, 0); | ||||||||||||||
if (error) fprintf(stderr, "%s: %s, error, addl); | ||||||||||||||
exit(exitcode); | ||||||||||||||
} | ||||||||||||||
int main(int argc, char *argv[]) { | ||||||||||||||
char c; /* used for argument parsing */ | ||||||||||||||
int i = 0; /* used for tracking options */ | ||||||||||||||
char *portname; | ||||||||||||||
int speed = 0; /* used in argument parsing to set speed */ | ||||||||||||||
int raw = 0; /* raw mode? */ | ||||||||||||||
int j; | ||||||||||||||
char buf[BUFSIZ+1]; | ||||||||||||||
poptContext optCon; /* context for parsing command-line options */ | ||||||||||||||
struct poptOption optionsTable[] = { | ||||||||||||||
}; | ||||||||||||||
optCon = poptGetContext(NULL, argc, argv, optionsTable, 0); | ||||||||||||||
poptSetOtherOptionHelp(optCon, "[OPTIONS]* <port>"); | ||||||||||||||
if (argc < 2) { | ||||||||||||||
} | ||||||||||||||
/* Now do options processing, get portname */ | ||||||||||||||
while ((c = poptGetNextOpt(optCon)) >= 0) { | ||||||||||||||
switch (c) { | ||||||||||||||
case 'c': | ||||||||||||||
buf[i++] = 'c'; | ||||||||||||||
break; | ||||||||||||||
case 'h': | ||||||||||||||
buf[i++] = 'h'; | ||||||||||||||
break; | ||||||||||||||
case 's': | ||||||||||||||
buf[i++] = 's'; | ||||||||||||||
break; | ||||||||||||||
case 'n': | ||||||||||||||
buf[i++] = 'n'; | ||||||||||||||
break; | ||||||||||||||
} | ||||||||||||||
} | ||||||||||||||
portname = poptGetArg(optCon); | ||||||||||||||
if((portname == NULL) || !(poptPeekArg(optCon) == NULL)) | ||||||||||||||
usage(optCon, 1, "Specify a single port", ".e.g., /dev/cua0"); | ||||||||||||||
if (c < -1) { | ||||||||||||||
/* an error occurred during option processing */ | ||||||||||||||
fprintf(stderr, "%s: %s\n", | ||||||||||||||
poptBadOption(optCon, POPT_BADOPTION_NOALIAS), | ||||||||||||||
poptStrerror(c)); | ||||||||||||||
return 1; | ||||||||||||||
} | ||||||||||||||
/* Print out options, portname chosen */ | ||||||||||||||
printf("Options chosen: "); | ||||||||||||||
for(j = 0; j < i ; j++) | ||||||||||||||
printf("-%c ", buf[j]); | ||||||||||||||
if(raw) printf("-r "); | ||||||||||||||
if(speed) printf("-b %d ", speed); | ||||||||||||||
printf("\nPortname chosen: %s\n", portname); | ||||||||||||||
poptFreeContext(optCon); | ||||||||||||||
exit(0); | ||||||||||||||
} | ||||||||||||||
RPM, a popular Linux package management program, makes heavy use | ||||||||||||||
of popt's features. Many of its command-line arguments are implemented | ||||||||||||||
through popt aliases, which makes RPM an excellent example of how to | ||||||||||||||
take advantage of the popt library. For more information on RPM, see | ||||||||||||||
http://www.rpm.org. The popt source code distribution includes test | ||||||||||||||
program(s) which use all of the features of the popt libraries in | ||||||||||||||
various ways. If a feature isn't working for you, the popt test code | ||||||||||||||
is the first place to look. | ||||||||||||||
None presently known. | ||||||||||||||
Erik W. Troan <ewt@redhat.com> | ||||||||||||||
This man page is derived in part from | ||||||||||||||
by Michael K. Johnson and Erik W. Troan, Copyright (c) 1998 by Addison | ||||||||||||||
Wesley Longman, Inc., and included in the popt documentation with the | ||||||||||||||
permission of the Publisher and the appreciation of the Authors. | ||||||||||||||
Thanks to Robert Lynch for his extensive work on this man page. | ||||||||||||||
Erik W. Troan (Addison-Wesley, 1998; ISBN 0-201-30821-5), Chapter 24. | ||||||||||||||
chapter. It can be found in the source archive for popt available at: | ||||||||||||||
ftp://ftp.redhat.com/pub/redhat/code/popt | ||||||||||||||