1 f08fdedc 2003-11-23 devnull /*% cyntax -DTEST % && cc -DTEST -go # %
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;
24 c8f53842 2007-03-26 devnull getflags(int argc, char *argv[], char *flags, int stop)
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])
36 f08fdedc 2003-11-23 devnull if(i!=argc-1 && s!=&cmdline[NCMDLINE])
37 f08fdedc 2003-11-23 devnull *s++=' ';
41 f08fdedc 2003-11-23 devnull while(i!=argc){
42 f08fdedc 2003-11-23 devnull if(argv[i][0]!='-' || argv[i][1]=='\0'){
44 c8f53842 2007-03-26 devnull return argc;
46 f08fdedc 2003-11-23 devnull continue;
48 c8f53842 2007-03-26 devnull s = argv[i]+1;
49 f08fdedc 2003-11-23 devnull while(*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];
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];
68 c8f53842 2007-03-26 devnull s = argv[i];
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;
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;
85 f08fdedc 2003-11-23 devnull return argc;
88 c8f53842 2007-03-26 devnull static void
89 c8f53842 2007-03-26 devnull reverse(char **p, char **q)
92 c8f53842 2007-03-26 devnull for(;p<q;p++,--q){ t=*p; *p=*q; *q = t; }
95 c8f53842 2007-03-26 devnull static int
96 c8f53842 2007-03-26 devnull scanflag(int c, char *f)
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==' '){
103 c8f53842 2007-03-26 devnull continue;
105 c8f53842 2007-03-26 devnull fc=*f++;
106 c8f53842 2007-03-26 devnull if(*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';
113 c8f53842 2007-03-26 devnull count = 0;
114 c8f53842 2007-03-26 devnull if(*f=='['){
117 c8f53842 2007-03-26 devnull if(*f=='\0'){ reason = FLAGSYN; return -1; }
118 c8f53842 2007-03-26 devnull }while(*f!=']');
121 c8f53842 2007-03-26 devnull if(c==fc)
122 c8f53842 2007-03-26 devnull return count;
124 c8f53842 2007-03-26 devnull reason = BADFLAG;
125 c8f53842 2007-03-26 devnull badflag = c;
126 f08fdedc 2003-11-23 devnull return -1;
130 c8f53842 2007-03-26 devnull usage(char *tail)
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");
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");
145 f08fdedc 2003-11-23 devnull case FLAGSYN:
146 f08fdedc 2003-11-23 devnull errs("Bad argument to getflags!\n");
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');
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;){
158 c8f53842 2007-03-26 devnull if(*s++==' ')
159 c8f53842 2007-03-26 devnull continue;
160 f08fdedc 2003-11-23 devnull if(*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';
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);
172 f08fdedc 2003-11-23 devnull if(*s=='['){
174 f08fdedc 2003-11-23 devnull while(*s!=']' && *s!='\0') s++;
175 c8f53842 2007-03-26 devnull if(*s==']')
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;){
183 c8f53842 2007-03-26 devnull if(*s++==' ')
184 c8f53842 2007-03-26 devnull continue;
185 f08fdedc 2003-11-23 devnull if(*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';
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=='['){
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==']')
204 f08fdedc 2003-11-23 devnull while(count--) errs(" arg");
205 f08fdedc 2003-11-23 devnull errs("]");
207 f08fdedc 2003-11-23 devnull else if(*s=='['){
209 f08fdedc 2003-11-23 devnull while(*s!=']' && *s!='\0') s++;
210 c8f53842 2007-03-26 devnull if(*s==']')
214 f08fdedc 2003-11-23 devnull if(tail){
215 f08fdedc 2003-11-23 devnull errs(" ");
216 f08fdedc 2003-11-23 devnull errs(tail);
218 f08fdedc 2003-11-23 devnull errs("\n");
219 f08fdedc 2003-11-23 devnull Exit("bad flags");
222 c8f53842 2007-03-26 devnull static void
223 c8f53842 2007-03-26 devnull errn(char *s, int count)
225 f08fdedc 2003-11-23 devnull while(count){ errc(*s++); --count; }
228 c8f53842 2007-03-26 devnull static void
229 c8f53842 2007-03-26 devnull errs(char *s)
231 f08fdedc 2003-11-23 devnull while(*s) errc(*s++);
233 f08fdedc 2003-11-23 devnull #define NBUF 80
234 c8f53842 2007-03-26 devnull static char buf[NBUF], *bufp = buf;
236 c8f53842 2007-03-26 devnull static void
237 c8f53842 2007-03-26 devnull errc(int c)
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;