1
/*% cyntax -DTEST % && cc -DTEST -go # %
6
char *flagset[]={"<flag>"};
8
char cmdline[NCMDLINE+1];
10
static char *flagarg="";
11
static void reverse(char**, char**);
12
static int scanflag(int, char*);
13
static void errn(char*, int);
14
static void errs(char*);
15
static void errc(int);
22
int getflags(int argc, char *argv[], char *flags, int stop)
27
if(cmdname==0) cmdname=argv[0];
31
if(s!=&cmdline[NCMDLINE])
33
if(i!=argc-1 && s!=&cmdline[NCMDLINE])
39
if(argv[i][0]!='-' || argv[i][1]=='\0'){
47
count=scanflag(c, flags);
48
if(count==-1) return -1;
49
if(flag[c]){ reason=RESET; badflag=c; return -1; }
53
for(j=i+1;j<=argc;j++)
60
for(j=i+1;j<=argc;j++)
70
reverse(argv+i, argv+argc);
71
reverse(argv+i, argv+argc-count);
72
reverse(argv+argc-count+1, argv+argc);
82
static void reverse(char **p, char **q)
85
for(;p<q;p++,--q){ t=*p; *p=*q; *q=t; }
87
static int scanflag(int c, char *f)
90
if(0<=c && c<NFLAG) while(*f){
98
if(*f<'0' || '9'<*f){ reason=FLAGSYN; return -1; }
100
while('0'<=*f && *f<='9') count=count*10+*f++-'0';
107
if(*f=='\0'){ reason=FLAGSYN; return -1; }
111
if(c==fc) return count;
117
void usage(char *tail)
125
errs(": set twice\n");
130
errs(": too few arguments\n");
133
errs("Bad argument to getflags!\n");
136
errs("Illegal flag -");
145
if(*s++==' ') continue;
149
while('0'<=*s && *s<='9') count=count*10+*s++-'0';
153
if(nflag==0) errs(" [-");
159
while(*s!=']' && *s!='\0') s++;
166
if(*s++==' ') continue;
170
while('0'<=*s && *s<='9') count=count*10+*s++-'0';
179
while(*s!=']' && *s!='\0') s++;
185
while(count--) errs(" arg");
190
while(*s!=']' && *s!='\0') s++;
201
static void errn(char *s, int count)
203
while(count){ errc(*s++); --count; }
205
static void errs(char *s)
207
while(*s) errc(*s++);
210
static char buf[NBUF], *bufp=buf;
211
static void errc(int c){
213
if(bufp==&buf[NBUF] || c=='\n'){
214
Write(2, buf, bufp-buf);