Blob


1 #include <u.h>
2 #include <libc.h>
4 void
5 usage(void)
6 {
7 fprint(2, "status=usage\n");
8 exits(0);
9 }
11 char*
12 findarg(char *flags, Rune r)
13 {
14 char *p;
15 Rune rr;
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 }
25 int
26 countargs(char *p)
27 {
28 int n;
30 n = 1;
31 while(*p == ' ')
32 p++;
33 for(; *p && *p != ','; p++)
34 if(*p == ' ' && *(p-1) != ' ')
35 n++;
36 return n;
37 }
39 void
40 main(int argc, char *argv[])
41 {
42 char *flags, *p, buf[512];
43 int i, n;
44 Fmt fmt;
46 doquote = needsrcquote;
47 quotefmtinstall();
48 argv0 = argv[0]; /* for sysfatal */
50 flags = getenv("flagfmt");
51 if(flags == nil){
52 fprint(2, "$flagfmt not set\n");
53 print("exit 'missing flagfmt'");
54 exits(0);
55 }
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
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 }