xref: /plan9/sys/src/ape/lib/bsd/getopt.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include	<stdlib.h>
2*219b2ee8SDavid du Colombier #include	<string.h>
3*219b2ee8SDavid du Colombier #include	<stdio.h>
4*219b2ee8SDavid du Colombier #define ERR(str, chr)       if(opterr){fprintf(stderr, "%s%s%c\n", argv[0], str, chr);}
5*219b2ee8SDavid du Colombier int     opterr = 1;
6*219b2ee8SDavid du Colombier int     optind = 1;
7*219b2ee8SDavid du Colombier int	optopt;
8*219b2ee8SDavid du Colombier char    *optarg;
9*219b2ee8SDavid du Colombier 
10*219b2ee8SDavid du Colombier int
11*219b2ee8SDavid du Colombier getopt (int argc, char **argv, char *opts)
12*219b2ee8SDavid du Colombier {
13*219b2ee8SDavid du Colombier 	static int sp = 1;
14*219b2ee8SDavid du Colombier 	register c;
15*219b2ee8SDavid du Colombier 	register char *cp;
16*219b2ee8SDavid du Colombier 
17*219b2ee8SDavid du Colombier 	if (sp == 1)
18*219b2ee8SDavid du Colombier 		if (optind >= argc ||
19*219b2ee8SDavid du Colombier 		   argv[optind][0] != '-' || argv[optind][1] == '\0')
20*219b2ee8SDavid du Colombier 			return EOF;
21*219b2ee8SDavid du Colombier 		else if (strcmp(argv[optind], "--") == NULL) {
22*219b2ee8SDavid du Colombier 			optind++;
23*219b2ee8SDavid du Colombier 			return EOF;
24*219b2ee8SDavid du Colombier 		}
25*219b2ee8SDavid du Colombier 	optopt = c = argv[optind][sp];
26*219b2ee8SDavid du Colombier 	if (c == ':' || (cp=strchr(opts, c)) == NULL) {
27*219b2ee8SDavid du Colombier 		ERR (": illegal option -- ", c);
28*219b2ee8SDavid du Colombier 		if (argv[optind][++sp] == '\0') {
29*219b2ee8SDavid du Colombier 			optind++;
30*219b2ee8SDavid du Colombier 			sp = 1;
31*219b2ee8SDavid du Colombier 		}
32*219b2ee8SDavid du Colombier 		return '?';
33*219b2ee8SDavid du Colombier 	}
34*219b2ee8SDavid du Colombier 	if (*++cp == ':') {
35*219b2ee8SDavid du Colombier 		if (argv[optind][sp+1] != '\0')
36*219b2ee8SDavid du Colombier 			optarg = &argv[optind++][sp+1];
37*219b2ee8SDavid du Colombier 		else if (++optind >= argc) {
38*219b2ee8SDavid du Colombier 			ERR (": option requires an argument -- ", c);
39*219b2ee8SDavid du Colombier 			sp = 1;
40*219b2ee8SDavid du Colombier 			return '?';
41*219b2ee8SDavid du Colombier 		} else
42*219b2ee8SDavid du Colombier 			optarg = argv[optind++];
43*219b2ee8SDavid du Colombier 		sp = 1;
44*219b2ee8SDavid du Colombier 	} else {
45*219b2ee8SDavid du Colombier 		if (argv[optind][++sp] == '\0') {
46*219b2ee8SDavid du Colombier 			sp = 1;
47*219b2ee8SDavid du Colombier 			optind++;
48*219b2ee8SDavid du Colombier 		}
49*219b2ee8SDavid du Colombier 		optarg = NULL;
50*219b2ee8SDavid du Colombier 	}
51*219b2ee8SDavid du Colombier 	return c;
52*219b2ee8SDavid du Colombier }
53