summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/getflags.c
diff options
context:
space:
mode:
authorkvik <kvik@a-b.xyz>2020-05-07 00:10:09 +0200
committerkvik <kvik@a-b.xyz>2020-05-07 00:10:09 +0200
commitccf5d3fb9db7e58a9b9177f41edaf045b9294f86 (patch)
tree10b775fb9078d2924063a99a54e3efc2ea8b2266 /sys/src/cmd/aux/getflags.c
parent0dc9c8d0199db2746f2ca651911e8fa60e90e02f (diff)
aux/getflags: improve flagfmt parser
This makes the flagfmt parser more robust and accepting a looser input language — namely by allowing whitespace around specifier fields and ignoring any empty fields. Long flagfmts can thus be pleasingly displayed: flagfmt=' a, b, c, C:cache, m:mtpt mountpoint, s:srvn srvname'
Diffstat (limited to 'sys/src/cmd/aux/getflags.c')
-rw-r--r--sys/src/cmd/aux/getflags.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/sys/src/cmd/aux/getflags.c b/sys/src/cmd/aux/getflags.c
index 880f0dc38..b6bc913f1 100644
--- a/sys/src/cmd/aux/getflags.c
+++ b/sys/src/cmd/aux/getflags.c
@@ -10,17 +10,38 @@ usage(void)
}
char*
+skipspace(char *p)
+{
+ while(isspace(*p))
+ p++;
+ return p;
+}
+
+char*
+nextarg(char *p)
+{
+ char *s;
+
+ s = strchr(p, ',');
+ if(s == nil)
+ return p+strlen(p); /* to \0 */
+ while(*s == ',' || isspace(*s))
+ s++;
+ return s;
+}
+
+char*
findarg(char *flags, Rune r)
{
char *p;
Rune rr;
-
- for(p=flags; p!=(char*)1; p=strchr(p, ',')+1){
+
+ for(p=skipspace(flags); *p; p=nextarg(p)){
chartorune(&rr, p);
if(rr == r)
return p;
}
- return nil;
+ return nil;
}
char*
@@ -44,10 +65,9 @@ countargs(char *p)
int n;
n = 1;
- while(*p == ' ')
- p++;
- for(; *p && *p != ','; p++)
- if(*p == ' ' && *(p-1) != ' ')
+ print("%s\n", p);
+ for(p=skipspace(p); *p && *p != ','; p++)
+ if(isspace(*p) && !isspace(*(p-1)))
n++;
return n;
}
@@ -71,7 +91,7 @@ main(int argc, char *argv[])
}
fmtfdinit(&fmt, 1, buf, sizeof buf);
- for(p=flags; p!=(char*)1 && *p != 0; p=strchr(p, ',')+1){
+ for(p=skipspace(flags); *p; p=nextarg(p)){
s = e = nil;
if(p[1] == ':'){
s = p + 2;