The external variable optind is the index of the next array element of argv[] to be processed; it communicates from one call of getopt() to the next which element to process.
The getopt_long() function works like getopt() except that it also accepts long options, started out by two dashes. If these take values, it is either in the form --arg=value or --arg value. It takes the additional arguments longopts which is a pointer to the first element of an array of struct option declared in <getopt.h> as
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
The meaning of the different fields are:
The last element of the array has to be filled with zeroes.
The option_index points to the index of the long option relative to longopts.
int
main (argc, argv)
int argc;
char **argv;
{
int c;
int digit_optind = 0;
while (1)
{
int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] =
{
{"add", 1, 0, 0},
{"append", 0, 0, 0},
{"delete", 1, 0, 0},
{"verbose", 0, 0, 0},
{"create", 1, 0, 'c'},
{"file", 1, 0, 0},
{0, 0, 0, 0}
};
c = getopt_long (argc, argv, "abc:d:012",
long_options, &option_index);
if (c == -1)
break;
switch (c)
{
case 0:
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s", optarg);
printf ("n");
break;
case '0':
case '1':
case '2':
if (digit_optind != 0 && digit_optind != this_option_optind)
printf ("digits occur in two different argv-elements.n");
digit_optind = this_option_optind;
printf ("option %cn", c);
break;
case 'a':
printf ("option an");
break;
case 'b':
printf ("option bn");
break;
case 'c':
printf ("option c with value `%s'n", optarg);
break;
case 'd':
printf ("option d with value `%s'n", optarg);
break;
case '?':
break;
default:
printf ("?? getopt returned character code 0%o ??n", c);
}
}
if (optind < argc)
{
printf ("non-option ARGV-elements: ");
while (optind < argc)
printf ("%s ", argv[optind++]);
printf ("n");
}
exit (0);
}