#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    int c;
    int digit_optind;
    int this_option_optind;
    int option_index;
    static struct option long_options[] = {
        {"add",     required_argument,  0,   0 },
        {"append",  no_argument,        0,   0 },
        {"delete",  required_argument,  0,   0 },
        {"verbose", no_argument,        0,   0 },
        {"create",  required_argument,  0,  'c'},
        {"file",    required_argument,  0,   0 },
        {0,         0,                  0,   0 }
    };

    digit_optind = 0;
    while (1) {
        option_index = 0;
        this_option_optind = optind ? optind : 1;

        c = getopt_long(argc, argv, "abc:d:012",
                long_options, &option_index);

        if (c == -1)
            break;

        switch (c) {
        case 0:
            printf("options %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 %c\n", c);
            break;

        case 'a':
            printf("option a\n");
            break;

        case 'b':
            printf("option b\n");
            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(EXIT_SUCCESS);
}
