getflags: import from 4e, with usage

fixes #6 http://bitbucket.org/rsc/plan9port/issue/6/

http://codereview.appspot.com/95043
This commit is contained in:
Russ Cox 2009-07-15 02:48:37 -04:00
parent 9bea9069bf
commit 3cd77ae679
7 changed files with 231 additions and 485 deletions

72
cmd/usage.c Normal file
View file

@ -0,0 +1,72 @@
#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");
}