Blame


1 61b8c11b 2005-08-10 devnull /*% cyntax % && cc -go # %
2 61b8c11b 2005-08-10 devnull * getflags: process flags for command files
3 61b8c11b 2005-08-10 devnull * Usage: ifs='' eval `{getflags [-s] flagfmt [arg ...]} # rc
4 61b8c11b 2005-08-10 devnull * Usage: IFS= eval `getflags -b [-s] flagfmt [arg...]` # Bourne shell
5 61b8c11b 2005-08-10 devnull * -b means give Bourne-shell compatible output
6 61b8c11b 2005-08-10 devnull */
7 61b8c11b 2005-08-10 devnull #include <u.h>
8 61b8c11b 2005-08-10 devnull #include <libc.h>
9 61b8c11b 2005-08-10 devnull #include "getflags.h"
10 61b8c11b 2005-08-10 devnull
11 61b8c11b 2005-08-10 devnull /* predefine functions */
12 61b8c11b 2005-08-10 devnull void bourneprint(int, char *[]);
13 61b8c11b 2005-08-10 devnull void bournearg(char *);
14 61b8c11b 2005-08-10 devnull void rcprint(int, char *[]);
15 61b8c11b 2005-08-10 devnull void usmsg(char *);
16 61b8c11b 2005-08-10 devnull int count(int, char *);
17 61b8c11b 2005-08-10 devnull void rcarg(char *);
18 61b8c11b 2005-08-10 devnull
19 61b8c11b 2005-08-10 devnull void
20 61b8c11b 2005-08-10 devnull main(int argc, char *argv[])
21 61b8c11b 2005-08-10 devnull {
22 61b8c11b 2005-08-10 devnull int bourne;
23 61b8c11b 2005-08-10 devnull argc=getflags(argc, argv, "b");
24 61b8c11b 2005-08-10 devnull if(argc<2) usage("flagfmt [arg ...]");
25 61b8c11b 2005-08-10 devnull bourne=flag['b']!=0;
26 61b8c11b 2005-08-10 devnull flag['b']=0;
27 61b8c11b 2005-08-10 devnull if((argc=getflags(argc-1, argv+1, argv[1]))<0){
28 61b8c11b 2005-08-10 devnull usmsg(argv[1]);
29 61b8c11b 2005-08-10 devnull exits(0);
30 61b8c11b 2005-08-10 devnull }
31 61b8c11b 2005-08-10 devnull if(bourne) bourneprint(argc, argv);
32 61b8c11b 2005-08-10 devnull else rcprint(argc, argv);
33 61b8c11b 2005-08-10 devnull exits(0);
34 61b8c11b 2005-08-10 devnull }
35 61b8c11b 2005-08-10 devnull void
36 61b8c11b 2005-08-10 devnull bourneprint(int argc, char *argv[])
37 61b8c11b 2005-08-10 devnull {
38 61b8c11b 2005-08-10 devnull register int c, i, n;
39 61b8c11b 2005-08-10 devnull for(c=0;c!=NFLAG;c++) if(flag[c]){
40 61b8c11b 2005-08-10 devnull print("FLAG%c=", c); /* bug -- c could be a bad char */
41 61b8c11b 2005-08-10 devnull n=count(c, argv[1]);
42 61b8c11b 2005-08-10 devnull if(n==0)
43 61b8c11b 2005-08-10 devnull print("1\n");
44 61b8c11b 2005-08-10 devnull else{
45 61b8c11b 2005-08-10 devnull print("'");
46 61b8c11b 2005-08-10 devnull bournearg(flag[c][0]);
47 61b8c11b 2005-08-10 devnull for(i=1;i!=n;i++){
48 61b8c11b 2005-08-10 devnull print(" ");
49 61b8c11b 2005-08-10 devnull bournearg(flag[c][i]);
50 61b8c11b 2005-08-10 devnull }
51 61b8c11b 2005-08-10 devnull print("'\n");
52 61b8c11b 2005-08-10 devnull }
53 61b8c11b 2005-08-10 devnull }
54 61b8c11b 2005-08-10 devnull print("set --");
55 61b8c11b 2005-08-10 devnull for(c=1;c!=argc;c++){
56 61b8c11b 2005-08-10 devnull print(" ");
57 61b8c11b 2005-08-10 devnull bournearg(argv[c+1]);
58 61b8c11b 2005-08-10 devnull }
59 61b8c11b 2005-08-10 devnull print("\n");
60 61b8c11b 2005-08-10 devnull }
61 61b8c11b 2005-08-10 devnull void
62 61b8c11b 2005-08-10 devnull bournearg(char *s)
63 61b8c11b 2005-08-10 devnull {
64 61b8c11b 2005-08-10 devnull for(;*s;s++)
65 61b8c11b 2005-08-10 devnull if(*s=='\'')
66 61b8c11b 2005-08-10 devnull print("'\\''");
67 61b8c11b 2005-08-10 devnull else
68 61b8c11b 2005-08-10 devnull print("%c", *s);
69 61b8c11b 2005-08-10 devnull }
70 61b8c11b 2005-08-10 devnull void
71 61b8c11b 2005-08-10 devnull rcprint(int argc, char *argv[])
72 61b8c11b 2005-08-10 devnull {
73 8477327a 2005-08-10 devnull int c, i, n;
74 61b8c11b 2005-08-10 devnull for(c=0;c!=NFLAG;c++) if(flag[c]){
75 61b8c11b 2005-08-10 devnull print("FLAG%c=", c); /* bug -- c could be a bad char */
76 61b8c11b 2005-08-10 devnull n=count(c, argv[1]);
77 61b8c11b 2005-08-10 devnull if(n==0)
78 61b8c11b 2005-08-10 devnull print("''");
79 61b8c11b 2005-08-10 devnull else if(n==1)
80 61b8c11b 2005-08-10 devnull rcarg(flag[c][0]);
81 61b8c11b 2005-08-10 devnull else{
82 61b8c11b 2005-08-10 devnull print("(");
83 61b8c11b 2005-08-10 devnull rcarg(flag[c][0]);
84 61b8c11b 2005-08-10 devnull for(i=1;i!=n;i++){
85 61b8c11b 2005-08-10 devnull print(" ");
86 61b8c11b 2005-08-10 devnull rcarg(flag[c][i]);
87 61b8c11b 2005-08-10 devnull }
88 61b8c11b 2005-08-10 devnull print(")");
89 61b8c11b 2005-08-10 devnull }
90 61b8c11b 2005-08-10 devnull print("\n");
91 61b8c11b 2005-08-10 devnull }
92 61b8c11b 2005-08-10 devnull print("*=");
93 61b8c11b 2005-08-10 devnull if(argc==1) print("()");
94 61b8c11b 2005-08-10 devnull else if(argc==2) rcarg(argv[2]);
95 61b8c11b 2005-08-10 devnull else{
96 61b8c11b 2005-08-10 devnull print("(");
97 61b8c11b 2005-08-10 devnull rcarg(argv[2]);
98 61b8c11b 2005-08-10 devnull for(c=2;c!=argc;c++){
99 61b8c11b 2005-08-10 devnull print(" ");
100 61b8c11b 2005-08-10 devnull rcarg(argv[c+1]);
101 61b8c11b 2005-08-10 devnull }
102 61b8c11b 2005-08-10 devnull print(")");
103 61b8c11b 2005-08-10 devnull }
104 61b8c11b 2005-08-10 devnull print("\n");
105 61b8c11b 2005-08-10 devnull }
106 61b8c11b 2005-08-10 devnull void
107 61b8c11b 2005-08-10 devnull usmsg(char *flagarg)
108 61b8c11b 2005-08-10 devnull {
109 8477327a 2005-08-10 devnull char *s, *t, c;
110 8477327a 2005-08-10 devnull int count, nflag=0;
111 61b8c11b 2005-08-10 devnull print("echo Usage: $0'");
112 61b8c11b 2005-08-10 devnull for(s=flagarg;*s;){
113 61b8c11b 2005-08-10 devnull c=*s;
114 61b8c11b 2005-08-10 devnull if(*s++==' ') continue;
115 61b8c11b 2005-08-10 devnull if(*s==':')
116 8477327a 2005-08-10 devnull count = strtol(s+1, &s, 10);
117 61b8c11b 2005-08-10 devnull else count=0;
118 61b8c11b 2005-08-10 devnull if(count==0){
119 61b8c11b 2005-08-10 devnull if(nflag==0) print(" [-");
120 61b8c11b 2005-08-10 devnull nflag++;
121 61b8c11b 2005-08-10 devnull print("%c", c);
122 61b8c11b 2005-08-10 devnull }
123 61b8c11b 2005-08-10 devnull if(*s=='['){
124 61b8c11b 2005-08-10 devnull int depth=1;
125 61b8c11b 2005-08-10 devnull s++;
126 61b8c11b 2005-08-10 devnull for(;*s!='\0' && depth>0; s++)
127 61b8c11b 2005-08-10 devnull if (*s==']') depth--;
128 61b8c11b 2005-08-10 devnull else if (*s=='[') depth++;
129 61b8c11b 2005-08-10 devnull }
130 61b8c11b 2005-08-10 devnull }
131 61b8c11b 2005-08-10 devnull if(nflag) print("]");
132 61b8c11b 2005-08-10 devnull for(s=flagarg;*s;){
133 61b8c11b 2005-08-10 devnull c=*s;
134 61b8c11b 2005-08-10 devnull if(*s++==' ') continue;
135 61b8c11b 2005-08-10 devnull if(*s==':')
136 8477327a 2005-08-10 devnull count = strtol(s+1, &s, 10);
137 61b8c11b 2005-08-10 devnull else count=0;
138 61b8c11b 2005-08-10 devnull if(count!=0){
139 61b8c11b 2005-08-10 devnull print(" [-");
140 61b8c11b 2005-08-10 devnull print("%c", c);
141 61b8c11b 2005-08-10 devnull if(*s=='['){
142 61b8c11b 2005-08-10 devnull int depth=1;
143 61b8c11b 2005-08-10 devnull s++;
144 61b8c11b 2005-08-10 devnull t=s;
145 61b8c11b 2005-08-10 devnull for(;*s!='\0' && depth>0; s++)
146 61b8c11b 2005-08-10 devnull if (*s==']') depth--;
147 61b8c11b 2005-08-10 devnull else if (*s=='[') depth++;
148 61b8c11b 2005-08-10 devnull print(" ");
149 61b8c11b 2005-08-10 devnull write(1, t, s - t);
150 61b8c11b 2005-08-10 devnull }
151 61b8c11b 2005-08-10 devnull else
152 61b8c11b 2005-08-10 devnull while(count--) print(" arg");
153 61b8c11b 2005-08-10 devnull print("]");
154 61b8c11b 2005-08-10 devnull }
155 61b8c11b 2005-08-10 devnull else if(*s=='['){
156 61b8c11b 2005-08-10 devnull int depth=1;
157 61b8c11b 2005-08-10 devnull s++;
158 61b8c11b 2005-08-10 devnull for(;*s!='\0' && depth>0; s++)
159 61b8c11b 2005-08-10 devnull if (*s==']') depth--;
160 61b8c11b 2005-08-10 devnull else if (*s=='[') depth++;
161 61b8c11b 2005-08-10 devnull }
162 61b8c11b 2005-08-10 devnull }
163 61b8c11b 2005-08-10 devnull print("' $usage;\n");
164 61b8c11b 2005-08-10 devnull print("exit 'usage'\n");
165 61b8c11b 2005-08-10 devnull }
166 61b8c11b 2005-08-10 devnull int
167 61b8c11b 2005-08-10 devnull count(int flag, char *flagarg)
168 61b8c11b 2005-08-10 devnull {
169 8477327a 2005-08-10 devnull char *s, c;
170 8477327a 2005-08-10 devnull int n;
171 61b8c11b 2005-08-10 devnull for(s=flagarg;*s;){
172 61b8c11b 2005-08-10 devnull c=*s;
173 61b8c11b 2005-08-10 devnull if(*s++==' ') continue;
174 61b8c11b 2005-08-10 devnull if(*s==':')
175 8477327a 2005-08-10 devnull n = strtol(s+1, &s, 10);
176 61b8c11b 2005-08-10 devnull else n=0;
177 61b8c11b 2005-08-10 devnull if(*s=='['){
178 61b8c11b 2005-08-10 devnull int depth=1;
179 61b8c11b 2005-08-10 devnull s++;
180 61b8c11b 2005-08-10 devnull for(;*s!='\0' && depth>0; s++)
181 61b8c11b 2005-08-10 devnull if (*s==']') depth--;
182 61b8c11b 2005-08-10 devnull else if (*s=='[') depth++;
183 61b8c11b 2005-08-10 devnull }
184 61b8c11b 2005-08-10 devnull if(c==flag) return n;
185 61b8c11b 2005-08-10 devnull }
186 61b8c11b 2005-08-10 devnull return -1; /* never happens */
187 61b8c11b 2005-08-10 devnull }
188 61b8c11b 2005-08-10 devnull void
189 61b8c11b 2005-08-10 devnull rcarg(char *s)
190 61b8c11b 2005-08-10 devnull {
191 61b8c11b 2005-08-10 devnull if(*s=='\0' || strpbrk(s, "\n \t#;&|^$=`'{}()<>?")){
192 61b8c11b 2005-08-10 devnull print("\'");
193 61b8c11b 2005-08-10 devnull for(;*s;s++)
194 61b8c11b 2005-08-10 devnull if(*s=='\'') print("''");
195 61b8c11b 2005-08-10 devnull else print("%c", *s);
196 61b8c11b 2005-08-10 devnull print("\'");
197 61b8c11b 2005-08-10 devnull }
198 61b8c11b 2005-08-10 devnull else print("%s", s);
199 61b8c11b 2005-08-10 devnull }