sync with plan 9
This commit is contained in:
parent
79049567a0
commit
c8f538425f
23 changed files with 1962 additions and 1227 deletions
|
|
@ -3,7 +3,7 @@
|
|||
#include "rc.h"
|
||||
#include "getflags.h"
|
||||
#include "fns.h"
|
||||
char *flagset[]={"<flag>"};
|
||||
char *flagset[] = {"<flag>"};
|
||||
char **flag[NFLAG];
|
||||
char cmdline[NCMDLINE+1];
|
||||
char *cmdname;
|
||||
|
|
@ -19,105 +19,118 @@ static int reason;
|
|||
#define FLAGSYN 3
|
||||
#define BADFLAG 4
|
||||
static int badflag;
|
||||
int getflags(int argc, char *argv[], char *flags, int stop)
|
||||
|
||||
int
|
||||
getflags(int argc, char *argv[], char *flags, int stop)
|
||||
{
|
||||
char *s, *t;
|
||||
int i, j, c, count;
|
||||
flagarg=flags;
|
||||
if(cmdname==0) cmdname=argv[0];
|
||||
s=cmdline;
|
||||
for(i=0;i!=argc;i++){
|
||||
for(t=argv[i];*t;t++)
|
||||
flagarg = flags;
|
||||
if(cmdname==0)
|
||||
cmdname = argv[0];
|
||||
s = cmdline;
|
||||
for(i = 0;i!=argc;i++){
|
||||
for(t = argv[i];*t;t++)
|
||||
if(s!=&cmdline[NCMDLINE])
|
||||
*s++=*t;
|
||||
if(i!=argc-1 && s!=&cmdline[NCMDLINE])
|
||||
*s++=' ';
|
||||
}
|
||||
*s='\0';
|
||||
i=1;
|
||||
i = 1;
|
||||
while(i!=argc){
|
||||
if(argv[i][0]!='-' || argv[i][1]=='\0'){
|
||||
if(stop) return argc;
|
||||
if(stop)
|
||||
return argc;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
s=argv[i]+1;
|
||||
s = argv[i]+1;
|
||||
while(*s){
|
||||
c=*s++;
|
||||
count=scanflag(c, flags);
|
||||
if(count==-1) return -1;
|
||||
if(flag[c]){ reason=RESET; badflag=c; return -1; }
|
||||
count = scanflag(c, flags);
|
||||
if(count==-1)
|
||||
return -1;
|
||||
if(flag[c]){ reason = RESET; badflag = c; return -1; }
|
||||
if(count==0){
|
||||
flag[c]=flagset;
|
||||
flag[c] = flagset;
|
||||
if(*s=='\0'){
|
||||
for(j=i+1;j<=argc;j++)
|
||||
argv[j-1]=argv[j];
|
||||
for(j = i+1;j<=argc;j++)
|
||||
argv[j-1] = argv[j];
|
||||
--argc;
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(*s=='\0'){
|
||||
for(j=i+1;j<=argc;j++)
|
||||
argv[j-1]=argv[j];
|
||||
for(j = i+1;j<=argc;j++)
|
||||
argv[j-1] = argv[j];
|
||||
--argc;
|
||||
s=argv[i];
|
||||
s = argv[i];
|
||||
}
|
||||
if(argc-i<count){
|
||||
reason=FEWARGS;
|
||||
badflag=c;
|
||||
reason = FEWARGS;
|
||||
badflag = c;
|
||||
return -1;
|
||||
}
|
||||
reverse(argv+i, argv+argc);
|
||||
reverse(argv+i, argv+argc-count);
|
||||
reverse(argv+argc-count+1, argv+argc);
|
||||
argc-=count;
|
||||
flag[c]=argv+argc+1;
|
||||
flag[c][0]=s;
|
||||
flag[c] = argv+argc+1;
|
||||
flag[c][0] = s;
|
||||
s="";
|
||||
}
|
||||
}
|
||||
}
|
||||
return argc;
|
||||
}
|
||||
static void reverse(char **p, char **q)
|
||||
|
||||
static void
|
||||
reverse(char **p, char **q)
|
||||
{
|
||||
char *t;
|
||||
for(;p<q;p++,--q){ t=*p; *p=*q; *q=t; }
|
||||
for(;p<q;p++,--q){ t=*p; *p=*q; *q = t; }
|
||||
}
|
||||
static int scanflag(int c, char *f)
|
||||
|
||||
static int
|
||||
scanflag(int c, char *f)
|
||||
{
|
||||
int fc, count;
|
||||
if(0<=c && c<NFLAG) while(*f){
|
||||
if(*f==' '){
|
||||
f++;
|
||||
continue;
|
||||
}
|
||||
fc=*f++;
|
||||
if(*f==':'){
|
||||
f++;
|
||||
if(*f<'0' || '9'<*f){ reason=FLAGSYN; return -1; }
|
||||
count=0;
|
||||
while('0'<=*f && *f<='9') count=count*10+*f++-'0';
|
||||
}
|
||||
else
|
||||
count=0;
|
||||
if(*f=='['){
|
||||
do{
|
||||
if(0<=c && c<NFLAG)
|
||||
while(*f){
|
||||
if(*f==' '){
|
||||
f++;
|
||||
if(*f=='\0'){ reason=FLAGSYN; return -1; }
|
||||
}while(*f!=']');
|
||||
f++;
|
||||
continue;
|
||||
}
|
||||
fc=*f++;
|
||||
if(*f==':'){
|
||||
f++;
|
||||
if(*f<'0' || '9'<*f){ reason = FLAGSYN; return -1; }
|
||||
count = 0;
|
||||
while('0'<=*f && *f<='9') count = count*10+*f++-'0';
|
||||
}
|
||||
else
|
||||
count = 0;
|
||||
if(*f=='['){
|
||||
do{
|
||||
f++;
|
||||
if(*f=='\0'){ reason = FLAGSYN; return -1; }
|
||||
}while(*f!=']');
|
||||
f++;
|
||||
}
|
||||
if(c==fc)
|
||||
return count;
|
||||
}
|
||||
if(c==fc) return count;
|
||||
}
|
||||
reason=BADFLAG;
|
||||
badflag=c;
|
||||
reason = BADFLAG;
|
||||
badflag = c;
|
||||
return -1;
|
||||
}
|
||||
void usage(char *tail)
|
||||
|
||||
void
|
||||
usage(char *tail)
|
||||
{
|
||||
char *s, *t, c;
|
||||
int count, nflag=0;
|
||||
int count, nflag = 0;
|
||||
switch(reason){
|
||||
case RESET:
|
||||
errs("Flag -");
|
||||
|
|
@ -140,46 +153,52 @@ void usage(char *tail)
|
|||
}
|
||||
errs("Usage: ");
|
||||
errs(cmdname);
|
||||
for(s=flagarg;*s;){
|
||||
for(s = flagarg;*s;){
|
||||
c=*s;
|
||||
if(*s++==' ') continue;
|
||||
if(*s++==' ')
|
||||
continue;
|
||||
if(*s==':'){
|
||||
s++;
|
||||
count=0;
|
||||
while('0'<=*s && *s<='9') count=count*10+*s++-'0';
|
||||
count = 0;
|
||||
while('0'<=*s && *s<='9') count = count*10+*s++-'0';
|
||||
}
|
||||
else count=0;
|
||||
else count = 0;
|
||||
if(count==0){
|
||||
if(nflag==0) errs(" [-");
|
||||
if(nflag==0)
|
||||
errs(" [-");
|
||||
nflag++;
|
||||
errc(c);
|
||||
}
|
||||
if(*s=='['){
|
||||
s++;
|
||||
while(*s!=']' && *s!='\0') s++;
|
||||
if(*s==']') s++;
|
||||
if(*s==']')
|
||||
s++;
|
||||
}
|
||||
}
|
||||
if(nflag) errs("]");
|
||||
for(s=flagarg;*s;){
|
||||
if(nflag)
|
||||
errs("]");
|
||||
for(s = flagarg;*s;){
|
||||
c=*s;
|
||||
if(*s++==' ') continue;
|
||||
if(*s++==' ')
|
||||
continue;
|
||||
if(*s==':'){
|
||||
s++;
|
||||
count=0;
|
||||
while('0'<=*s && *s<='9') count=count*10+*s++-'0';
|
||||
count = 0;
|
||||
while('0'<=*s && *s<='9') count = count*10+*s++-'0';
|
||||
}
|
||||
else count=0;
|
||||
else count = 0;
|
||||
if(count!=0){
|
||||
errs(" [-");
|
||||
errc(c);
|
||||
if(*s=='['){
|
||||
s++;
|
||||
t=s;
|
||||
t = s;
|
||||
while(*s!=']' && *s!='\0') s++;
|
||||
errs(" ");
|
||||
errn(t, s-t);
|
||||
if(*s==']') s++;
|
||||
if(*s==']')
|
||||
s++;
|
||||
}
|
||||
else
|
||||
while(count--) errs(" arg");
|
||||
|
|
@ -188,7 +207,8 @@ void usage(char *tail)
|
|||
else if(*s=='['){
|
||||
s++;
|
||||
while(*s!=']' && *s!='\0') s++;
|
||||
if(*s==']') s++;
|
||||
if(*s==']')
|
||||
s++;
|
||||
}
|
||||
}
|
||||
if(tail){
|
||||
|
|
@ -198,20 +218,27 @@ void usage(char *tail)
|
|||
errs("\n");
|
||||
Exit("bad flags");
|
||||
}
|
||||
static void errn(char *s, int count)
|
||||
|
||||
static void
|
||||
errn(char *s, int count)
|
||||
{
|
||||
while(count){ errc(*s++); --count; }
|
||||
}
|
||||
static void errs(char *s)
|
||||
|
||||
static void
|
||||
errs(char *s)
|
||||
{
|
||||
while(*s) errc(*s++);
|
||||
}
|
||||
#define NBUF 80
|
||||
static char buf[NBUF], *bufp=buf;
|
||||
static void errc(int c){
|
||||
static char buf[NBUF], *bufp = buf;
|
||||
|
||||
static void
|
||||
errc(int c)
|
||||
{
|
||||
*bufp++=c;
|
||||
if(bufp==&buf[NBUF] || c=='\n'){
|
||||
Write(2, buf, bufp-buf);
|
||||
bufp=buf;
|
||||
bufp = buf;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue