84 lines
1.4 KiB
C
84 lines
1.4 KiB
C
![]() |
#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);
|
||
|
}
|