From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mimir.eigenstate.org ([206.124.132.107]) by ewsd; Fri Apr 17 17:11:58 EDT 2020 Received: from abbatoir.fios-router.home (pool-162-83-132-245.nycmny.fios.verizon.net [162.83.132.245]) by mimir.eigenstate.org (OpenSMTPD) with ESMTPSA id 18038d26 (TLSv1.2:ECDHE-RSA-AES256-SHA:256:NO) for <9front@9front.org>; Fri, 17 Apr 2020 14:11:48 -0700 (PDT) Message-ID: <558AF1465AE5A5961A49B8327F2FEBA1@eigenstate.org> To: 9front@9front.org Subject: aux/getflags: name the flags Date: Fri, 17 Apr 2020 14:11:47 -0700 From: ori@eigenstate.org MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: asynchronous encrypted grid-aware shader-based property locator I dislike using aux/getflags, because the flag names aren't under my control. So I patched it: % flagfmt='b:bullshit,s:stuff,f:dobinary binary,r res,x width' % 6.getflags -bsflags and some args bullshit=() stuff=() dobinary=() flagr=() flagx=() bullshit=1 stuff=1 dobinary=(lags) *=(and some args) status='' I'm not sure if this should be committed -- but the code is here: diff -r 247ac32522a0 sys/src/cmd/aux/getflags.c --- a/sys/src/cmd/aux/getflags.c Wed Apr 15 18:16:22 2020 +0200 +++ b/sys/src/cmd/aux/getflags.c Fri Apr 17 14:10:28 2020 -0700 @@ -1,5 +1,6 @@ #include #include +#include void usage(void) @@ -22,6 +23,21 @@ 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 @@ 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 @@ } 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