Blame


1 f08fdedc 2003-11-23 devnull /*% cyntax -DTEST % && cc -DTEST -go # %
2 f08fdedc 2003-11-23 devnull */
3 f08fdedc 2003-11-23 devnull #include "rc.h"
4 f08fdedc 2003-11-23 devnull #include "getflags.h"
5 f08fdedc 2003-11-23 devnull #include "fns.h"
6 c8f53842 2007-03-26 devnull char *flagset[] = {"<flag>"};
7 f08fdedc 2003-11-23 devnull char **flag[NFLAG];
8 f08fdedc 2003-11-23 devnull char cmdline[NCMDLINE+1];
9 f08fdedc 2003-11-23 devnull char *cmdname;
10 f08fdedc 2003-11-23 devnull static char *flagarg="";
11 f08fdedc 2003-11-23 devnull static void reverse(char**, char**);
12 f08fdedc 2003-11-23 devnull static int scanflag(int, char*);
13 f08fdedc 2003-11-23 devnull static void errn(char*, int);
14 f08fdedc 2003-11-23 devnull static void errs(char*);
15 f08fdedc 2003-11-23 devnull static void errc(int);
16 f08fdedc 2003-11-23 devnull static int reason;
17 f08fdedc 2003-11-23 devnull #define RESET 1
18 f08fdedc 2003-11-23 devnull #define FEWARGS 2
19 f08fdedc 2003-11-23 devnull #define FLAGSYN 3
20 f08fdedc 2003-11-23 devnull #define BADFLAG 4
21 f08fdedc 2003-11-23 devnull static int badflag;
22 c8f53842 2007-03-26 devnull
23 c8f53842 2007-03-26 devnull int
24 c8f53842 2007-03-26 devnull getflags(int argc, char *argv[], char *flags, int stop)
25 f08fdedc 2003-11-23 devnull {
26 f08fdedc 2003-11-23 devnull char *s, *t;
27 f08fdedc 2003-11-23 devnull int i, j, c, count;
28 c8f53842 2007-03-26 devnull flagarg = flags;
29 c8f53842 2007-03-26 devnull if(cmdname==0)
30 c8f53842 2007-03-26 devnull cmdname = argv[0];
31 c8f53842 2007-03-26 devnull s = cmdline;
32 c8f53842 2007-03-26 devnull for(i = 0;i!=argc;i++){
33 c8f53842 2007-03-26 devnull for(t = argv[i];*t;t++)
34 f08fdedc 2003-11-23 devnull if(s!=&cmdline[NCMDLINE])
35 f08fdedc 2003-11-23 devnull *s++=*t;
36 f08fdedc 2003-11-23 devnull if(i!=argc-1 && s!=&cmdline[NCMDLINE])
37 f08fdedc 2003-11-23 devnull *s++=' ';
38 f08fdedc 2003-11-23 devnull }
39 f08fdedc 2003-11-23 devnull *s='\0';
40 c8f53842 2007-03-26 devnull i = 1;
41 f08fdedc 2003-11-23 devnull while(i!=argc){
42 f08fdedc 2003-11-23 devnull if(argv[i][0]!='-' || argv[i][1]=='\0'){
43 c8f53842 2007-03-26 devnull if(stop)
44 c8f53842 2007-03-26 devnull return argc;
45 f08fdedc 2003-11-23 devnull i++;
46 f08fdedc 2003-11-23 devnull continue;
47 f08fdedc 2003-11-23 devnull }
48 c8f53842 2007-03-26 devnull s = argv[i]+1;
49 f08fdedc 2003-11-23 devnull while(*s){
50 f08fdedc 2003-11-23 devnull c=*s++;
51 c8f53842 2007-03-26 devnull count = scanflag(c, flags);
52 c8f53842 2007-03-26 devnull if(count==-1)
53 c8f53842 2007-03-26 devnull return -1;
54 c8f53842 2007-03-26 devnull if(flag[c]){ reason = RESET; badflag = c; return -1; }
55 f08fdedc 2003-11-23 devnull if(count==0){
56 c8f53842 2007-03-26 devnull flag[c] = flagset;
57 f08fdedc 2003-11-23 devnull if(*s=='\0'){
58 c8f53842 2007-03-26 devnull for(j = i+1;j<=argc;j++)
59 c8f53842 2007-03-26 devnull argv[j-1] = argv[j];
60 f08fdedc 2003-11-23 devnull --argc;
61 f08fdedc 2003-11-23 devnull }
62 f08fdedc 2003-11-23 devnull }
63 f08fdedc 2003-11-23 devnull else{
64 f08fdedc 2003-11-23 devnull if(*s=='\0'){
65 c8f53842 2007-03-26 devnull for(j = i+1;j<=argc;j++)
66 c8f53842 2007-03-26 devnull argv[j-1] = argv[j];
67 f08fdedc 2003-11-23 devnull --argc;
68 c8f53842 2007-03-26 devnull s = argv[i];
69 f08fdedc 2003-11-23 devnull }
70 f08fdedc 2003-11-23 devnull if(argc-i<count){
71 c8f53842 2007-03-26 devnull reason = FEWARGS;
72 c8f53842 2007-03-26 devnull badflag = c;
73 f08fdedc 2003-11-23 devnull return -1;
74 f08fdedc 2003-11-23 devnull }
75 f08fdedc 2003-11-23 devnull reverse(argv+i, argv+argc);
76 f08fdedc 2003-11-23 devnull reverse(argv+i, argv+argc-count);
77 f08fdedc 2003-11-23 devnull reverse(argv+argc-count+1, argv+argc);
78 f08fdedc 2003-11-23 devnull argc-=count;
79 c8f53842 2007-03-26 devnull flag[c] = argv+argc+1;
80 c8f53842 2007-03-26 devnull flag[c][0] = s;
81 f08fdedc 2003-11-23 devnull s="";
82 f08fdedc 2003-11-23 devnull }
83 f08fdedc 2003-11-23 devnull }
84 f08fdedc 2003-11-23 devnull }
85 f08fdedc 2003-11-23 devnull return argc;
86 f08fdedc 2003-11-23 devnull }
87 c8f53842 2007-03-26 devnull
88 c8f53842 2007-03-26 devnull static void
89 c8f53842 2007-03-26 devnull reverse(char **p, char **q)
90 f08fdedc 2003-11-23 devnull {
91 f08fdedc 2003-11-23 devnull char *t;
92 c8f53842 2007-03-26 devnull for(;p<q;p++,--q){ t=*p; *p=*q; *q = t; }
93 f08fdedc 2003-11-23 devnull }
94 c8f53842 2007-03-26 devnull
95 c8f53842 2007-03-26 devnull static int
96 c8f53842 2007-03-26 devnull scanflag(int c, char *f)
97 f08fdedc 2003-11-23 devnull {
98 f08fdedc 2003-11-23 devnull int fc, count;
99 c8f53842 2007-03-26 devnull if(0<=c && c<NFLAG)
100 c8f53842 2007-03-26 devnull while(*f){
101 c8f53842 2007-03-26 devnull if(*f==' '){
102 f08fdedc 2003-11-23 devnull f++;
103 c8f53842 2007-03-26 devnull continue;
104 c8f53842 2007-03-26 devnull }
105 c8f53842 2007-03-26 devnull fc=*f++;
106 c8f53842 2007-03-26 devnull if(*f==':'){
107 c8f53842 2007-03-26 devnull f++;
108 c8f53842 2007-03-26 devnull if(*f<'0' || '9'<*f){ reason = FLAGSYN; return -1; }
109 c8f53842 2007-03-26 devnull count = 0;
110 c8f53842 2007-03-26 devnull while('0'<=*f && *f<='9') count = count*10+*f++-'0';
111 c8f53842 2007-03-26 devnull }
112 c8f53842 2007-03-26 devnull else
113 c8f53842 2007-03-26 devnull count = 0;
114 c8f53842 2007-03-26 devnull if(*f=='['){
115 c8f53842 2007-03-26 devnull do{
116 c8f53842 2007-03-26 devnull f++;
117 c8f53842 2007-03-26 devnull if(*f=='\0'){ reason = FLAGSYN; return -1; }
118 c8f53842 2007-03-26 devnull }while(*f!=']');
119 c8f53842 2007-03-26 devnull f++;
120 c8f53842 2007-03-26 devnull }
121 c8f53842 2007-03-26 devnull if(c==fc)
122 c8f53842 2007-03-26 devnull return count;
123 f08fdedc 2003-11-23 devnull }
124 c8f53842 2007-03-26 devnull reason = BADFLAG;
125 c8f53842 2007-03-26 devnull badflag = c;
126 f08fdedc 2003-11-23 devnull return -1;
127 f08fdedc 2003-11-23 devnull }
128 c8f53842 2007-03-26 devnull
129 c8f53842 2007-03-26 devnull void
130 c8f53842 2007-03-26 devnull usage(char *tail)
131 f08fdedc 2003-11-23 devnull {
132 f08fdedc 2003-11-23 devnull char *s, *t, c;
133 c8f53842 2007-03-26 devnull int count, nflag = 0;
134 f08fdedc 2003-11-23 devnull switch(reason){
135 f08fdedc 2003-11-23 devnull case RESET:
136 f08fdedc 2003-11-23 devnull errs("Flag -");
137 f08fdedc 2003-11-23 devnull errc(badflag);
138 f08fdedc 2003-11-23 devnull errs(": set twice\n");
139 f08fdedc 2003-11-23 devnull break;
140 f08fdedc 2003-11-23 devnull case FEWARGS:
141 f08fdedc 2003-11-23 devnull errs("Flag -");
142 f08fdedc 2003-11-23 devnull errc(badflag);
143 f08fdedc 2003-11-23 devnull errs(": too few arguments\n");
144 f08fdedc 2003-11-23 devnull break;
145 f08fdedc 2003-11-23 devnull case FLAGSYN:
146 f08fdedc 2003-11-23 devnull errs("Bad argument to getflags!\n");
147 f08fdedc 2003-11-23 devnull break;
148 f08fdedc 2003-11-23 devnull case BADFLAG:
149 f08fdedc 2003-11-23 devnull errs("Illegal flag -");
150 f08fdedc 2003-11-23 devnull errc(badflag);
151 f08fdedc 2003-11-23 devnull errc('\n');
152 f08fdedc 2003-11-23 devnull break;
153 f08fdedc 2003-11-23 devnull }
154 f08fdedc 2003-11-23 devnull errs("Usage: ");
155 f08fdedc 2003-11-23 devnull errs(cmdname);
156 c8f53842 2007-03-26 devnull for(s = flagarg;*s;){
157 f08fdedc 2003-11-23 devnull c=*s;
158 c8f53842 2007-03-26 devnull if(*s++==' ')
159 c8f53842 2007-03-26 devnull continue;
160 f08fdedc 2003-11-23 devnull if(*s==':'){
161 f08fdedc 2003-11-23 devnull s++;
162 c8f53842 2007-03-26 devnull count = 0;
163 c8f53842 2007-03-26 devnull while('0'<=*s && *s<='9') count = count*10+*s++-'0';
164 f08fdedc 2003-11-23 devnull }
165 c8f53842 2007-03-26 devnull else count = 0;
166 f08fdedc 2003-11-23 devnull if(count==0){
167 c8f53842 2007-03-26 devnull if(nflag==0)
168 c8f53842 2007-03-26 devnull errs(" [-");
169 f08fdedc 2003-11-23 devnull nflag++;
170 f08fdedc 2003-11-23 devnull errc(c);
171 f08fdedc 2003-11-23 devnull }
172 f08fdedc 2003-11-23 devnull if(*s=='['){
173 f08fdedc 2003-11-23 devnull s++;
174 f08fdedc 2003-11-23 devnull while(*s!=']' && *s!='\0') s++;
175 c8f53842 2007-03-26 devnull if(*s==']')
176 c8f53842 2007-03-26 devnull s++;
177 f08fdedc 2003-11-23 devnull }
178 f08fdedc 2003-11-23 devnull }
179 c8f53842 2007-03-26 devnull if(nflag)
180 c8f53842 2007-03-26 devnull errs("]");
181 c8f53842 2007-03-26 devnull for(s = flagarg;*s;){
182 f08fdedc 2003-11-23 devnull c=*s;
183 c8f53842 2007-03-26 devnull if(*s++==' ')
184 c8f53842 2007-03-26 devnull continue;
185 f08fdedc 2003-11-23 devnull if(*s==':'){
186 f08fdedc 2003-11-23 devnull s++;
187 c8f53842 2007-03-26 devnull count = 0;
188 c8f53842 2007-03-26 devnull while('0'<=*s && *s<='9') count = count*10+*s++-'0';
189 f08fdedc 2003-11-23 devnull }
190 c8f53842 2007-03-26 devnull else count = 0;
191 f08fdedc 2003-11-23 devnull if(count!=0){
192 f08fdedc 2003-11-23 devnull errs(" [-");
193 f08fdedc 2003-11-23 devnull errc(c);
194 f08fdedc 2003-11-23 devnull if(*s=='['){
195 f08fdedc 2003-11-23 devnull s++;
196 c8f53842 2007-03-26 devnull t = s;
197 f08fdedc 2003-11-23 devnull while(*s!=']' && *s!='\0') s++;
198 f08fdedc 2003-11-23 devnull errs(" ");
199 f08fdedc 2003-11-23 devnull errn(t, s-t);
200 c8f53842 2007-03-26 devnull if(*s==']')
201 c8f53842 2007-03-26 devnull s++;
202 f08fdedc 2003-11-23 devnull }
203 f08fdedc 2003-11-23 devnull else
204 f08fdedc 2003-11-23 devnull while(count--) errs(" arg");
205 f08fdedc 2003-11-23 devnull errs("]");
206 f08fdedc 2003-11-23 devnull }
207 f08fdedc 2003-11-23 devnull else if(*s=='['){
208 f08fdedc 2003-11-23 devnull s++;
209 f08fdedc 2003-11-23 devnull while(*s!=']' && *s!='\0') s++;
210 c8f53842 2007-03-26 devnull if(*s==']')
211 c8f53842 2007-03-26 devnull s++;
212 f08fdedc 2003-11-23 devnull }
213 f08fdedc 2003-11-23 devnull }
214 f08fdedc 2003-11-23 devnull if(tail){
215 f08fdedc 2003-11-23 devnull errs(" ");
216 f08fdedc 2003-11-23 devnull errs(tail);
217 f08fdedc 2003-11-23 devnull }
218 f08fdedc 2003-11-23 devnull errs("\n");
219 f08fdedc 2003-11-23 devnull Exit("bad flags");
220 f08fdedc 2003-11-23 devnull }
221 c8f53842 2007-03-26 devnull
222 c8f53842 2007-03-26 devnull static void
223 c8f53842 2007-03-26 devnull errn(char *s, int count)
224 f08fdedc 2003-11-23 devnull {
225 f08fdedc 2003-11-23 devnull while(count){ errc(*s++); --count; }
226 f08fdedc 2003-11-23 devnull }
227 c8f53842 2007-03-26 devnull
228 c8f53842 2007-03-26 devnull static void
229 c8f53842 2007-03-26 devnull errs(char *s)
230 f08fdedc 2003-11-23 devnull {
231 f08fdedc 2003-11-23 devnull while(*s) errc(*s++);
232 f08fdedc 2003-11-23 devnull }
233 f08fdedc 2003-11-23 devnull #define NBUF 80
234 c8f53842 2007-03-26 devnull static char buf[NBUF], *bufp = buf;
235 c8f53842 2007-03-26 devnull
236 c8f53842 2007-03-26 devnull static void
237 c8f53842 2007-03-26 devnull errc(int c)
238 c8f53842 2007-03-26 devnull {
239 f08fdedc 2003-11-23 devnull *bufp++=c;
240 f08fdedc 2003-11-23 devnull if(bufp==&buf[NBUF] || c=='\n'){
241 f08fdedc 2003-11-23 devnull Write(2, buf, bufp-buf);
242 c8f53842 2007-03-26 devnull bufp = buf;
243 f08fdedc 2003-11-23 devnull }
244 f08fdedc 2003-11-23 devnull }