9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

commit de8d58acf8db7718da376c928cbde0c3a24869a2
parent a5e01b5d6c03c220712198ce23f4b7fc25d43dfa
Author: anselm@garbe.us <unknown>
Date:   Mon, 22 Mar 2010 08:08:16 +0000

missing bit of getflags
Diffstat:
getflags/Makefile | 11+++++++++++
getflags/getflags.c | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 93 insertions(+), 0 deletions(-)

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: 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); +}