xref: /original-bsd/usr.bin/uucp/port/getopt.c (revision e59fb703)
1 #ifndef lint
2 static char sccsid[] = "@(#)getopt.c	5.1 (Berkeley) 07/02/83";
3 #endif
4 
5 #include	<stdio.h>
6 #define ERR(s, c)	if(opterr){\
7 	fputs(argv[0], stderr);\
8 	fputs(s, stderr);\
9 	fputc(c, stderr);\
10 	fputc('\n', stderr);} else
11 
12 int	opterr = 1;
13 int	optind = 1;
14 int	optopt;
15 char	*optarg;
16 
17 extern char *index();
18 
19 int
20 getopt (argc, argv, opts)
21 char **argv, *opts;
22 {
23 	static int sp = 1;
24 	register c;
25 	register char *cp;
26 
27 	if (sp == 1)
28 		if (optind >= argc ||
29 		   argv[optind][0] != '-' || argv[optind][1] == '\0')
30 			return EOF;
31 		else if (strcmp(argv[optind], "--") == NULL) {
32 			optind++;
33 			return EOF;
34 		}
35 	optopt = c = argv[optind][sp];
36 	if (c == ':' || (cp=index(opts, c)) == NULL) {
37 		ERR (": illegal option -- ", c);
38 		if (argv[optind][++sp] == '\0') {
39 			optind++;
40 			sp = 1;
41 		}
42 		return '?';
43 	}
44 	if (*++cp == ':') {
45 		if (argv[optind][sp+1] != '\0')
46 			optarg = &argv[optind++][sp+1];
47 		else if (++optind >= argc) {
48 			ERR (": option requires an argument -- ", c);
49 			sp = 1;
50 			return '?';
51 		} else
52 			optarg = argv[optind++];
53 		sp = 1;
54 	}
55 	else {
56 		if (argv[optind][++sp] == '\0') {
57 			sp = 1;
58 			optind++;
59 		}
60 		optarg = NULL;
61 	}
62 	return c;
63 }
64