4 char *flagset[] = {"<flag>"};
7 static char *flagarg="";
8 static void reverse(char**, char**);
9 static int scanflag(int, char*);
10 static void errn(char*, int);
11 static void errs(char*);
12 static void errc(int);
21 getflags(int argc, char *argv[], char *flags, int stop)
31 if(argv[i][0] != '-' || argv[i][1] == '\0'){
32 if(stop) /* always true in rc */
40 count = scanflag(c, flags);
43 if(flag[c]){ reason = RESET; badflag = c; return -1; }
47 for(j = i+1;j<=argc;j++)
54 for(j = i+1;j<=argc;j++)
64 reverse(argv+i, argv+argc);
65 reverse(argv+i, argv+argc-count);
66 reverse(argv+argc-count+1, argv+argc);
68 flag[c] = argv+argc+1;
78 reverse(char **p, char **q)
81 for(;p<q;p++,--q){ t=*p; *p=*q; *q = t; }
85 scanflag(int c, char *f)
97 if(*f<'0' || '9'<*f){ reason = FLAGSYN; return -1; }
99 while('0'<=*f && *f<='9') count = count*10+*f++-'0';
106 if(*f=='\0'){ reason = FLAGSYN; return -1; }
122 int count, nflag = 0;
127 errs(": set twice\n");
132 errs(": too few arguments\n");
135 errs("Bad argument to getflags!\n");
138 errs("Illegal flag -");
145 for(s = flagarg;*s;){
152 while('0'<=*s && *s<='9') count = count*10+*s++-'0';
163 while(*s!=']' && *s!='\0') s++;
170 for(s = flagarg;*s;){
177 while('0'<=*s && *s<='9') count = count*10+*s++-'0';
186 while(*s!=']' && *s!='\0') s++;
193 while(count--) errs(" arg");
198 while(*s!=']' && *s!='\0') s++;
212 errn(char *s, int count)
214 while(count){ errc(*s++); --count; }
220 while(*s) errc(*s++);
223 static char buf[NBUF], *bufp = buf;
229 if(bufp==&buf[NBUF] || c=='\n'){
230 Write(2, buf, bufp-buf);