home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 551.lha / unsit_v1.5c / getopt.c < prev    next >
C/C++ Source or Header  |  1991-09-09  |  1KB  |  59 lines

  1. /*
  2.  * getopt - get option letter from argv
  3.  */
  4.  
  5. #include <stdio.h>
  6.  
  7. char *optarg; /* Global argument pointer. */
  8. int optind = 0; /* Global argv index. */
  9. static char *scan = NULL; /* Private scan pointer. */
  10. extern char *index();
  11.  
  12.  
  13. int getopt(int argc, char *argv[], char *optstring) {
  14.      register char c;
  15.      register char *place;
  16.  
  17.      optarg = NULL;
  18.  
  19.      if (scan == NULL || *scan == '\0') {
  20.           if (optind == 0)
  21.                optind++;
  22.  
  23.           if (optind >= argc || argv[optind][0] != '-' ||
  24.                                    argv[optind][1] == '\0')
  25.                return(EOF);
  26.  
  27.           if (strcmp(argv[optind], "--")==0) {
  28.                optind++;
  29.                return(EOF);
  30.           }
  31.  
  32.           scan = argv[optind]+1;
  33.           optind++;
  34.      }
  35.  
  36.      c = *scan++;
  37.      place = index(optstring, c);
  38.      if (place == NULL || c == ':') {
  39.           fprintf(stderr, "%s: unknown option -%c\n", argv[0], c);
  40.           return('?');
  41.      }
  42.  
  43.      place++;
  44.      if (*place == ':') {
  45.           if (*scan != '\0') {
  46.                optarg = scan;
  47.                scan = NULL;
  48.           } else if (optind < argc) {
  49.                optarg = argv[optind];
  50.                optind++;
  51.           } else {
  52.                fprintf(stderr, "%s: -%c argument missing\n", argv[0], c);
  53.                return('?');
  54.           }
  55.      }
  56.  
  57.      return(c);
  58. }
  59.