| #include <u.h> | 
 | #include <libc.h> | 
 |  | 
 | void | 
 | usage(void) | 
 | { | 
 | 	print("status=usage\n"); | 
 | 	exits(0); | 
 | } | 
 |  | 
 | char* | 
 | findarg(char *flags, Rune r) | 
 | { | 
 | 	char *p; | 
 | 	Rune rr; | 
 | 	 | 
 | 	for(p=flags; p!=(char*)1; p=strchr(p, ',')+1){ | 
 | 		chartorune(&rr, p); | 
 | 		if(rr == r) | 
 | 			return p; | 
 | 	} | 
 | 	return nil;	 | 
 | } | 
 |  | 
 | int | 
 | countargs(char *p) | 
 | { | 
 | 	int n; | 
 |  | 
 | 	n = 1; | 
 | 	while(*p == ' ') | 
 | 		p++; | 
 | 	for(; *p && *p != ','; p++) | 
 | 		if(*p == ' ' && *(p-1) != ' ') | 
 | 			n++; | 
 | 	return n; | 
 | } | 
 |  | 
 | void | 
 | main(int argc, char *argv[]) | 
 | { | 
 | 	char *flags, *p, buf[512]; | 
 | 	int i, n; | 
 | 	Fmt fmt; | 
 | 	 | 
 | 	doquote = needsrcquote;	 | 
 | 	quotefmtinstall(); | 
 | 	argv0 = argv[0];	/* for sysfatal */ | 
 | 	 | 
 | 	flags = getenv("flagfmt"); | 
 | 	if(flags == nil){ | 
 | 		fprint(2, "$flagfmt not set\n"); | 
 | 		print("exit 'missing flagfmt'"); | 
 | 		exits(0); | 
 | 	} | 
 |  | 
 | 	fmtfdinit(&fmt, 1, buf, sizeof buf); | 
 | 	for(p=flags; p!=(char*)1; p=strchr(p, ',')+1) | 
 | 		fmtprint(&fmt, "flag%.1s=()\n", p); | 
 | 	ARGBEGIN{ | 
 | 	default: | 
 | 		if((p = findarg(flags, ARGC())) == nil) | 
 | 			usage(); | 
 | 		p += runelen(ARGC()); | 
 | 		if(*p == ',' || *p == 0){ | 
 | 			fmtprint(&fmt, "flag%C=1\n", ARGC()); | 
 | 			break; | 
 | 		} | 
 | 		n = countargs(p); | 
 | 		fmtprint(&fmt, "flag%C=(", ARGC()); | 
 | 		for(i=0; i<n; i++) | 
 | 			fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage())); | 
 | 		fmtprint(&fmt, ")\n"); | 
 | 	}ARGEND | 
 | 	 | 
 | 	fmtprint(&fmt, "*=("); | 
 | 	for(i=0; i<argc; i++) | 
 | 		fmtprint(&fmt, "%s%q", i ? " " : "", argv[i]); | 
 | 	fmtprint(&fmt, ")\n"); | 
 | 	fmtprint(&fmt, "status=''\n"); | 
 | 	fmtfdflush(&fmt); | 
 | 	exits(0); | 
 | } |