text: #include <stdbool.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  
  int
  getopt_short_main(int argc, char *argv[])
  {
    int opt;
    int yield = 0;
    bool multi = false;
    unsigned long framerate = 10;
  
    while ((opt = getopt(argc, argv, "myf:")) != -1) {
      switch (opt) {
        case 'y':
          yield = 1;
          break;
        case 'm':
          multi = true;
          break;
        case 'f':
          framerate = strtoul(optarg, 0, 0);
          break;
        default: /* '?' */
          fprintf(stderr, "Usage: %s [-f framerate] [-m] [-y] etc\n", argv[0]);
          exit(EXIT_FAILURE);
          break;
      }
    }
  
    printf("yield=%d, multi=%d, framerate=%lu\n", yield, multi, framerate);
    printf("Final option index %d\n", optind);
  
    if (optind < argc) printf("name argument = %s\n", argv[optind]);
  
    exit(EXIT_SUCCESS);
  }
  
  #include <getopt.h>
  #include <stdio.h>  /* for printf */
  #include <stdlib.h> /* for exit */
  
  int
  getopt_long_main(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", 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}};
  
      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 %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);
  }
  
  int
  main(int argc, char **argv)
  {
    getopt_short_main(argc, argv);
  }
  