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