home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume3 / att_getopt < prev    next >
Internet Message Format  |  1986-11-30  |  4KB

  1. From: talcott!seismo!ut-sally!jsq (John Quarterman)
  2. Subject: public domain AT&T getopt(3)
  3. Newsgroups: mod.sources
  4. Organization: IEEE/P1003 Portable Operating System Environment Committee
  5. Approved: jpn@panda.UUCP
  6.  
  7. Mod.sources:  Volume 3, Issue 58
  8. Submitted by: seismo!ut-sally!jsq (John Quarterman, Moderator mod.std.unix)
  9.  
  10. [
  11.   There are two articles here, forwarded from mod.std.unix.  Also, the
  12.   getopt source code is NOT in shar format - you will have to hand
  13.   edit this file.       -   John P. Nelson,  moderator, mod.sources
  14. ]
  15.  
  16. ************************
  17.  
  18. Newsgroups: mod.std.unix
  19. Subject: public domain AT&T getopt source
  20. Date: 3 Nov 85 19:34:15 GMT
  21.  
  22. Here's something you've all been waiting for:  the AT&T public domain
  23. source for getopt(3).  It is the code which was given out at the 1985
  24. UNIFORUM conference in Dallas.  I obtained it by electronic mail
  25. directly from AT&T.  The people there assure me that it is indeed
  26. in the public domain.
  27.  
  28. There is no manual page.  That is because the one they gave out at
  29. UNIFORUM was slightly different from the current System V Release 2
  30. manual page.  The difference apparently involved a note about the
  31. famous rules 5 and 6, recommending using white space between an option
  32. and its first argument, and not grouping options that have arguments.
  33. Getopt itself is currently lenient about both of these things White
  34. space is allowed, but not mandatory, and the last option in a group can
  35. have an argument.  That particular version of the man page evidently
  36. has no official existence, and my source at AT&T did not send a copy.
  37. The current SVR2 man page reflects the actual behavor of this getopt.
  38. However, I am not about to post a copy of anything licensed by AT&T.
  39.  
  40. I will submit this source to Berkeley as a bug fix.
  41.  
  42. I, personally, make no claims or guarantees of any kind about the
  43. following source.  I did compile it to get some confidence that
  44. it arrived whole, but beyond that you're on your own.
  45.  
  46.  
  47. /*LINTLIBRARY*/
  48. #define NULL    0
  49. #define EOF    (-1)
  50. #define ERR(s, c)    if(opterr){\
  51.     extern int strlen(), write();\
  52.     char errbuf[2];\
  53.     errbuf[0] = c; errbuf[1] = '\n';\
  54.     (void) write(2, argv[0], (unsigned)strlen(argv[0]));\
  55.     (void) write(2, s, (unsigned)strlen(s));\
  56.     (void) write(2, errbuf, 2);}
  57.  
  58. extern int strcmp();
  59. extern char *strchr();
  60.  
  61. int    opterr = 1;
  62. int    optind = 1;
  63. int    optopt;
  64. char    *optarg;
  65.  
  66. int
  67. getopt(argc, argv, opts)
  68. int    argc;
  69. char    **argv, *opts;
  70. {
  71.     static int sp = 1;
  72.     register int c;
  73.     register char *cp;
  74.  
  75.     if(sp == 1)
  76.         if(optind >= argc ||
  77.            argv[optind][0] != '-' || argv[optind][1] == '\0')
  78.             return(EOF);
  79.         else if(strcmp(argv[optind], "--") == NULL) {
  80.             optind++;
  81.             return(EOF);
  82.         }
  83.     optopt = c = argv[optind][sp];
  84.     if(c == ':' || (cp=strchr(opts, c)) == NULL) {
  85.         ERR(": illegal option -- ", c);
  86.         if(argv[optind][++sp] == '\0') {
  87.             optind++;
  88.             sp = 1;
  89.         }
  90.         return('?');
  91.     }
  92.     if(*++cp == ':') {
  93.         if(argv[optind][sp+1] != '\0')
  94.             optarg = &argv[optind++][sp+1];
  95.         else if(++optind >= argc) {
  96.             ERR(": option requires an argument -- ", c);
  97.             sp = 1;
  98.             return('?');
  99.         } else
  100.             optarg = argv[optind++];
  101.         sp = 1;
  102.     } else {
  103.         if(argv[optind][++sp] == '\0') {
  104.             sp = 1;
  105.             optind++;
  106.         }
  107.         optarg = NULL;
  108.     }
  109.     return(c);
  110. }
  111.  
  112. ************************
  113.  
  114. Newsgroups: mod.std.unix
  115. Subject: Re: public domain AT&T getopt source
  116. Date: 25 Nov 85 23:13:10 GMT
  117.  
  118. A couple of days after I posted the getopt source, I finally got
  119. the copy I had ordered from the AT&T toolchest.  They are identical,
  120. except that the one from the toolchest has the following prepended:
  121.  
  122. 1,14d0
  123. < /*
  124. <  *      Copyright (c) 1984, 1985 AT&T
  125. <  *      All Rights Reserved
  126. <  *      THIS IS UNPUBLISHED PROPRIETARY SOURCE 
  127. <  *      CODE OF AT&T.
  128. <  *      The copyright notice above does not 
  129. <  *      evidence any actual or intended
  130. <  *      publication of such source code.
  131. <  */
  132. < #ident    "@(#)getopt.c    1.9"
  133. < /*    3.0 SID #    1.2    */
  134.  
  135. AT&T appear to be of two minds about this, since the copy I got
  136. directly by mail from them did not have any such notice, and this is in
  137. fact the same code which *was* published at the Dallas Uniforum, and
  138. made public domain, to boot.  Since the copy I posted was not the
  139. toolchest one, and had no such notice, I guess the notice is irrelevant.
  140.  
  141. Now to send them a check for $1.80 for the toolchest transmission fee....
  142.  
  143.