⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getflags.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/*% cyntax -DTEST % && cc -DTEST -go # % */#include "rc.h"#include "getflags.h"#include "fns.h"char *flagset[] = {"<flag>"};char **flag[NFLAG];char cmdline[NCMDLINE+1];char *cmdname;static char *flagarg="";static void reverse(char**, char**);static 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	4static int badflag;intgetflags(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<count){					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;				s="";			}		}	}	return argc;}static voidreverse(char **p, char **q){	char *t;	for(;p<q;p++,--q){ t=*p; *p=*q; *q = t; }}staticscanflag(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{					f++;					if(*f=='\0'){ reason = FLAGSYN; return -1; }				}while(*f!=']');				f++;			}			if(c==fc)				return count;		}	reason = BADFLAG;	badflag = c;	return -1;}voidusage(char *tail){	char *s, *t, c;	int count, nflag = 0;	switch(reason){	case RESET:		errs("Flag -");		errc(badflag);		errs(": set twice\n");		break;	case FEWARGS:		errs("Flag -");		errc(badflag);		errs(": too few arguments\n");		break;	case FLAGSYN:		errs("Bad argument to getflags!\n");		break;	case BADFLAG:		errs("Illegal flag -");		errc(badflag);		errc('\n');		break;	}	errs("Usage: ");	errs(cmdname);	for(s = flagarg;*s;){		c=*s;		if(*s++==' ')			continue;		if(*s==':'){			s++;			count = 0;			while('0'<=*s && *s<='9') count = count*10+*s++-'0';		}		else count = 0;		if(count==0){			if(nflag==0)				errs(" [-");			nflag++;			errc(c);		}		if(*s=='['){			s++;			while(*s!=']' && *s!='\0') s++;			if(*s==']')				s++;		}	}	if(nflag)		errs("]");	for(s = flagarg;*s;){		c=*s;		if(*s++==' ')			continue;		if(*s==':'){			s++;			count = 0;			while('0'<=*s && *s<='9') count = count*10+*s++-'0';		}		else count = 0;		if(count!=0){			errs(" [-");			errc(c);			if(*s=='['){				s++;				t = s;				while(*s!=']' && *s!='\0') s++;				errs(" ");				errn(t, s-t);				if(*s==']')					s++;			}			else				while(count--) errs(" arg");			errs("]");		}		else if(*s=='['){			s++;			while(*s!=']' && *s!='\0') s++;			if(*s==']')				s++;		}	}	if(tail){		errs(" ");		errs(tail);	}	errs("\n");	Exit("bad flags");}static voiderrn(char *s, int count){	while(count){ errc(*s++); --count; }}static voiderrs(char *s){	while(*s) errc(*s++);}#define	NBUF	80static char buf[NBUF], *bufp = buf;static voiderrc(int c){	*bufp++=c;	if(bufp==&buf[NBUF] || c=='\n'){		Write(2, buf, bufp-buf);		bufp = buf;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -