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