xref: /plan9/sys/src/cmd/postscript/common/getopt.c (revision 14f51593fd82e19ba95969a8c07ff71131015979)
1219b2ee8SDavid du Colombier #ifndef _POSIX_SOURCE
2219b2ee8SDavid du Colombier #include <u.h>
3219b2ee8SDavid du Colombier #include <libc.h>
4*14f51593SDavid du Colombier #else
5*14f51593SDavid du Colombier #define _BSD_EXTENSION
6*14f51593SDavid du Colombier #include <stdlib.h>
7*14f51593SDavid du Colombier #include <unistd.h>
8*14f51593SDavid du Colombier #include <string.h>
9219b2ee8SDavid du Colombier #endif
10*14f51593SDavid du Colombier 
11219b2ee8SDavid du Colombier #include	<stdio.h>
12*14f51593SDavid du Colombier 
13219b2ee8SDavid du Colombier #define ERR(str, chr)       if(opterr){fprintf(stderr, "%s%s%c\n", argv[0], str, chr);}
14*14f51593SDavid du Colombier 
15219b2ee8SDavid du Colombier int     opterr = 1;
16219b2ee8SDavid du Colombier int     optind = 1;
17219b2ee8SDavid du Colombier int	optopt;
18219b2ee8SDavid du Colombier char    *optarg;
19219b2ee8SDavid du Colombier 
20219b2ee8SDavid du Colombier int
getopt(argc,argv,opts)21219b2ee8SDavid du Colombier getopt (argc, argv, opts)
22219b2ee8SDavid du Colombier char **argv, *opts;
23219b2ee8SDavid du Colombier {
24219b2ee8SDavid du Colombier 	static int sp = 1;
25219b2ee8SDavid du Colombier 	register c;
26219b2ee8SDavid du Colombier 	register char *cp;
27219b2ee8SDavid du Colombier 
28219b2ee8SDavid du Colombier 	if (sp == 1)
29219b2ee8SDavid du Colombier 		if (optind >= argc ||
30219b2ee8SDavid du Colombier 		   argv[optind][0] != '-' || argv[optind][1] == '\0')
31219b2ee8SDavid du Colombier 			return EOF;
327ad596ffSDavid du Colombier 		else if (strcmp(argv[optind], "--") == 0) {
33219b2ee8SDavid du Colombier 			optind++;
34219b2ee8SDavid du Colombier 			return EOF;
35219b2ee8SDavid du Colombier 		}
36219b2ee8SDavid du Colombier 	optopt = c = argv[optind][sp];
37219b2ee8SDavid du Colombier 	if (c == ':' || (cp=strchr(opts, c)) == NULL) {
38219b2ee8SDavid du Colombier 		ERR (": illegal option -- ", c);
39219b2ee8SDavid du Colombier 		if (argv[optind][++sp] == '\0') {
40219b2ee8SDavid du Colombier 			optind++;
41219b2ee8SDavid du Colombier 			sp = 1;
42219b2ee8SDavid du Colombier 		}
43219b2ee8SDavid du Colombier 		return '?';
44219b2ee8SDavid du Colombier 	}
45219b2ee8SDavid du Colombier 	if (*++cp == ':') {
46219b2ee8SDavid du Colombier 		if (argv[optind][sp+1] != '\0')
47219b2ee8SDavid du Colombier 			optarg = &argv[optind++][sp+1];
48219b2ee8SDavid du Colombier 		else if (++optind >= argc) {
49219b2ee8SDavid du Colombier 			ERR (": option requires an argument -- ", c);
50219b2ee8SDavid du Colombier 			sp = 1;
51219b2ee8SDavid du Colombier 			return '?';
52219b2ee8SDavid du Colombier 		} else
53219b2ee8SDavid du Colombier 			optarg = argv[optind++];
54219b2ee8SDavid du Colombier 		sp = 1;
55219b2ee8SDavid du Colombier 	} else {
56219b2ee8SDavid du Colombier 		if (argv[optind][++sp] == '\0') {
57219b2ee8SDavid du Colombier 			sp = 1;
58219b2ee8SDavid du Colombier 			optind++;
59219b2ee8SDavid du Colombier 		}
60219b2ee8SDavid du Colombier 		optarg = NULL;
61219b2ee8SDavid du Colombier 	}
62219b2ee8SDavid du Colombier 	return c;
63219b2ee8SDavid du Colombier }
64