diff options
author | kvik <kvik@a-b.xyz> | 2020-05-07 00:10:09 +0200 |
---|---|---|
committer | kvik <kvik@a-b.xyz> | 2020-05-07 00:10:09 +0200 |
commit | ccf5d3fb9db7e58a9b9177f41edaf045b9294f86 (patch) | |
tree | 10b775fb9078d2924063a99a54e3efc2ea8b2266 /sys/src/cmd/aux/getflags.c | |
parent | 0dc9c8d0199db2746f2ca651911e8fa60e90e02f (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.c | 36 |
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; |