home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / auucp+-1.02 / fuucp_plus_src.lzh / sendmail / getopt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-21  |  2.1 KB  |  79 lines

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