xref: /plan9/sys/src/cmd/aux/getflags.c (revision 2f205b966643394ed7387765c0319f1eefa8f95a)
1 #include <u.h>
2 #include <libc.h>
3 
4 void
usage(void)5 usage(void)
6 {
7 	print("status=usage\n");
8 	exits(0);
9 }
10 
11 char*
findarg(char * flags,Rune r)12 findarg(char *flags, Rune r)
13 {
14 	char *p;
15 	Rune rr;
16 
17 	for(p=flags; p!=(char*)1; p=strchr(p, ',')+1){
18 		chartorune(&rr, p);
19 		if(rr == r)
20 			return p;
21 	}
22 	return nil;
23 }
24 
25 int
countargs(char * p)26 countargs(char *p)
27 {
28 	int n;
29 
30 	n = 1;
31 	while(*p == ' ')
32 		p++;
33 	for(; *p && *p != ','; p++)
34 		if(*p == ' ' && *(p-1) != ' ')
35 			n++;
36 	return n;
37 }
38 
39 void
main(int argc,char * argv[])40 main(int argc, char *argv[])
41 {
42 	char *flags, *p, buf[512];
43 	int i, n;
44 	Fmt fmt;
45 
46 	doquote = needsrcquote;
47 	quotefmtinstall();
48 	argv0 = argv[0];	/* for sysfatal */
49 
50 	flags = getenv("flagfmt");
51 	if(flags == nil){
52 		fprint(2, "$flagfmt not set\n");
53 		print("exit 'missing flagfmt'");
54 		exits(0);
55 	}
56 
57 	fmtfdinit(&fmt, 1, buf, sizeof buf);
58 	for(p=flags; p!=(char*)1; p=strchr(p, ',')+1)
59 		fmtprint(&fmt, "flag%.1s=()\n", p);
60 	ARGBEGIN{
61 	default:
62 		if((p = findarg(flags, ARGC())) == nil)
63 			usage();
64 		p += runelen(ARGC());
65 		if(*p == ',' || *p == 0){
66 			fmtprint(&fmt, "flag%C=1\n", ARGC());
67 			break;
68 		}
69 		n = countargs(p);
70 		fmtprint(&fmt, "flag%C=(", ARGC());
71 		for(i=0; i<n; i++)
72 			fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage()));
73 		fmtprint(&fmt, ")\n");
74 	}ARGEND
75 
76 	fmtprint(&fmt, "*=(");
77 	for(i=0; i<argc; i++)
78 		fmtprint(&fmt, "%s%q", i ? " " : "", argv[i]);
79 	fmtprint(&fmt, ")\n");
80 	fmtprint(&fmt, "status=''\n");
81 	fmtfdflush(&fmt);
82 	exits(0);
83 }
84