missing bit of getflags - 9base - revived minimalist port of Plan 9 userland to Unix
 (HTM) git clone git://git.suckless.org/9base
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit de8d58acf8db7718da376c928cbde0c3a24869a2
 (DIR) parent a5e01b5d6c03c220712198ce23f4b7fc25d43dfa
 (HTM) Author: anselm@garbe.us <unknown>
       Date:   Mon, 22 Mar 2010 08:08:16 +0000
       
       missing bit of getflags
       Diffstat:
         A getflags/Makefile                   |      11 +++++++++++
         A getflags/getflags.c                 |      82 +++++++++++++++++++++++++++++++
       
       2 files changed, 93 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/getflags/Makefile b/getflags/Makefile
       @@ -0,0 +1,11 @@
       +# getflags - unix port from plan9
       +#
       +# Depends on ../lib9
       +
       +TARG      = getflags
       +
       +include ../std.mk
       +
       +pre-uninstall:
       +
       +post-install:
 (DIR) diff --git a/getflags/getflags.c b/getflags/getflags.c
       @@ -0,0 +1,82 @@
       +#include <u.h>
       +#include <libc.h>
       +
       +void
       +usage(void)
       +{
       +        print("status=usage\n");
       +        exits(0);
       +}
       +
       +char*
       +findarg(char *flags, Rune r)
       +{
       +        char *p;
       +        Rune rr;
       +        
       +        for(p=flags; p!=(char*)1; p=strchr(p, ',')+1){
       +                chartorune(&rr, p);
       +                if(rr == r)
       +                        return p;
       +        }
       +        return nil;        
       +}
       +
       +int
       +countargs(char *p)
       +{
       +        int n;
       +
       +        n = 1;
       +        while(*p == ' ')
       +                p++;
       +        for(; *p && *p != ','; p++)
       +                if(*p == ' ' && *(p-1) != ' ')
       +                        n++;
       +        return n;
       +}
       +
       +void
       +main(int argc, char *argv[])
       +{
       +        char *flags, *p, buf[512];
       +        int i, n;
       +        Fmt fmt;
       +        
       +        quotefmtinstall();
       +        argv0 = argv[0];        /* for sysfatal */
       +        
       +        flags = getenv("flagfmt");
       +        if(flags == nil){
       +                fprint(2, "$flagfmt not set\n");
       +                print("exit 'missing flagfmt'");
       +                exits(0);
       +        }
       +
       +        fmtfdinit(&fmt, 1, buf, sizeof buf);
       +        for(p=flags; p!=(char*)1; p=strchr(p, ',')+1)
       +                fmtprint(&fmt, "flag%.1s=()\n", p);
       +        ARGBEGIN{
       +        default:
       +                if((p = findarg(flags, ARGC())) == nil)
       +                        usage();
       +                p += runelen(ARGC());
       +                if(*p == ',' || *p == 0){
       +                        fmtprint(&fmt, "flag%C=1\n", ARGC());
       +                        break;
       +                }
       +                n = countargs(p);
       +                fmtprint(&fmt, "flag%C=(", ARGC());
       +                for(i=0; i<n; i++)
       +                        fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage()));
       +                fmtprint(&fmt, ")\n");
       +        }ARGEND
       +        
       +        fmtprint(&fmt, "*=(");
       +        for(i=0; i<argc; i++)
       +                fmtprint(&fmt, "%s%q", i ? " " : "", argv[i]);
       +        fmtprint(&fmt, ")\n");
       +        fmtprint(&fmt, "status=''\n");
       +        fmtfdflush(&fmt);
       +        exits(0);
       +}