1 /* this is a public domain version of getopt */
2 /* FTP Site: ftp.uu.net/pub/OS/unix/bsd-sources/lib/librpc/etc/getopt.c */
3 
4 #include <stdio.h>
5 #include <string.h>
6 
7 #define MYNULL 0
8 #define ERR(s, c)	if(opterr){\
9 	extern size_t strlen();\
10 	extern int write();\
11 	char errbuf[2];\
12 	errbuf[0] = c; errbuf[1] = '\n';\
13 	(void) write(2, argv[0], strlen(argv[0]));\
14 	(void) write(2, s, strlen(s));\
15 	(void) write(2, errbuf, 2);}
16 
17 int	opterr = 1;
18 int	optind = 1;
19 int	optopt;
20 char	*optarg;
21 
22 int
getopt(argc,argv,opts)23 getopt(argc, argv, opts)
24 int	argc;
25 char	**argv, *opts;
26 {
27 	static int sp = 1;
28 	register int c;
29 	register char *cp;
30 
31 	if(sp == 1)
32 		if(optind >= argc ||
33 		   argv[optind][0] != '-' || argv[optind][1] == '\0')
34 			return(EOF);
35 		else if(strcmp(argv[optind], "--") == MYNULL) {
36 			optind++;
37 			return(EOF);
38 		}
39 	optopt = c = argv[optind][sp];
40 	if(c == ':' || (cp=strchr(opts, c)) == NULL) {
41 		ERR(": unknown option, -", c);
42 		if(argv[optind][++sp] == '\0') {
43 			optind++;
44 			sp = 1;
45 		}
46 		return('?');
47 	}
48 	if(*++cp == ':') {
49 		if(argv[optind][sp+1] != '\0')
50 			optarg = &argv[optind++][sp+1];
51 		else if(++optind >= argc) {
52 			ERR(": argument missing for -", c);
53 			sp = 1;
54 			return('?');
55 		} else
56 			optarg = argv[optind++];
57 		sp = 1;
58 	} else {
59 		if(argv[optind][++sp] == '\0') {
60 			sp = 1;
61 			optind++;
62 		}
63 		optarg = NULL;
64 	}
65 	return(c);
66 }
67