missing bit of getflags - 9base - revived minimalist port of Plan 9 userland to… | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit de8d58acf8db7718da376c928cbde0c3a24869a2 | |
parent a5e01b5d6c03c220712198ce23f4b7fc25d43dfa | |
Author: [email protected] <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(-) | |
--- | |
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); | |
+} |