xref: /illumos-gate/usr/src/cmd/bnu/getopt.c (revision bb9b6b3f59b8820022416cea99b49c50fef6e391)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 #ident	"%Z%%M%	%I%	%E% SMI"	/* from SVR4 bnu:getopt.c 2.3 */
27 
28 #include "uucp.h"
29 
30 /*	@(#)getopt.c	1.2	*/
31 /*	3.0 SID #	1.2	*/
32 /*LINTLIBRARY*/
33 #define ERR(s, c)	if(opterr){\
34 	(void) fputs(argv[0], stderr);\
35 	(void) fputs(s, stderr);\
36 	(void) fputc(c, stderr);\
37 	(void) fputc('\n', stderr);}
38 
39 extern int strcmp();
40 extern char *strchr();
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 	if(c == ':' || (cp=strchr(opts, c)) == NULL) {
66 		ERR(": illegal option -- ", c);
67 		if(argv[optind][++sp] == '\0') {
68 			optind++;
69 			sp = 1;
70 		}
71 		return('?');
72 	}
73 	if(*++cp == ':') {
74 		if(argv[optind][sp+1] != '\0')
75 			optarg = &argv[optind++][sp+1];
76 		else if(++optind >= argc) {
77 			ERR(": option requires an argument -- ", c);
78 			sp = 1;
79 			return('?');
80 #ifndef NO_MINUS
81 		} else
82 			optarg = argv[optind++];
83 #else /* NO_MINUS */
84 		} else {
85 			optarg = argv[optind++];
86 			if (*optarg == '-') {
87 			    ERR(": option requires an argument -- ", c);
88 			    sp = 1;
89 			    return('?');
90 			}
91 		}
92 #endif /* NO_MINUS */
93 		sp = 1;
94 	} else {
95 		if(argv[optind][++sp] == '\0') {
96 			sp = 1;
97 			optind++;
98 		}
99 		optarg = NULL;
100 	}
101 	return(c);
102 }
103