home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume25 / trash / part01 / getopt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-22  |  937 b   |  76 lines

  1. extern int    strcmp();
  2. extern char    *strchr();
  3. extern int    strlen();
  4.  
  5. int    optind    = 1;
  6. int    optopt;
  7. char    *optarg;
  8.  
  9. int
  10. getopt(argc, argv, opts)
  11. int    argc;
  12. char    **argv;
  13. char    *opts;
  14. {
  15.     static int    sp    = 1;
  16.     register int    c;
  17.     register char    *cp;
  18.  
  19.     if (sp == 1)
  20.     {
  21.         if
  22.         (
  23.             optind >= argc
  24.             ||
  25.             argv[optind][0] != '-'
  26.             ||
  27.             argv[optind][1] == '\0'
  28.         )
  29.             return -1;
  30.  
  31.         if (strcmp(argv[optind], "--") == 0)
  32.         {
  33.             optind++;
  34.             return -1;
  35.         }
  36.     }
  37.  
  38.     c = argv[optind][sp];
  39.     optopt = c;
  40.  
  41.     if (c == ':' || (cp = strchr(opts, c)) == (char *)0)
  42.     {
  43.         if (argv[optind][++sp] == '\0')
  44.         {
  45.             optind++;
  46.             sp = 1;
  47.         }
  48.         return '?';
  49.     }
  50.  
  51.     if (*++cp == ':')
  52.     {
  53.         if (argv[optind][sp + 1] != '\0')
  54.             optarg = &argv[optind++][sp + 1];
  55.         else if (++optind >= argc)
  56.         {
  57.             sp = 1;
  58.             return '?';
  59.         }
  60.         else
  61.             optarg = argv[optind++];
  62.         sp = 1;
  63.     }
  64.     else
  65.     {
  66.         if (argv[optind][++sp] == '\0')
  67.         {
  68.             sp = 1;
  69.             optind++;
  70.         }
  71.         optarg = (char *)0;
  72.     }
  73.  
  74.     return c;
  75. }
  76.