summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/getflags.c
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2020-04-18 15:38:38 -0700
committerOri Bernstein <ori@eigenstate.org>2020-04-18 15:38:38 -0700
commit380adf8b485ce93aa42ad0d414718c3ad4918176 (patch)
tree56d17c000f93a33c5002108d71fda066a11a5d96 /sys/src/cmd/aux/getflags.c
parent8ae77554dda425997faa8c7562613cc06586a209 (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.c45
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");