diff options
author | Ori Bernstein <ori@eigenstate.org> | 2020-04-18 15:38:38 -0700 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2020-04-18 15:38:38 -0700 |
commit | 380adf8b485ce93aa42ad0d414718c3ad4918176 (patch) | |
tree | 56d17c000f93a33c5002108d71fda066a11a5d96 /sys/src | |
parent | 8ae77554dda425997faa8c7562613cc06586a209 (diff) |
aux/getflags: support named flags
When using aux/getflags, it produces unnecessarily obscure
names for the flags. This allows the caller of aux/getflags
to support arbitrary names.
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/cmd/aux/getflags.c | 45 | ||||
-rw-r--r-- | sys/src/cmd/aux/usage.c | 3 |
2 files changed, 43 insertions, 5 deletions
diff --git a/sys/src/cmd/aux/getflags.c b/sys/src/cmd/aux/getflags.c index 407b73781..880f0dc38 100644 --- a/sys/src/cmd/aux/getflags.c +++ b/sys/src/cmd/aux/getflags.c @@ -1,5 +1,6 @@ #include <u.h> #include <libc.h> +#include <ctype.h> void usage(void) @@ -22,6 +23,21 @@ findarg(char *flags, Rune r) return nil; } +char* +argname(char *p) +{ + Rune r; + int n; + + while(1){ + n = chartorune(&r, p); + if(!isalpharune(r) && !isdigitrune(r)) + break; + p += n; + } + return p; +} + int countargs(char *p) { @@ -39,7 +55,7 @@ countargs(char *p) void main(int argc, char *argv[]) { - char *flags, *p, buf[512]; + char *flags, *p, *s, *e, buf[512]; int i, n; Fmt fmt; @@ -55,19 +71,38 @@ main(int argc, char *argv[]) } fmtfdinit(&fmt, 1, buf, sizeof buf); - for(p=flags; p!=(char*)1; p=strchr(p, ',')+1) - fmtprint(&fmt, "flag%.1s=()\n", p); + for(p=flags; p!=(char*)1 && *p != 0; p=strchr(p, ',')+1){ + s = e = nil; + if(p[1] == ':'){ + s = p + 2; + e = argname(s); + } + if(s != e) + fmtprint(&fmt, "%.*s=()\n", (int)(e - s), s); + else + fmtprint(&fmt, "flag%.1s=()\n", p); + } ARGBEGIN{ default: if((p = findarg(flags, ARGC())) == nil) usage(); p += runelen(ARGC()); + s = p + 1; + e = p + 1; + if(*p == ':' && (e = argname(s)) != s) + p = e; if(*p == ',' || *p == 0){ - fmtprint(&fmt, "flag%C=1\n", ARGC()); + if(s != e) + fmtprint(&fmt, "%.*s=1\n", (int)(e - s), s); + else + fmtprint(&fmt, "flag%C=1\n", ARGC()); break; } n = countargs(p); - fmtprint(&fmt, "flag%C=(", ARGC()); + if(s != e) + fmtprint(&fmt, "%.*s=(", (int)(e - s), s); + else + fmtprint(&fmt, "flag%C=(", ARGC()); for(i=0; i<n; i++) fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage())); fmtprint(&fmt, ")\n"); diff --git a/sys/src/cmd/aux/usage.c b/sys/src/cmd/aux/usage.c index 6d58577f4..a2f8c7c2c 100644 --- a/sys/src/cmd/aux/usage.c +++ b/sys/src/cmd/aux/usage.c @@ -31,6 +31,9 @@ main(void) single = 0; for(p=flags; *p; ){ p += chartorune(&r, p); + if(*p == ':') + while(*p != '\0' && *p != ',' && *p != ' ') + p++; if(*p == ',' || *p == 0){ if(!single){ fmtprint(&fmt, " [-"); |