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

📄 misc.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#include "defs"cpn(n, a, b)register int n;register char *a, *b;{while(--n >= 0)	*b++ = *a++;}eqn(n, a, b)register int n;register char *a, *b;{while(--n >= 0)	if(*a++ != *b++)		return(NO);return(YES);}cmpstr(a, b, la, lb)	/* compare two strings */register char *a, *b;ftnint la, lb;{register char *aend, *bend;aend = a + la;bend = b + lb;if(la <= lb)	{	while(a < aend)		if(*a != *b)			return( *a - *b );		else			{ ++a; ++b; }	while(b < bend)		if(*b != ' ')			return(' ' - *b);		else			++b;	}else	{	while(b < bend)		if(*a != *b)			return( *a - *b );		else			{ ++a; ++b; }	while(a < aend)		if(*a != ' ')			return(*a - ' ');		else			++a;	}return(0);}chainp hookup(x,y)register chainp x, y;{register chainp p;if(x == NULL)	return(y);for(p = x ; p->nextp ; p = p->nextp)	;p->nextp = y;return(x);}struct listblock *mklist(p)chainp p;{register struct listblock *q;q = ALLOC(listblock);q->tag = TLIST;q->listp = p;return(q);}chainp mkchain(p,q)register int p, q;{register chainp r;if(chains)	{	r = chains;	chains = chains->nextp;	}else	r = ALLOC(chain);r->datap = p;r->nextp = q;return(r);}char * varstr(n, s)register int n;register char *s;{register int i;static char name[XL+1];for(i=0;  i<n && *s!=' ' && *s!='\0' ; ++i)	name[i] = *s++;name[i] = '\0';return( name );}char * varunder(n, s)register int n;register char *s;{register int i;static char name[XL+1];for(i=0;  i<n && *s!=' ' && *s!='\0' ; ++i)	name[i] = *s++;#if TARGET != GCOSname[i++] = '_';#endifname[i] = '\0';return( name );}char * nounder(n, s)register int n;register char *s;{register int i;static char name[XL+1];for(i=0;  i<n && *s!=' ' && *s!='\0' ; ++s)	if(*s != '_')		name[i++] = *s;name[i] = '\0';return( name );}char *copyn(n, s)register int n;register char *s;{register char *p, *q;p = q = ckalloc(n);while(--n >= 0)	*q++ = *s++;return(p);}char *copys(s)char *s;{return( copyn( strlen(s)+1 , s) );}ftnint convci(n, s)register int n;register char *s;{ftnint sum;sum = 0;while(n-- > 0)	sum = 10*sum + (*s++ - '0');return(sum);}char *convic(n)ftnint n;{static char s[20];register char *t;s[19] = '\0';t = s+19;do	{	*--t = '0' + n%10;	n /= 10;	} while(n > 0);return(t);}double convcd(n, s)int n;register char *s;{double atof();char v[100];register char *t;if(n > 90)	{	err("too many digits in floating constant");	n = 90;	}for(t = v ; n-- > 0 ; s++)	*t++ = (*s=='d' ? 'e' : *s);*t = '\0';return( atof(v) );}struct nameblock *mkname(l, s)int l;register char *s;{struct hashentry *hp;int hash;register struct nameblock *q;register int i;char n[VL];hash = 0;for(i = 0 ; i<l && *s!='\0' ; ++i)	{	hash += *s;	n[i] = *s++;	}hash %= MAXHASH;while( i < VL )	n[i++] = ' ';hp = hashtab + hash;while(q = hp->varp)	if( hash==hp->hashval && eqn(VL,n,q->varname) )		return(q);	else if(++hp >= lasthash)		hp = hashtab;if(++nintnames >= MAXHASH-1)	fatal("hash table full");hp->varp = q = ALLOC(nameblock);hp->hashval = hash;q->tag = TNAME;cpn(VL, n, q->varname);return(q);}struct labelblock *mklabel(l)ftnint l;{register struct labelblock *lp;if(l == 0)	return(0);for(lp = labeltab ; lp < highlabtab ; ++lp)	if(lp->stateno == l)		return(lp);if(++highlabtab >= labtabend)	fatal("too many statement numbers");lp->stateno = l;lp->labelno = newlabel();lp->blklevel = 0;lp->labused = NO;lp->labdefined = NO;lp->labinacc = NO;lp->labtype = LABUNKNOWN;return(lp);}newlabel(){return( ++lastlabno );}/* find or put a name in the external symbol table */struct extsym *mkext(s)char *s;{int i;register char *t;char n[XL];struct extsym *p;i = 0;t = n;while(i<XL && *s)	*t++ = *s++;while(t < n+XL)	*t++ = ' ';for(p = extsymtab ; p<nextext ; ++p)	if(eqn(XL, n, p->extname))		return( p );if(nextext >= lastext)	fatal("too many external symbols");cpn(XL, n, nextext->extname);nextext->extstg = STGUNKNOWN;nextext->extsave = NO;nextext->extp = 0;nextext->extleng = 0;nextext->maxleng = 0;nextext->extinit = NO;return( nextext++ );}struct addrblock *builtin(t, s)int t;char *s;{register struct extsym *p;register struct addrblock *q;p = mkext(s);if(p->extstg == STGUNKNOWN)	p->extstg = STGEXT;else if(p->extstg != STGEXT)	{	err1("improper use of builtin %s", s);	return(0);	}q = ALLOC(addrblock);q->tag = TADDR;q->vtype = t;q->vclass = CLPROC;q->vstg = STGEXT;q->memno = p - extsymtab;return(q);}frchain(p)register chainp *p;{register chainp q;if(p==0 || *p==0)	return;for(q = *p; q->nextp ; q = q->nextp)	;q->nextp = chains;chains = *p;*p = 0;}ptr cpblock(n,p)register int n;register char * p;{register char *q;ptr q0;q = q0 = ckalloc(n);while(n-- > 0)	*q++ = *p++;return(q0);}max(a,b)int a,b;{return( a>b ? a : b);}ftnint lmax(a, b)ftnint a, b;{return( a>b ? a : b);}ftnint lmin(a, b)ftnint a, b;{return(a < b ? a : b);}maxtype(t1, t2)int t1, t2;{int t;t = max(t1, t2);if(t==TYCOMPLEX && (t1==TYDREAL || t2==TYDREAL) )	t = TYDCOMPLEX;return(t);}/* return log base 2 of n if n a power of 2; otherwise -1 */#if FAMILY == SCJlog2(n)ftnint n;{int k;/* trick based on binary representation */if(n<=0 || (n & (n-1))!=0)	return(-1);for(k = 0 ;  n >>= 1  ; ++k)	;return(k);}#endiffrrpl(){struct rplblock *rp;while(rpllist)	{	rp = rpllist->nextp;	free(rpllist);	rpllist = rp;	}}popstack(p)register chainp *p;{register chainp q;if(p==NULL || *p==NULL)	fatal("popstack: stack empty");q = (*p)->nextp;free(*p);*p = q;}struct exprblock *callk(type, name, args)int type;char *name;chainp args;{register struct exprblock *p;p = mkexpr(OPCALL, builtin(type,name), args);p->vtype = type;return(p);}struct exprblock *call4(type, name, arg1, arg2, arg3, arg4)int type;char *name;expptr arg1, arg2, arg3, arg4;{struct listblock *args;args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3, mkchain(arg4, NULL)) ) ) );return( callk(type, name, args) );}struct exprblock *call3(type, name, arg1, arg2, arg3)int type;char *name;expptr arg1, arg2, arg3;{struct listblock *args;args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3, NULL) ) ) );return( callk(type, name, args) );}struct exprblock *call2(type, name, arg1, arg2)int type;char *name;expptr arg1, arg2;{struct listblock *args;args = mklist( mkchain(arg1, mkchain(arg2, NULL) ) );return( callk(type,name, args) );}struct exprblock *call1(type, name, arg)int type;char *name;expptr arg;{return( callk(type,name, mklist(mkchain(arg,0)) ));}struct exprblock *call0(type, name)int type;char *name;{return( callk(type, name, NULL) );}struct impldoblock *mkiodo(dospec, list)chainp dospec, list;{register struct impldoblock *q;q = ALLOC(impldoblock);q->tag = TIMPLDO;q->varnp = dospec;q->datalist = list;return(q);}ptr ckalloc(n)register int n;{register ptr p;ptr calloc();if( p = calloc(1, (unsigned) n) )	return(p);fatal("out of memory");/* NOTREACHED */}isaddr(p)register expptr p;{if(p->tag == TADDR)	return(YES);if(p->tag == TEXPR)	switch(p->opcode)		{		case OPCOMMA:			return( isaddr(p->rightp) );		case OPASSIGN:		case OPPLUSEQ:			return( isaddr(p->leftp) );		}return(NO);}addressable(p)register expptr p;{switch(p->tag)	{	case TCONST:		return(YES);	case TADDR:		return( addressable(p->memoffset) );	default:		return(NO);	}}hextoi(c)register int c;{register char *p;static char p0[17] = "0123456789abcdef";for(p = p0 ; *p ; ++p)	if(*p == c)		return( p-p0 );return(16);}

⌨️ 快捷键说明

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