| #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); |
| } |