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