xref: /plan9/sys/src/cmd/aux/getflags.c (revision 2f205b966643394ed7387765c0319f1eefa8f95a)
184cb9422SDavid du Colombier #include <u.h>
284cb9422SDavid du Colombier #include <libc.h>
384cb9422SDavid du Colombier 
484cb9422SDavid du Colombier void
usage(void)584cb9422SDavid du Colombier usage(void)
684cb9422SDavid du Colombier {
784cb9422SDavid du Colombier 	print("status=usage\n");
884cb9422SDavid du Colombier 	exits(0);
984cb9422SDavid du Colombier }
1084cb9422SDavid du Colombier 
1184cb9422SDavid du Colombier char*
findarg(char * flags,Rune r)1284cb9422SDavid du Colombier findarg(char *flags, Rune r)
1384cb9422SDavid du Colombier {
1484cb9422SDavid du Colombier 	char *p;
1584cb9422SDavid du Colombier 	Rune rr;
1684cb9422SDavid du Colombier 
1784cb9422SDavid du Colombier 	for(p=flags; p!=(char*)1; p=strchr(p, ',')+1){
1884cb9422SDavid du Colombier 		chartorune(&rr, p);
1984cb9422SDavid du Colombier 		if(rr == r)
2084cb9422SDavid du Colombier 			return p;
2184cb9422SDavid du Colombier 	}
2284cb9422SDavid du Colombier 	return nil;
2384cb9422SDavid du Colombier }
2484cb9422SDavid du Colombier 
2584cb9422SDavid du Colombier int
countargs(char * p)2684cb9422SDavid du Colombier countargs(char *p)
2784cb9422SDavid du Colombier {
2884cb9422SDavid du Colombier 	int n;
2984cb9422SDavid du Colombier 
3084cb9422SDavid du Colombier 	n = 1;
3184cb9422SDavid du Colombier 	while(*p == ' ')
3284cb9422SDavid du Colombier 		p++;
3384cb9422SDavid du Colombier 	for(; *p && *p != ','; p++)
3484cb9422SDavid du Colombier 		if(*p == ' ' && *(p-1) != ' ')
3584cb9422SDavid du Colombier 			n++;
3684cb9422SDavid du Colombier 	return n;
3784cb9422SDavid du Colombier }
3884cb9422SDavid du Colombier 
3984cb9422SDavid du Colombier void
main(int argc,char * argv[])4084cb9422SDavid du Colombier main(int argc, char *argv[])
4184cb9422SDavid du Colombier {
4284cb9422SDavid du Colombier 	char *flags, *p, buf[512];
4384cb9422SDavid du Colombier 	int i, n;
4484cb9422SDavid du Colombier 	Fmt fmt;
4584cb9422SDavid du Colombier 
46*2f205b96SDavid du Colombier 	doquote = needsrcquote;
4784cb9422SDavid du Colombier 	quotefmtinstall();
4884cb9422SDavid du Colombier 	argv0 = argv[0];	/* for sysfatal */
4984cb9422SDavid du Colombier 
5084cb9422SDavid du Colombier 	flags = getenv("flagfmt");
5184cb9422SDavid du Colombier 	if(flags == nil){
5284cb9422SDavid du Colombier 		fprint(2, "$flagfmt not set\n");
5384cb9422SDavid du Colombier 		print("exit 'missing flagfmt'");
5484cb9422SDavid du Colombier 		exits(0);
5584cb9422SDavid du Colombier 	}
5684cb9422SDavid du Colombier 
5784cb9422SDavid du Colombier 	fmtfdinit(&fmt, 1, buf, sizeof buf);
5884cb9422SDavid du Colombier 	for(p=flags; p!=(char*)1; p=strchr(p, ',')+1)
5984cb9422SDavid du Colombier 		fmtprint(&fmt, "flag%.1s=()\n", p);
6084cb9422SDavid du Colombier 	ARGBEGIN{
6184cb9422SDavid du Colombier 	default:
6284cb9422SDavid du Colombier 		if((p = findarg(flags, ARGC())) == nil)
6384cb9422SDavid du Colombier 			usage();
6484cb9422SDavid du Colombier 		p += runelen(ARGC());
6584cb9422SDavid du Colombier 		if(*p == ',' || *p == 0){
6684cb9422SDavid du Colombier 			fmtprint(&fmt, "flag%C=1\n", ARGC());
6784cb9422SDavid du Colombier 			break;
6884cb9422SDavid du Colombier 		}
6984cb9422SDavid du Colombier 		n = countargs(p);
7084cb9422SDavid du Colombier 		fmtprint(&fmt, "flag%C=(", ARGC());
7184cb9422SDavid du Colombier 		for(i=0; i<n; i++)
7284cb9422SDavid du Colombier 			fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage()));
7384cb9422SDavid du Colombier 		fmtprint(&fmt, ")\n");
7484cb9422SDavid du Colombier 	}ARGEND
7584cb9422SDavid du Colombier 
7684cb9422SDavid du Colombier 	fmtprint(&fmt, "*=(");
7784cb9422SDavid du Colombier 	for(i=0; i<argc; i++)
7884cb9422SDavid du Colombier 		fmtprint(&fmt, "%s%q", i ? " " : "", argv[i]);
7984cb9422SDavid du Colombier 	fmtprint(&fmt, ")\n");
8084cb9422SDavid du Colombier 	fmtprint(&fmt, "status=''\n");
8184cb9422SDavid du Colombier 	fmtfdflush(&fmt);
8284cb9422SDavid du Colombier 	exits(0);
8384cb9422SDavid du Colombier }
84