Blame


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