|  | #include <u.h> | 
|  | #include <libc.h> | 
|  |  | 
|  | void | 
|  | main(int argc, char **argv) | 
|  | { | 
|  | Fmt fmt; | 
|  | char buf[512]; | 
|  | char *argv0, *args, *flags, *p, *p0; | 
|  | int single; | 
|  | Rune r; | 
|  |  | 
|  | argv0 = getenv("0"); | 
|  | if(argv0 == nil) { | 
|  | if(argc > 1) | 
|  | argv0 = argv[1]; | 
|  | else | 
|  | argv0 = "unknown-program-name"; | 
|  | } | 
|  | if((p = strrchr(argv0, '/')) != nil) | 
|  | argv0 = p+1; | 
|  | flags = getenv("flagfmt"); | 
|  | args = getenv("args"); | 
|  |  | 
|  | if(argv0 == nil){ | 
|  | fprint(2, "aux/usage: $0 not set\n"); | 
|  | exits("$0"); | 
|  | } | 
|  | if(flags == nil) | 
|  | flags = ""; | 
|  | if(args == nil) | 
|  | args = ""; | 
|  |  | 
|  | fmtfdinit(&fmt, 2, buf, sizeof buf); | 
|  | fmtprint(&fmt, "usage: %s", argv0); | 
|  | if(flags[0]){ | 
|  | single = 0; | 
|  | for(p=flags; *p; ){ | 
|  | p += chartorune(&r, p); | 
|  | if(*p == ',' || *p == 0){ | 
|  | if(!single){ | 
|  | fmtprint(&fmt, " [-"); | 
|  | single = 1; | 
|  | } | 
|  | fmtprint(&fmt, "%C", r); | 
|  | if(*p == ',') | 
|  | p++; | 
|  | continue; | 
|  | } | 
|  | while(*p == ' ') | 
|  | p++; | 
|  | if(single){ | 
|  | fmtprint(&fmt, "]"); | 
|  | single = 0; | 
|  | } | 
|  | p0 = p; | 
|  | p = strchr(p0, ','); | 
|  | if(p == nil) | 
|  | p = ""; | 
|  | else | 
|  | *p++ = 0; | 
|  | fmtprint(&fmt, " [-%C %s]", r, p0); | 
|  | } | 
|  | if(single) | 
|  | fmtprint(&fmt, "]"); | 
|  | } | 
|  | if(args) | 
|  | fmtprint(&fmt, " %s", args); | 
|  | fmtprint(&fmt, "\n"); | 
|  | fmtfdflush(&fmt); | 
|  | exits("usage"); | 
|  | } |