| getflags.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
| git clone git://git.suckless.org/9base | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| getflags.c (1360B) | |
| --- | |
| 1 #include <u.h> | |
| 2 #include <libc.h> | |
| 3 | |
| 4 void | |
| 5 usage(void) | |
| 6 { | |
| 7 print("status=usage\n"); | |
| 8 exits(0); | |
| 9 } | |
| 10 | |
| 11 char* | |
| 12 findarg(char *flags, Rune r) | |
| 13 { | |
| 14 char *p; | |
| 15 Rune rr; | |
| 16 | |
| 17 for(p=flags; p!=(char*)1; p=strchr(p, ',')+1){ | |
| 18 chartorune(&rr, p); | |
| 19 if(rr == r) | |
| 20 return p; | |
| 21 } | |
| 22 return nil; | |
| 23 } | |
| 24 | |
| 25 int | |
| 26 countargs(char *p) | |
| 27 { | |
| 28 int n; | |
| 29 | |
| 30 n = 1; | |
| 31 while(*p == ' ') | |
| 32 p++; | |
| 33 for(; *p && *p != ','; p++) | |
| 34 if(*p == ' ' && *(p-1) != ' ') | |
| 35 n++; | |
| 36 return n; | |
| 37 } | |
| 38 | |
| 39 void | |
| 40 main(int argc, char *argv[]) | |
| 41 { | |
| 42 char *flags, *p, buf[512]; | |
| 43 int i, n; | |
| 44 Fmt fmt; | |
| 45 | |
| 46 quotefmtinstall(); | |
| 47 argv0 = argv[0]; /* for sysfatal */ | |
| 48 | |
| 49 flags = getenv("flagfmt"); | |
| 50 if(flags == nil){ | |
| 51 fprint(2, "$flagfmt not set\n"); | |
| 52 print("exit 'missing flagfmt'"); | |
| 53 exits(0); | |
| 54 } | |
| 55 | |
| 56 fmtfdinit(&fmt, 1, buf, sizeof buf); | |
| 57 for(p=flags; p!=(char*)1; p=strchr(p, ',')+1) | |
| 58 fmtprint(&fmt, "flag%.1s=()\n", p); | |
| 59 ARGBEGIN{ | |
| 60 default: | |
| 61 if((p = findarg(flags, ARGC())) == nil) | |
| 62 usage(); | |
| 63 p += runelen(ARGC()); | |
| 64 if(*p == ',' || *p == 0){ | |
| 65 fmtprint(&fmt, "flag%C=1\n", ARGC()); | |
| 66 break; | |
| 67 } | |
| 68 n = countargs(p); | |
| 69 fmtprint(&fmt, "flag%C=(", ARGC()); | |
| 70 for(i=0; i<n; i++) | |
| 71 fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage… | |
| 72 fmtprint(&fmt, ")\n"); | |
| 73 }ARGEND | |
| 74 | |
| 75 fmtprint(&fmt, "*=("); | |
| 76 for(i=0; i<argc; i++) | |
| 77 fmtprint(&fmt, "%s%q", i ? " " : "", argv[i]); | |
| 78 fmtprint(&fmt, ")\n"); | |
| 79 fmtprint(&fmt, "status=''\n"); | |
| 80 fmtfdflush(&fmt); | |
| 81 exits(0); | |
| 82 } |