Getopt Long Option Example (The GNU C Library)

#### 26.2.4 Example of Parsing Long Options with `getopt_long` ¶

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

    /* Flag set by ‘--verbose’. */
    static int verbose_flag;

    int
    main (int argc, char **argv)
    {
      int c;

      while (1)
        {
          static struct option long_options[] =
            {
              /* These options set a flag. */
              {"verbose", no_argument,       &verbose_flag, 1},
              {"brief",   no_argument,       &verbose_flag, 0},
              /* These options don’t set a flag.
                 We distinguish them by their indices. */
              {"add",     no_argument,       0, 'a'},
              {"append",  no_argument,       0, 'b'},
              {"delete",  required_argument, 0, 'd'},
              {"create",  required_argument, 0, 'c'},
              {"file",    required_argument, 0, 'f'},
              {0, 0, 0, 0}
            };
          /* getopt_long stores the option index here. */
          int option_index = 0;

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

          /* Detect the end of the options. */
          if (c == -1)
            break;

          switch (c)
            {
            case 0:
              /* If this option set a flag, do nothing else now. */
              if (long_options[option_index].flag != 0)
                break;
              printf ("option %s", long_options[option_index].name);
              if (optarg)
                printf (" with arg %s", optarg);
              printf ("\n");
              break;

            case 'a':
              puts ("option -a");
              break;

            case 'b':
              puts ("option -b");
              break;

            case 'c':
              printf ("option -c with value '%s'\n", optarg);
              break;

            case 'd':
              printf ("option -d with value '%s'\n", optarg);
              break;

            case 'f':
              printf ("option -f with value '%s'\n", optarg);
              break;

            case '?':
              /* getopt_long already printed an error message. */
              break;

            default:
              abort ();
            }
        }

      /* Instead of reporting ‘--verbose’
         and ‘--brief’ as they are encountered,
         we report the final status resulting from them. */
      if (verbose_flag)
        puts ("verbose flag is set");

      /* Print any remaining command line arguments (not options). */
      if (optind < argc)
        {
          printf ("non-option ARGV-elements: ");
          while (optind < argc)
            printf ("%s ", argv[optind++]);
          putchar ('\n');
        }

      exit (0);
    }