getflags.c (1380B)
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 doquote = needsrcquote; 47 quotefmtinstall(); 48 argv0 = argv[0]; /* for sysfatal */ 49 50 flags = getenv("flagfmt"); 51 if(flags == nil){ 52 fprint(2, "$flagfmt not set\n"); 53 print("exit 'missing flagfmt'"); 54 exits(0); 55 } 56 57 fmtfdinit(&fmt, 1, buf, sizeof buf); 58 for(p=flags; p!=(char*)1; p=strchr(p, ',')+1) 59 fmtprint(&fmt, "flag%.1s=()\n", p); 60 ARGBEGIN{ 61 default: 62 if((p = findarg(flags, ARGC())) == nil) 63 usage(); 64 p += runelen(ARGC()); 65 if(*p == ',' || *p == 0){ 66 fmtprint(&fmt, "flag%C=1\n", ARGC()); 67 break; 68 } 69 n = countargs(p); 70 fmtprint(&fmt, "flag%C=(", ARGC()); 71 for(i=0; i<n; i++) 72 fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage())); 73 fmtprint(&fmt, ")\n"); 74 }ARGEND 75 76 fmtprint(&fmt, "*=("); 77 for(i=0; i<argc; i++) 78 fmtprint(&fmt, "%s%q", i ? " " : "", argv[i]); 79 fmtprint(&fmt, ")\n"); 80 fmtprint(&fmt, "status=''\n"); 81 fmtfdflush(&fmt); 82 exits(0); 83 }