From f08fdedcee12c06e3ce9ac9bec363915978e8289 Mon Sep 17 00:00:00 2001 From: rsc Date: Sun, 23 Nov 2003 18:04:08 +0000 Subject: Plan 9's rc. not a clear win over byron's, but at least it has the right syntax. --- src/cmd/rc/getflags.c | 217 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 src/cmd/rc/getflags.c (limited to 'src/cmd/rc/getflags.c') diff --git a/src/cmd/rc/getflags.c b/src/cmd/rc/getflags.c new file mode 100644 index 00000000..c452067f --- /dev/null +++ b/src/cmd/rc/getflags.c @@ -0,0 +1,217 @@ +/*% cyntax -DTEST % && cc -DTEST -go # % + */ +#include "rc.h" +#include "getflags.h" +#include "fns.h" +char *flagset[]={""}; +char **flag[NFLAG]; +char cmdline[NCMDLINE+1]; +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, *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++) + if(s!=&cmdline[NCMDLINE]) + *s++=*t; + if(i!=argc-1 && s!=&cmdline[NCMDLINE]) + *s++=' '; + } + *s='\0'; + i=1; + while(i!=argc){ + if(argv[i][0]!='-' || argv[i][1]=='\0'){ + if(stop) 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