xref: /plan9/sys/src/ape/lib/bsd/getopt.c (revision f19e7b749ec99577072cd8e44030fe810f42c7ad)
1219b2ee8SDavid du Colombier #include	<stdlib.h>
2219b2ee8SDavid du Colombier #include	<string.h>
3219b2ee8SDavid du Colombier #include	<stdio.h>
4219b2ee8SDavid du Colombier #define ERR(str, chr)       if(opterr){fprintf(stderr, "%s%s%c\n", argv[0], str, chr);}
5219b2ee8SDavid du Colombier int     opterr = 1;
6219b2ee8SDavid du Colombier int     optind = 1;
7219b2ee8SDavid du Colombier int	optopt;
8219b2ee8SDavid du Colombier char    *optarg;
9219b2ee8SDavid du Colombier 
10219b2ee8SDavid du Colombier int
getopt(int argc,char ** argv,char * opts)11219b2ee8SDavid du Colombier getopt (int argc, char **argv, char *opts)
12219b2ee8SDavid du Colombier {
13219b2ee8SDavid du Colombier 	static int sp = 1;
14219b2ee8SDavid du Colombier 	register c;
15219b2ee8SDavid du Colombier 	register char *cp;
16219b2ee8SDavid du Colombier 
17219b2ee8SDavid du Colombier 	if (sp == 1)
18219b2ee8SDavid du Colombier 		if (optind >= argc ||
19219b2ee8SDavid du Colombier 		   argv[optind][0] != '-' || argv[optind][1] == '\0')
20219b2ee8SDavid du Colombier 			return EOF;
21*f19e7b74SDavid du Colombier 		else if (strcmp(argv[optind], "--") == 0) {
22219b2ee8SDavid du Colombier 			optind++;
23219b2ee8SDavid du Colombier 			return EOF;
24219b2ee8SDavid du Colombier 		}
25219b2ee8SDavid du Colombier 	optopt = c = argv[optind][sp];
26219b2ee8SDavid du Colombier 	if (c == ':' || (cp=strchr(opts, c)) == NULL) {
27219b2ee8SDavid du Colombier 		ERR (": illegal option -- ", c);
28219b2ee8SDavid du Colombier 		if (argv[optind][++sp] == '\0') {
29219b2ee8SDavid du Colombier 			optind++;
30219b2ee8SDavid du Colombier 			sp = 1;
31219b2ee8SDavid du Colombier 		}
32219b2ee8SDavid du Colombier 		return '?';
33219b2ee8SDavid du Colombier 	}
34219b2ee8SDavid du Colombier 	if (*++cp == ':') {
35219b2ee8SDavid du Colombier 		if (argv[optind][sp+1] != '\0')
36219b2ee8SDavid du Colombier 			optarg = &argv[optind++][sp+1];
37219b2ee8SDavid du Colombier 		else if (++optind >= argc) {
38219b2ee8SDavid du Colombier 			ERR (": option requires an argument -- ", c);
39219b2ee8SDavid du Colombier 			sp = 1;
40219b2ee8SDavid du Colombier 			return '?';
41219b2ee8SDavid du Colombier 		} else
42219b2ee8SDavid du Colombier 			optarg = argv[optind++];
43219b2ee8SDavid du Colombier 		sp = 1;
44219b2ee8SDavid du Colombier 	} else {
45219b2ee8SDavid du Colombier 		if (argv[optind][++sp] == '\0') {
46219b2ee8SDavid du Colombier 			sp = 1;
47219b2ee8SDavid du Colombier 			optind++;
48219b2ee8SDavid du Colombier 		}
49219b2ee8SDavid du Colombier 		optarg = NULL;
50219b2ee8SDavid du Colombier 	}
51219b2ee8SDavid du Colombier 	return c;
52219b2ee8SDavid du Colombier }
53