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/cmd/aux/getflags.c | |
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/cmd/aux/getflags.c')
-rw-r--r-- | sys/src/cmd/aux/getflags.c | 45 |
1 files changed, 40 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"); |