From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/cmd/rc/getflags.c | 233 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100755 sys/src/cmd/rc/getflags.c (limited to 'sys/src/cmd/rc/getflags.c') diff --git a/sys/src/cmd/rc/getflags.c b/sys/src/cmd/rc/getflags.c new file mode 100755 index 000000000..3c2f9adeb --- /dev/null +++ b/sys/src/cmd/rc/getflags.c @@ -0,0 +1,233 @@ +#include "rc.h" +#include "getflags.h" +#include "fns.h" +char *flagset[] = {""}; +char **flag[NFLAG]; +char *cmdname; +static char *flagarg=""; +static void reverse(char**, char**); +static int scanflag(int, char*); +static void errn(char*, int); +static void errs(char*); +static void errc(int); +static int reason; +#define RESET 1 +#define FEWARGS 2 +#define FLAGSYN 3 +#define BADFLAG 4 +static int badflag; + +int +getflags(int argc, char *argv[], char *flags, int stop) +{ + char *s; + int i, j, c, count; + flagarg = flags; + if(cmdname==0) + cmdname = argv[0]; + + i = 1; + while(i!=argc){ + if(argv[i][0] != '-' || argv[i][1] == '\0'){ + if(stop) /* always true in rc */ + return argc; + i++; + continue; + } + 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; } + if(count==0){ + flag[c] = flagset; + if(*s=='\0'){ + 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]; + --argc; + s = argv[i]; + } + if(argc-i