1 /*
2  * Copyright (c) 1987 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistributions and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *     This product includes software developed by the University of
16  *     California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33 
34 #if defined(LIBC_SCCS) && !defined(lint)
35 static char     sccsid[] = "@(#)getopt.c   4.13 (Berkeley) 2/23/91";
36 #endif /* LIBC_SCCS and not lint */
37 
38 #include <string.h>
39 #include <stdio.h>
40 
41 /* When redefining a system routine, we have to make sure to exactly match
42    any prototypes.  Linux prototypes getopt() with const arguments; other
43    systems probably do too.  Hopefully __STDC__ is close enough; if not,
44    add system-specific preprocessor changes. */
45 
46 #if __STDC__
47 #define CONST const
48 #else
49 #define CONST
50 #endif
51 
52 /*
53  * get option letter from argument vector
54  */
55 int             myopterr = 1,	/* if error message should be printed */
56                 myoptind = 1,	/* index into parent argv vector */
57                 myoptopt;	/* character checked for validity */
58 char           *myoptarg;	/* argument associated with option */
59 
60 #define        BADCH   (int)'?'
61 #define        EMSG    ""
62 
63 int
mygetopt(nargc,nargv,ostr)64 mygetopt (nargc, nargv, ostr)
65      int             nargc;
66      char          **nargv;
67      char           *ostr;
68 {
69   static char    *place = EMSG;	/* option letter processing */
70   register char  *oli;		/* option letter list index */
71   char           *p;
72 
73   if (!*place)
74     {				/* update scanning pointer */
75       if (myoptind >= nargc || *(place = nargv[myoptind]) != '-')
76 	{
77 	  place = EMSG;
78 	  return (EOF);
79 	}
80       if (place[1] && *++place == '-')
81 	{			/* found "--" */
82 	  ++myoptind;
83 	  place = EMSG;
84 	  return (EOF);
85 	}
86     }				/* option letter okay? */
87   if ((myoptopt = (int) *place++) == (int) ':' ||
88       !(oli = strchr (ostr, myoptopt)))
89     {
90       /*
91        * if the user didn't specify '-' as an option,
92        * assume it means EOF.
93        */
94       if (myoptopt == (int) '-')
95 	return (EOF);
96       if (!*place)
97 	++myoptind;
98       if (myopterr)
99 	{
100 	  if (!(p = strrchr (*nargv, '/')))
101 	    p = *nargv;
102 	  else
103 	    ++p;
104 	  (void) fprintf (stderr, "%s: illegal option -- %c\n",
105 			  p, myoptopt);
106 	}
107       return (BADCH);
108     }
109   if (*++oli != ':')
110     {				/* don't need argument */
111       myoptarg = NULL;
112       if (!*place)
113 	++myoptind;
114     }
115   else
116     {				/* need an argument */
117       if (*place)		/* no white space */
118 	myoptarg = place;
119       else if (nargc <= ++myoptind)
120 	{			/* no arg */
121 	  place = EMSG;
122 	  if (!(p = strrchr (*nargv, '/')))
123 	    p = *nargv;
124 	  else
125 	    ++p;
126 	  if (myopterr)
127 	    (void) fprintf (stderr,
128 			    "%s: option requires an argument -- %c\n",
129 			    p, myoptopt);
130 	  return (BADCH);
131 	}
132       else			/* white space */
133 	myoptarg = nargv[myoptind];
134       place = EMSG;
135       ++myoptind;
136     }
137   return (myoptopt);		/* dump back option letter */
138 }
139