home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume2 / getopt < prev    next >
Internet Message Format  |  1991-08-07  |  6KB

  1. From: mpatnode@polyslo.UUCP (Mike Patnode)
  2. Newsgroups: comp.sources.misc
  3. Subject: v02i090: getopt.c
  4. Message-ID: <8804082001.AA21103@polyslo.UUCP>
  5. Date: 8 Apr 88 20:01:24 GMT
  6. Approved: allbery@ncoast.UUCP
  7.  
  8. comp.sources.misc: Volume 2, Issue 90
  9. Submitted-By: "Mike Patnode" <mpatnode@polyslo.UUCP>
  10. Archive-Name: getopt
  11.  
  12. After my last posting I recieved so many requests for this that I
  13. decided this was just as well.  I know it's been posted before.
  14.  
  15. I also found a man page.
  16. ----------------------------- paste here --------------------------------
  17. echo x - getopt.c
  18. sed 's/^X//' >getopt.c <<'*-*-END-of-getopt.c-*-*'
  19. X/*
  20. X**    @(#)getopt.c    2.2 (smail) 1/26/87
  21. X*/
  22. X
  23. X/*
  24. X * Here's something you've all been waiting for:  the AT&T public domain
  25. X * source for getopt(3).  It is the code which was given out at the 1985
  26. X * UNIFORUM conference in Dallas.  I obtained it by electronic mail
  27. X * directly from AT&T.  The people there assure me that it is indeed
  28. X * in the public domain.
  29. X * 
  30. X * There is no manual page.  That is because the one they gave out at
  31. X * UNIFORUM was slightly different from the current System V Release 2
  32. X * manual page.  The difference apparently involved a note about the
  33. X * famous rules 5 and 6, recommending using white space between an option
  34. X * and its first argument, and not grouping options that have arguments.
  35. X * Getopt itself is currently lenient about both of these things White
  36. X * space is allowed, but not mandatory, and the last option in a group can
  37. X * have an argument.  That particular version of the man page evidently
  38. X * has no official existence, and my source at AT&T did not send a copy.
  39. X * The current SVR2 man page reflects the actual behavor of this getopt.
  40. X * However, I am not about to post a copy of anything licensed by AT&T.
  41. X */
  42. X
  43. X#define BSD
  44. X#ifdef BSD
  45. X#include <strings.h>
  46. X#else
  47. X#include <string.h>
  48. X#endif
  49. X
  50. X/*LINTLIBRARY*/
  51. X#define NULL    0
  52. X#define EOF    (-1)
  53. X#define ERR(s, c)    if(opterr){\
  54. X    extern int write();\
  55. X    char errbuf[2];\
  56. X    errbuf[0] = c; errbuf[1] = '\n';\
  57. X    (void) write(2, argv[0], (unsigned)strlen(argv[0]));\
  58. X    (void) write(2, s, (unsigned)strlen(s));\
  59. X    (void) write(2, errbuf, 2);}
  60. X
  61. Xextern char *index();
  62. X
  63. Xint    opterr = 1;
  64. Xint    optind = 1;
  65. Xint    optopt;
  66. Xchar    *optarg;
  67. X
  68. Xint
  69. Xgetopt(argc, argv, opts)
  70. Xint    argc;
  71. Xchar    **argv, *opts;
  72. X{
  73. X    static int sp = 1;
  74. X    register int c;
  75. X    register char *cp;
  76. X
  77. X    if(sp == 1)
  78. X        if(optind >= argc ||
  79. X           argv[optind][0] != '-' || argv[optind][1] == '\0')
  80. X            return(EOF);
  81. X        else if(strcmp(argv[optind], "--") == NULL) {
  82. X            optind++;
  83. X            return(EOF);
  84. X        }
  85. X    optopt = c = argv[optind][sp];
  86. X    if(c == ':' || (cp=index(opts, c)) == NULL) {
  87. X        ERR(": illegal option -- ", c);
  88. X        if(argv[optind][++sp] == '\0') {
  89. X            optind++;
  90. X            sp = 1;
  91. X        }
  92. X        return('?');
  93. X    }
  94. X    if(*++cp == ':') {
  95. X        if(argv[optind][sp+1] != '\0')
  96. X            optarg = &argv[optind++][sp+1];
  97. X        else if(++optind >= argc) {
  98. X            ERR(": option requires an argument -- ", c);
  99. X            sp = 1;
  100. X            return('?');
  101. X        } else
  102. X            optarg = argv[optind++];
  103. X        sp = 1;
  104. X    } else {
  105. X        if(argv[optind][++sp] == '\0') {
  106. X            sp = 1;
  107. X            optind++;
  108. X        }
  109. X        optarg = NULL;
  110. X    }
  111. X    return(c);
  112. X}
  113. *-*-END-of-getopt.c-*-*
  114. echo x - getopt.l3
  115. sed 's/^X//' >getopt.l3 <<'*-*-END-of-getopt.l3-*-*'
  116. X.TH GETOPT 3 local
  117. X.DA 25 March 1982
  118. X.SH NAME
  119. Xgetopt \- get option letter from argv
  120. X.SH SYNOPSIS
  121. X.ft B
  122. Xint getopt(argc, argv, optstring)
  123. X.br
  124. Xint argc;
  125. X.br
  126. Xchar **argv;
  127. X.br
  128. Xchar *optstring;
  129. X.sp
  130. Xextern char *optarg;
  131. X.br
  132. Xextern int optind;
  133. X.ft
  134. X.SH DESCRIPTION
  135. X.I Getopt
  136. Xreturns the next option letter in
  137. X.I argv
  138. Xthat matches a letter in
  139. X.IR optstring .
  140. X.I Optstring
  141. Xis a string of recognized option letters;
  142. Xif a letter is followed by a colon, the option is expected to have
  143. Xan argument that may or may not be separated from it by white space.
  144. X.I Optarg
  145. Xis set to point to the start of the option argument on return from
  146. X.IR getopt .
  147. X.PP
  148. X.I Getopt
  149. Xplaces in
  150. X.I optind
  151. Xthe
  152. X.I argv
  153. Xindex of the next argument to be processed.
  154. XBecause
  155. X.I optind
  156. Xis external, it is normally initialized to zero automatically
  157. Xbefore the first call to 
  158. X.IR getopt .
  159. X.PP
  160. XWhen all options have been processed (i.e., up to the first
  161. Xnon-option argument),
  162. X.I getopt
  163. Xreturns
  164. X.BR EOF .
  165. XThe special option
  166. X.B \-\-
  167. Xmay be used to delimit the end of the options;
  168. X.B EOF
  169. Xwill be returned, and
  170. X.B \-\-
  171. Xwill be skipped.
  172. X.SH SEE ALSO
  173. Xgetopt(1)
  174. X.SH DIAGNOSTICS
  175. X.I Getopt
  176. Xprints an error message on
  177. X.I stderr
  178. Xand returns a question mark
  179. X.RB ( ? )
  180. Xwhen it encounters an option letter not included in
  181. X.IR optstring .
  182. X.SH EXAMPLE
  183. XThe following code fragment shows how one might process the arguments
  184. Xfor a command that can take the mutually exclusive options
  185. X.B a
  186. Xand
  187. X.BR b ,
  188. Xand the options
  189. X.B f
  190. Xand
  191. X.BR o ,
  192. Xboth of which require arguments:
  193. X.PP
  194. X.RS
  195. X.nf
  196. Xmain(argc, argv)
  197. Xint argc;
  198. Xchar **argv;
  199. X{
  200. X    int c;
  201. X    extern int optind;
  202. X    extern char *optarg;
  203. X    \&.
  204. X    \&.
  205. X    \&.
  206. X    while ((c = getopt(argc, argv, "abf:o:")) != EOF)
  207. X        switch (c) {
  208. X        case 'a':
  209. X            if (bflg)
  210. X                errflg++;
  211. X            else
  212. X                aflg++;
  213. X            break;
  214. X        case 'b':
  215. X            if (aflg)
  216. X                errflg++;
  217. X            else
  218. X                bproc();
  219. X            break;
  220. X        case 'f':
  221. X            ifile = optarg;
  222. X            break;
  223. X        case 'o':
  224. X            ofile = optarg;
  225. X            break;
  226. X        case '?':
  227. X        default:
  228. X            errflg++;
  229. X            break;
  230. X        }
  231. X    if (errflg) {
  232. X        fprintf(stderr, "Usage: ...");
  233. X        exit(2);
  234. X    }
  235. X    for (; optind < argc; optind++) {
  236. X        \&.
  237. X        \&.
  238. X        \&.
  239. X    }
  240. X    \&.
  241. X    \&.
  242. X    \&.
  243. X}
  244. X.RE
  245. X.PP
  246. XA template similar to this can be found in
  247. X.IR /usr/pub/template.c .
  248. X.SH HISTORY
  249. XWritten by Henry Spencer, working from a Bell Labs manual page.
  250. XBehavior believed identical to the Bell version.
  251. X.SH BUGS
  252. XIt is not obvious how
  253. X`\-'
  254. Xstanding alone should be treated;  this version treats it as
  255. Xa non-option argument, which is not always right.
  256. X.PP
  257. XOption arguments are allowed to begin with `\-';
  258. Xthis is reasonable but reduces the amount of error checking possible.
  259. X.PP
  260. X.I Getopt
  261. Xis quite flexible but the obvious price must be paid:  there is much
  262. Xit could do that it doesn't, like
  263. Xchecking mutually exclusive options, checking type of
  264. Xoption arguments, etc.
  265. *-*-END-of-getopt.l3-*-*
  266. exit
  267. -- 
  268. Mike "Dodger" Patnode          | (n)   ..csustan!polyslo!mpatnode 
  269. Yitbos Innovations Inc.        | (s)   ..sdsu!polyslo!mpatnode 
  270. 244 California Blvd            |       mpatnode@polyslo.UUCP
  271. San Luis Obispo, Ca  92630     | (805) 541-2048 / 543-9818 / 756-2516
  272.