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:
parent
9bea9069bf
commit
3cd77ae679
7 changed files with 231 additions and 485 deletions
82
cmd/getflags.c
Normal file
82
cmd/getflags.c
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
#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;
|
||||
|
||||
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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue