IMPORT_C int | getopt_long | ( | int | , |
char *const * | , | |||
const char * | , | |||
const struct option * | , | |||
int * | ||||
) |
The getopt_long function is similar to getopt but it accepts options in two forms: words and characters. The getopt_long function provides a superset of the functionality of getopt . The getopt_long function can be used in two ways. In the first way, every long option understood by the program has a corresponding short option, and the option structure is only used to translate from long options to short options. When used in this fashion, getopt_long behaves identically to getopt . This is a good way to add long option processing to an existing program with the minimum of rewriting.
In the second mechanism, a long option sets a flag in the option structure passed, or will store a pointer to the command line argument in the option structure passed to it for options that take arguments. Additionally, the long option's argument may be specified as a single argument with an equal sign, e.g.,
myprogram --myoption=somevalue
The structure is: struct option { char *name; int has_arg; int *flag; int val; };The name field should contain the option name without the leading double dash.
The has_arg field should be one of:
no argument no argument to the option is expect required_argument an argument to the option is required optional_argument an argument to the option may be presented.
If flag is not NULL, then the integer pointed to by it will be set to the value in the val field. If the flag field is NULL, then the val field will be returned. Setting flag to NULL and setting val to the corresponding short option will make this function act just like getopt .
If the longindex field is not NULL, then the integer pointed to by it will be set to the index of the long option relative to longopts.
The last element of the longopts array has to be filled with zeroes.
#include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <getopt.h> #include <errno.h> int main() { int bflag, ch, fd; int daggerset; int argc = 3; char *argv[] = { "getopt", "--daggerset","hi" }; struct option longopts[] = { { "buffy", no_argument, NULL, 'b' }, { "fluoride", required_argument, NULL, 'f' }, { "daggerset", no_argument, &daggerset;, 1 }, { NULL, 0, NULL, 0 } }; bflag = 0; while ((ch = getopt_long(argc, argv, "bf:", longopts, NULL)) != -1) { switch (ch) { case 'b': printf("option is \"buffy\" "); bflag = 1; break; case 'f': printf("option is \"fluoride\" "); if ((fd = open(optarg, O_RDONLY, 0)) == -1) printf("unable to open %s", optarg); break; case 0: if (daggerset) { fprintf(stderr,"Buffy will use her dagger to apply fluoride to dracula's teeth "); } break; default: printf("unknown option "); }//end of switch }//end of while return 0; }Output
Buffy will use her dagger to apply fluoride to dracula's teeth
See also: getopt()
IMPORT_C int | getopt | ( | int | , |
char * | const, | |||
const char * | ||||
) |
The getopt function incrementally parses a command line argument list argv and returns the next known option character. An option character is known if it has been specified in the string of accepted option characters, optstring.
The option string optstring may contain the following elements: individual characters and characters followed by a colon to indicate an option argument is to follow. For example, an option string x recognizes an option "- x ", and an option string x: recognizes an option and argument "- x argument. " It does not matter to getopt if a following argument has leading white space.
On return from getopt, optarg points to an option argument, if it is anticipated, and the variable optind contains the index to the next argv argument for a subsequent call to getopt. The variable optopt saves the last known option character returned by getopt.
The variables opterr and optind are both initialized to 1. The optind variable may be set to another value before a set of calls to getopt in order to skip over more or less argv entries.
In order to use getopt to evaluate multiple sets of arguments, or to evaluate a single set of arguments multiple times, the variable optreset must be set to 1 before the second and each additional set of calls to getopt, and the variable optind must be reinitialized.
The getopt function returns -1 when the argument list is exhausted. The interpretation of options in the argument list may be cancelled by the option ' -- ' (double dash) which causes getopt to signal the end of argument processing and return -1. When all options have been processed (i.e., up to the first non-option argument), getopt returns -1.
#include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <errno.h> #include <string.h> int main() { int argc = 3; char *argv[] = { "getopt","-f","hi" }; int bflag, ch, fd; bflag = 0; while ((ch = getopt(argc, argv, "bf:")) != -1) { switch (ch) { case 'b': bflag = 1; printf("option is 'b' \n"); break; case 'f': printf("option is 'f' \n"); if ((fd = open(optarg, O_RDONLY, 0)) != 0) { (void)fprintf(stderr, "myname: %s: %s\n", optarg, strerror(errno)); } break; case '?': printf("missing option!"); default: printf("unknown option!"); } } argc -= optind; return 0; }Output
option is 'f' myname: hi: No such file or directoryDiagnostics: If the getopt function encounters a character not found in the string optstring or detects a missing option argument it writes an error message to the stderr and returns ' ?. ' Setting opterr to a zero will disable these error messages. If optstring has a leading ' : ' then a missing option argument causes a ' : ' to be returned in addition to suppressing any error messages. Option arguments are allowed to begin with "-"; this is reasonable but reduces the amount of error checking possible.
See also: getopt_long()
Bugs:
int ch; long length; char *p, *ep; while ((ch = getopt(argc, argv, "0123456789")) != -1) switch (ch) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: p = argv[optind - 1]; if (p[0] == - Am]Am] p[1] == ch Am]Am] !p[2]) { length = ch - 0; ep = ""; } else if (argv[optind] Am]Am] argv[optind][1] == ch) { length = strtol((p = argv[optind] + 1), Am]ep, 10); optind++; optreset = 1; } else usage(); if (*ep != \0) errx(EX_USAGE, "illegal number -- %s", p); break; }
The getopt function incrementally parses a command line argument list argv and returns the next known option character. An option character is known if it has been specified in the string of accepted option characters, optstring.
The option string optstring may contain the following elements: individual characters, and characters followed by a colon to indicate an option argument is to follow. For example, an option string x recognizes an option "-x", and an option string x: recognizes an option and argument "-x argument." It does not matter to getopt if a following argument has leading white space.
On return from getopt, optarg points to an option argument, if it is anticipated, and the variable optind contains the index to the next argv argument for a subsequent call to getopt. The variable optopt saves the last known option character returned by getopt.
The variables opterr and optind are both initialized to 1. The optind variable may be set to another value before a set of calls to getopt in order to skip over more or less argv entries.
In order to use getopt to evaluate multiple sets of arguments, or to evaluate a single set of arguments multiple times, the variable optreset must be set to 1 before the second and each additional set of calls to getopt, and the variable optind must be reinitialized.
The getopt function returns -1 when the argument list is exhausted. The interpretation of options in the argument list may be cancelled by the option -- (double dash) which causes getopt to signal the end of argument processing and return -1. When all options have been processed (i.e., up to the first non-option argument), getopt returns -1.
#include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <errno.h> #include <string.h> int main() { int argc = 3; char *argv[] = { "getopt","-f","hi" }; int bflag, ch, fd; bflag = 0; while ((ch = getopt(argc, argv, "bf:")) != -1) { switch (ch) { case 'b': bflag = 1; printf("option is 'b' \n"); break; case 'f': printf("option is 'f' \n"); if ((fd = open(optarg, O_RDONLY, 0)) != 0) { (void)fprintf(stderr, "myname: %s: %s\n", optarg, strerror(errno)); } break; case '?': printf("missing option!"); default: printf("unknown option!"); } } argc -= optind; return 0; }Output
option is f myname: hi: No such file or directory
See also: getopt_long()
Bugs:
The getopt function was once specified to return EOF instead of -1. This was changed by -p1003.2-92 to decouple getopt from #include <stdio.h>
A single dash "-" may be specified as a character in optstring, however it should never have an argument associated with it. This allows getopt to be used with programs that expect "-" as an option flag. This practice is wrong, and should not be used in any current development. It is provided for backward compatibility only. Care should be taken not to use - as the first character in optstring to avoid a semantic conflict with GNU getopt, which assigns different meaning to an optstring that begins with a -. By default, a single dash causes getopt to return -1.
It is also possible to handle digits as option letters. This allows getopt to be used with programs that expect a number ("-3") as an option. This practice is wrong, and should not be used in any current development. It is provided for backward compatibility only. The following code fragment works in most cases.
int ch; long length; char *p, *ep; while ((ch = getopt(argc, argv, "0123456789")) != -1) switch (ch) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: p = argv[optind - 1]; if (p[0] == - Am]Am] p[1] == ch Am]Am] !p[2]) { length = ch - 0; ep = ""; } else if (argv[optind] Am]Am] argv[optind][1] == ch) { length = strtol((p = argv[optind] + 1), Am]ep, 10); optind++; optreset = 1; } else usage(); if (*ep != \0) errx(EX_USAGE, "illegal number -- %s", p); break; }