home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / tests / nfs / unix-tests / getopt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-01-10  |  3.3 KB  |  146 lines

  1. #ifndef lint
  2. static char NFSTestID[] = "@(#)getopt.c    1.1 Lachman ONC Test Suite source";
  3. #endif /* lint */
  4. /*
  5.  * Here's something you've all been waiting for:  the AT&T public domain
  6.  * source for getopt(3).  It is the code which was given out at the 1985
  7.  * UNIFORUM conference in Dallas.  I obtained it by electronic mail
  8.  * directly from AT&T.  The people there assure me that it is indeed
  9.  * in the public domain.
  10.  * 
  11.  * There is no manual page.  That is because the one they gave out at
  12.  * UNIFORUM was slightly different from the current System V Release 2
  13.  * manual page.  The difference apparently involved a note about the
  14.  * famous rules 5 and 6, recommending using white space between an option
  15.  * and its first argument, and not grouping options that have arguments.
  16.  * Getopt itself is currently lenient about both of these things White
  17.  * space is allowed, but not mandatory, and the last option in a group can
  18.  * have an argument.  That particular version of the man page evidently
  19.  * has no official existence, and my source at AT&T did not send a copy.
  20.  * The current SVR2 man page reflects the actual behavor of this getopt.
  21.  * However, I am not about to post a copy of anything licensed by AT&T.
  22.  */
  23.  
  24.  
  25. /*LINTLIBRARY*/
  26. #define NULL    0
  27. #define EOF    (-1)
  28. #define ERR(s, c)    if(opterr){\
  29.     extern int write();\
  30.     char errbuf[2];\
  31.     errbuf[0] = c; errbuf[1] = '\n';\
  32.     (void) write(2, argv[0], (unsigned)strlen(argv[0]));\
  33.     (void) write(2, s, (unsigned)strlen(s));\
  34.     (void) write(2, errbuf, 2);}
  35.  
  36. #ifdef SVR3
  37. extern char *strchr();
  38. #else
  39. extern char *index();
  40. #endif
  41.  
  42. int    opterr = 1;
  43. int    optind = 1;
  44. int    optopt;
  45. char    *optarg;
  46.  
  47. int
  48. getopt(argc, argv, opts)
  49. int    argc;
  50. char    **argv, *opts;
  51. {
  52.     static int sp = 1;
  53.     register int c;
  54.     register char *cp;
  55.  
  56.     if(sp == 1)
  57.         if(optind >= argc ||
  58.            argv[optind][0] != '-' || argv[optind][1] == '\0')
  59.             return(EOF);
  60.         else if(strcmp(argv[optind], "--") == NULL) {
  61.             optind++;
  62.             return(EOF);
  63.         }
  64.     optopt = c = argv[optind][sp];
  65. #ifdef SVR3
  66.     if(c == ':' || (cp=strchr(opts, c)) == NULL) {
  67. #else
  68.     if(c == ':' || (cp=index(opts, c)) == NULL) {
  69. #endif
  70.         ERR(": illegal option -- ", c);
  71.         if(argv[optind][++sp] == '\0') {
  72.             optind++;
  73.             sp = 1;
  74.         }
  75.         return('?');
  76.     }
  77.     if(*++cp == ':') {
  78.         if(argv[optind][sp+1] != '\0')
  79.             optarg = &argv[optind++][sp+1];
  80.         else if(++optind >= argc) {
  81.             ERR(": option requires an argument -- ", c);
  82.             sp = 1;
  83.             return('?');
  84.         } else
  85.             optarg = argv[optind++];
  86.         sp = 1;
  87.     } else {
  88.         if(argv[optind][++sp] == '\0') {
  89.             sp = 1;
  90.             optind++;
  91.         }
  92.         optarg = NULL;
  93.     }
  94.     return(c);
  95. }
  96.  
  97. #include    <stdio.h>
  98.  
  99. main(ac, av)
  100. char    **av;
  101. {
  102.     register int    i;
  103.     int    first = 1;
  104.     int    error = 0;
  105.     char    buf[BUFSIZ];
  106.     char    line[BUFSIZ];
  107.     extern char    *optarg;
  108.     extern int    optind;
  109.  
  110.     if (ac == 1) {
  111.         fprintf(stderr, "usage:  getopt legal-args $*\n");
  112.         exit(2);
  113.     }
  114.  
  115.     line[0] = '\0';
  116.     while ((i = getopt(ac - 1, &av[1], av[1])) != EOF) {
  117.         if (i == '?')
  118.             exit(2);
  119.  
  120.         if (first) {
  121.             first = 0;
  122.             sprintf(buf, "-%c", i & 0xff);
  123.         }
  124.         else
  125.             sprintf(buf, " -%c", i & 0xff);
  126.         strcat(line, buf);
  127.         if (optarg) {
  128.             sprintf(buf, " %s", optarg);
  129.             strcat(line, buf);
  130.         }
  131.     }
  132.  
  133.     if (first)
  134.         strcat(line, "--");
  135.     else
  136.         strcat(line, " --");
  137.  
  138.     optind++;
  139.     for (; optind < ac; optind++) {
  140.         sprintf(buf, " %s", av[optind]);
  141.         strcat(line, buf);
  142.     }
  143.     printf("%s\n", line);
  144.     exit(0);
  145. }
  146.