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

📄 misc.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "defs.h"static int	hasslash(char *);static int	haspercent(char *);static void	rehash(void);/* simple linear hash.  hash function is sum of   characters mod hash table size.*/static inthashloc(char *s){int i;int hashval;char *t;hashval = 0;for(t=s; *t!='\0' ; ++t)	hashval += *t;hashval %= hashsize;for(i=hashval;	hashtab[i]!=0 && !equal(s,hashtab[i]->namep);	i = i >= hashsize-1 ? 0 : i+1) ;return i;}nameblkpsrchname(char *s){return  hashtab[hashloc(s)] ;}nameblkpmakename(char *s){nameblkp p;if(nhashed > hashthresh)	rehash();++nhashed;hashtab[hashloc(s)] = p = ALLOC(nameblock);p->nxtnameblock = firstname;p->namep = copys(s);	/* make a fresh copy of the string s *//* p->linep = 0; p->done = 0; p->septype = 0; p->modtime = 0; */firstname = p;if(mainname==NULL && !haspercent(s) && (*s!='.' || hasslash(s)) )	mainname = p;return p;}static inthasslash(char *s){for( ; *s ; ++s)	if(*s == '/')		return YES;return NO;}static inthaspercent(char *s){for( ; *s ; ++s)	if(*s == '%')		return YES;return NO;}inthasparen(char *s){for( ; *s ; ++s)	if(*s == '(')		return YES;return NO;}static voidrehash(void){nameblkp *ohash;nameblkp p, *hp, *endohash;hp = ohash = hashtab;endohash = hashtab + hashsize;newhash(2*hashsize);while( hp<endohash )	if(p = *hp++)		hashtab[hashloc(p->namep)] = p;free( (char *) ohash);}voidnewhash(int newsize){hashsize = newsize;hashtab = (nameblkp *) ckalloc(hashsize * sizeof(nameblkp));hashthresh = (2*hashsize)/3;}nameblkp chkname(char *s){nameblkp p;time_t k;/*TEMP NEW */if(hasparen(s))	{	k = lookarch(s);/*TEMP	fprintf(stderr, "chkname(%s): look=%d\n", s, k); */	if(k == 0)		return NULL;	}if(p = srchname(s))	return p;dirsrch(s);return srchname(s);}char *copys(char *s){char *t;if( (t = malloc( strlen(s)+1 ) ) == NULL)	fatal("out of memory");strcpy(t, s);return t;}char *concat(char *a, char *b, char *c)   /* c = concatenation of a and b */{char *t;t = c;while(*t = *a++) t++;while(*t++ = *b++);return c;}intsuffix(char *a, char *b, char *p)  /* is b the suffix of a?  if so, set p = prefix */{char *a0,*b0;a0 = a;b0 = b;while(*a++);while(*b++);if( (a-a0) < (b-b0) ) return 0;while(b>b0)	if(*--a != *--b) return 0;while(a0<a) *p++ = *a0++;*p = '\0';return 1;}int *ckalloc(int n){int *p;if( p = (int *) calloc(1,n) )	return p;fatal("out of memory");/* NOTREACHED */}/* copy string a into b, substituting for arguments */char *subst(char *a, char *b){static depth	= 0;char *s;char vname[100];struct varblock *vbp;char closer;if(++depth > 100)	fatal("infinitely recursive macro?");if(a)  while(*a)	{	if(*a!='$' || a[1]=='\0' || *++a=='$')		/* if a non-macro character copy it.  if $$ or $\0, copy $ */		*b++ = *a++;	else	{		s = vname;		if( *a=='(' || *a=='{' )			{			closer = ( *a=='(' ? ')' : '}');			++a;			while(*a == ' ') ++a;			while(*a!=' ' && *a!=closer && *a!='\0') *s++ = *a++;			while(*a!=closer && *a!='\0') ++a;			if(*a == closer) ++a;			}		else	*s++ = *a++;		*s = '\0';		if( (vbp = varptr(vname)) ->varval != 0)			{			b = subst(vbp->varval, b);			vbp->used = YES;			}		}	}*b = '\0';--depth;return b;}voidsetvar(char *v, char *s, int dyn){struct varblock *p;p = varptr(v);if( ! p->noreset )	{	p->varval = s;	p->noreset = inarglist;	if(p->used && !dyn)		fprintf(stderr, "Warning: %s changed after being used\n",v);	if(p->export)		{		/* change string pointed to by environment to new v=s */		char *t;		int lenv;		lenv = strlen(v);		*(p->export) = t = (char *) ckalloc(lenv + strlen(s) + 2);		strcpy(t,v);		t[lenv] = '=';		strcpy(t+lenv+1, s);		}	else		p->export = envpp;	}}/* for setting Bradford's *D and *F family of macros whens setting * etc */voidset3var(char *macro, char *value){char *s;char macjunk[8], *lastslash, *dirpart, *filepart;setvar(macro, value, YES);if(value == CHNULL)	dirpart = filepart = CHNULL;else	{	lastslash = CHNULL;	for(s = value; *s; ++s)		if(*s == '/')			lastslash = s;	if(lastslash)		{		dirpart = copys(value);		filepart = dirpart + (lastslash-value);		filepart[-1] = '\0';		}	else		{		dirpart = "";		filepart = value;		}	}setvar(concat(macro, "D", macjunk), dirpart, YES);setvar(concat(macro, "F", macjunk), filepart, YES);}inteqsign(char *a)   /*look for arguments with equal signs but not colons */{char *s, *t;char c;while(*a == ' ') ++a;for(s=a  ;   *s!='\0' && *s!=':'  ; ++s)	if(*s == '=')		{		for(t = a ; *t!='=' && *t!=' ' && *t!='\t' ;  ++t );		c = *t;		*t = '\0';		for(++s; *s==' ' || *s=='\t' ; ++s);		setvar(a, copys(s), NO);		*t = c;		return YES;		}return NO;}struct varblock *varptr(char *v){struct varblock *vp;/* for compatibility, $(TGS) = $^ */if(equal(v, "TGS") )	v = "^";for(vp = firstvar; vp ; vp = vp->nxtvarblock)	if(equal(v , vp->varname))		return vp;vp = ALLOC(varblock);vp->nxtvarblock = firstvar;firstvar = vp;vp->varname = copys(v);vp->varval = 0;return vp;}intdynmacro(char *line){char *s;char endc, *endp;if(!isalpha(line[0]))	return NO;for(s=line+1 ; *s && (isalpha(*s) | isdigit(*s)) ; ++s)	;endp = s;while( isspace(*s) )	++s;if(s[0]!=':' || s[1]!='=')	return NO;endc = *endp;*endp = '\0';setvar(line, copys(s+2), YES);*endp = endc;return YES;}voidfatal1(char *s, char *t){char buf[100];sprintf(buf, s, t);fatal(buf);}voidfatal(char *s){fflush(stdout);if(s)	fprintf(stderr, "Make: %s.  Stop.\n", s);else	fprintf(stderr, "\nStop.\n");waitstack(0);exit(1);}/* appends to the chain for $? and $^ */chainpappendq(chainp head, char *tail){chainp p, q;p = ALLOC(chain);p->datap = tail;if(head)	{	for(q = head ; q->nextp ; q = q->nextp)		;	q->nextp = p;	return head;	}else	return p;}/* builds the value for $? and $^ */char *mkqlist(chainp p, char *qbuf){char *qbufp, *s;if(p == NULL)	return "";qbufp = qbuf;for( ; p ; p = p->nextp)	{	s = p->datap;	if(qbufp+strlen(s) > &qbuf[QBUFMAX-3])		{		fprintf(stderr, "$? list too long\n");		break;		}	while (*s)		*qbufp++ = *s++;	*qbufp++ = ' ';	}*--qbufp = '\0';return qbuf;}wildpiswild(char *name){char *s;wildp p;for(s=name; *s; ++s)	if(*s == '%')		{		p = ALLOC(wild);		*s = '\0';		p->left = copys(name);		*s = '%';		p->right = copys(s+1);		p->llen = strlen(p->left);		p->rlen = strlen(p->right);		p->totlen = p->llen + p->rlen;		return p;		}return NULL;}char *wildmatch(wildp p, char *name, int len){char *stem;char *s;char c;if(len < p->totlen ||   strncmp(name, p->left, p->llen) ||   strncmp(s = name+len-p->rlen, p->right, p->rlen) )	return CHNULL;/*TEMP fprintf(stderr, "wildmatch(%s)=%s%%%s)\n", name,p->left,p->right); */c = *s;*s = '\0';stem = copys(name + p->llen);*s = c;return stem;}/* substitute stem for any % marks */char *wildsub(char *pat, char *stem){static char temp[100];char *s, *t;s = temp;for(; *pat; ++pat)	if(*pat == '%')		for(t = stem ; *t; )			*s++ = *t++;	else		*s++ = *pat;*s = '\0';return temp;}

⌨️ 快捷键说明

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