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

📄 putscj.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
📖 第 1 页 / 共 2 页
字号:
q = mkexpr( opcode==OPEQ ? OPAND : OPOR ,	mkexpr(opcode, realpart(lp), realpart(rp)),	mkexpr(opcode, imagpart(lp), imagpart(rp)) );putx( fixexpr(q) );putcomma(ncomma, TYINT, NO);free(lp);free(rp);free(p);}LOCAL struct addrblock *putch1(p, ncommap)register expptr p;int * ncommap;{register struct addrblock *t;struct addrblock *mktemp(), *putconst();switch(p->tag)	{	case TCONST:		return( putconst(p) );	case TADDR:		return(p);	case TEXPR:		++*ncommap;		switch(p->opcode)			{			case OPCALL:			case OPCCALL:				t = putcall(p);				break;			case OPCONCAT:				t = mktemp(TYCHAR, cpexpr(p->vleng) );				putcat( cpexpr(t), p );				break;			case OPCONV:				if(!ISICON(p->vleng) || p->vleng->const.ci!=1				   || ! INT(p->leftp->vtype) )					fatal("putch1: bad character conversion");				t = mktemp(TYCHAR, ICON(1) );				putop( mkexpr(OPASSIGN, cpexpr(t), p) );				break;			default:				fatal1("putch1: invalid opcode %d", p->opcode);			}		return(t);	default:		fatal1("putch1: bad tag %d", p->tag);	}/* NOTREACHED */}LOCAL putchop(p)expptr p;{int ncomma;ncomma = 0;putaddr( putch1(p, &ncomma) , NO );putcomma(ncomma, TYCHAR, YES);}LOCAL putcheq(p)register struct exprblock *p;{int ncomma;ncomma = 0;if( p->rightp->tag==TEXPR && p->rightp->opcode==OPCONCAT )	putcat(p->leftp, p->rightp);else if( ISONE(p->leftp->vleng) && ISONE(p->rightp->vleng) )	{	putaddr( putch1(p->leftp, &ncomma) , YES );	putaddr( putch1(p->rightp, &ncomma) , YES );	putcomma(ncomma, TYINT, NO);	p2op(P2ASSIGN, P2CHAR);	}else	{	putx( call2(TYINT, "s_copy", p->leftp, p->rightp) );	putcomma(ncomma, TYINT, NO);	}frexpr(p->vleng);free(p);}LOCAL putchcmp(p)register struct exprblock *p;{int ncomma;ncomma = 0;if(ISONE(p->leftp->vleng) && ISONE(p->rightp->vleng) )	{	putaddr( putch1(p->leftp, &ncomma) , YES );	putaddr( putch1(p->rightp, &ncomma) , YES );	p2op(ops2[p->opcode], P2CHAR);	free(p);	putcomma(ncomma, TYINT, NO);	}else	{	p->leftp = call2(TYINT,"s_cmp", p->leftp, p->rightp);	p->rightp = ICON(0);	putop(p);	}}LOCAL putcat(lhs, rhs)register struct addrblock *lhs;register expptr rhs;{int n, ncomma;struct addrblock *lp, *cp;ncomma = 0;n = ncat(rhs);lp = mktmpn(n, TYLENG, NULL);cp = mktmpn(n, TYADDR, NULL);n = 0;putct1(rhs, lp, cp, &n, &ncomma);putx( call4(TYSUBR, "s_cat", lhs, cp, lp, ICON(n) ) );putcomma(ncomma, TYINT, NO);}LOCAL ncat(p)register expptr p;{if(p->tag==TEXPR && p->opcode==OPCONCAT)	return( ncat(p->leftp) + ncat(p->rightp) );else	return(1);}LOCAL putct1(q, lp, cp, ip, ncommap)register expptr q;register struct addrblock *lp, *cp;int *ip, *ncommap;{int i;struct addrblock *lp1, *cp1;if(q->tag==TEXPR && q->opcode==OPCONCAT)	{	putct1(q->leftp, lp, cp, ip, ncommap);	putct1(q->rightp, lp, cp , ip, ncommap);	frexpr(q->vleng);	free(q);	}else	{	i = (*ip)++;	lp1 = cpexpr(lp);	lp1->memoffset = mkexpr(OPPLUS, lp1->memoffset, ICON(i*SZLENG));	cp1 = cpexpr(cp);	cp1->memoffset = mkexpr(OPPLUS, cp1->memoffset, ICON(i*SZADDR));	putassign( lp1, cpexpr(q->vleng) );	putassign( cp1, addrof(putch1(q,ncommap)) );	*ncommap += 2;	}}LOCAL putaddr(p, indir)register struct addrblock *p;int indir;{int type, type2, funct;ftnint offset, simoffset();expptr offp, shorten();type = p->vtype;type2 = types2[type];funct = (p->vclass==CLPROC ? P2FUNCT<<2 : 0);offp = (p->memoffset ? cpexpr(p->memoffset) : NULL);#if (FUDGEOFFSET != 1)if(offp)	offp = mkexpr(OPSTAR, ICON(FUDGEOFFSET), offp);#endifoffset = simoffset( &offp );#if SZINT < SZLONG	if(offp)		if(shortsubs)			offp = shorten(offp);		else			offp = mkconv(TYINT, offp);#else	if(offp)		offp = mkconv(TYINT, offp);#endifswitch(p->vstg)	{	case STGAUTO:		if(indir && !offp)			{			p2oreg(offset, AUTOREG, type2);			break;			}		if(!indir && !offp && !offset)			{			p2reg(AUTOREG, type2 | P2PTR);			break;			}		p2reg(AUTOREG, type2 | P2PTR);		if(offp)			{			putx(offp);			if(offset)				p2icon(offset, P2INT);			}		else			p2icon(offset, P2INT);		if(offp && offset)			p2op(P2PLUS, type2 | P2PTR);		p2op(P2PLUS, type2 | P2PTR);		if(indir)			p2op(P2INDIRECT, type2);		break;	case STGARG:		p2oreg(#ifdef ARGOFFSET			ARGOFFSET +#endif			(ftnint) (FUDGEOFFSET*p->memno),			ARGREG,   type2 | P2PTR | funct );		if(offp)			putx(offp);		if(offset)			p2icon(offset, P2INT);		if(offp && offset)			p2op(P2PLUS, type2 | P2PTR);		if(offp || offset)			p2op(P2PLUS, type2 | P2PTR);		if(indir)			p2op(P2INDIRECT, type2);		break;	case STGLENG:		if(indir)			{			p2oreg(#ifdef ARGOFFSET				ARGOFFSET +#endif				(ftnint) (FUDGEOFFSET*p->memno),				ARGREG,   type2 | P2PTR );			}		else	{			p2reg(ARGREG, type2 | P2PTR );			p2icon(#ifdef ARGOFFSET				ARGOFFSET +#endif				(ftnint) (FUDGEOFFSET*p->memno), P2INT);			p2op(P2PLUS, type2 | P2PTR );			}		break;	case STGBSS:	case STGINIT:	case STGEXT:	case STGCOMMON:	case STGEQUIV:	case STGCONST:		if(offp)			{			putx(offp);			putmem(p, P2ICON, offset);			p2op(P2PLUS, type2 | P2PTR);			if(indir)				p2op(P2INDIRECT, type2);			}		else			putmem(p, (indir ? P2NAME : P2ICON), offset);		break;	case STGREG:		if(indir)			p2reg(p->memno, type2);		else			fatal("attempt to take address of a register");		break;	default:		fatal1("putaddr: invalid vstg %d", p->vstg);	}frexpr(p);}LOCAL putmem(p, class, offset)expptr p;int class;ftnint offset;{int type2;int funct;char *name,  *memname();funct = (p->vclass==CLPROC ? P2FUNCT<<2 : 0);type2 = types2[p->vtype];if(p->vclass == CLPROC)	type2 |= (P2FUNCT<<2);name = memname(p->vstg, p->memno);if(class == P2ICON)	{	p2triple(P2ICON, name[0]!='\0', type2|P2PTR);	p2word(offset);	if(name[0])		p2name(name);	}else	{	p2triple(P2NAME, offset!=0, type2);	if(offset != 0)		p2word(offset);	p2name(name);	}}LOCAL struct addrblock *putcall(p)struct exprblock *p;{chainp arglist, charsp, cp;int n, first;struct addrblock *t;struct exprblock *q;struct exprblock *fval;int type, type2, ctype, indir;type2 = types2[type = p->vtype];charsp = NULL;indir =  (p->opcode == OPCCALL);n = 0;first = YES;if(p->rightp)	{	arglist = p->rightp->listp;	free(p->rightp);	}else	arglist = NULL;for(cp = arglist ; cp ; cp = cp->nextp)	if(indir)		++n;	else	{		q = cp->datap;		if(q->tag == TCONST)			cp->datap = q = putconst(q);		if( ISCHAR(q) )			{			charsp = hookup(charsp, mkchain(cpexpr(q->vleng), 0) );			n += 2;			}		else if(q->vclass == CLPROC)			{			charsp = hookup(charsp, mkchain( ICON(0) , 0));			n += 2;			}		else			n += 1;		}if(type == TYCHAR)	{	if( ISICON(p->vleng) )		{		fval = mktemp(TYCHAR, p->vleng);		n += 2;		}	else	{		err("adjustable character function");		return;		}	}else if( ISCOMPLEX(type) )	{	fval = mktemp(type, NULL);	n += 1;	}else	fval = NULL;ctype = (fval ? P2INT : type2);putaddr(p->leftp, NO);if(fval)	{	first = NO;	putaddr( cpexpr(fval), NO);	if(type==TYCHAR)		{		putx( mkconv(TYLENG,p->vleng) );		p2op(P2LISTOP, type2);		}	}for(cp = arglist ; cp ; cp = cp->nextp)	{	q = cp->datap;	if(q->tag==TADDR && (indir || q->vstg!=STGREG) )		putaddr(q, indir && q->vtype!=TYCHAR);	else if( ISCOMPLEX(q->vtype) )		putcxop(q);	else if (ISCHAR(q) )		putchop(q);	else if( ! ISERROR(q) )		{		if(indir)			putx(q);		else	{			t = mktemp(q->vtype, q->vleng);			putassign( cpexpr(t), q );			putaddr(t, NO);			putcomma(1, q->vtype, YES);			}		}	if(first)		first = NO;	else		p2op(P2LISTOP, type2);	}if(arglist)	frchain(&arglist);for(cp = charsp ; cp ; cp = cp->nextp)	{	putx( mkconv(TYLENG,cp->datap) );	p2op(P2LISTOP, type2);	}frchain(&charsp);p2op(n>0 ? P2CALL : P2CALL0 , ctype);free(p);return(fval);}LOCAL putmnmx(p)register struct exprblock *p;{int op, type;int ncomma;struct exprblock *qp;chainp p0, p1;struct addrblock *sp, *tp;type = p->vtype;op = (p->opcode==OPMIN ? OPLT : OPGT );p0 = p->leftp->listp;free(p->leftp);free(p);sp = mktemp(type, NULL);tp = mktemp(type, NULL);qp = mkexpr(OPCOLON, cpexpr(tp), cpexpr(sp));qp = mkexpr(OPQUEST, mkexpr(op, cpexpr(tp),cpexpr(sp)), qp);qp = fixexpr(qp);ncomma = 1;putassign( cpexpr(sp), p0->datap );for(p1 = p0->nextp ; p1 ; p1 = p1->nextp)	{	++ncomma;	putassign( cpexpr(tp), p1->datap );	if(p1->nextp)		{		++ncomma;		putassign( cpexpr(sp), cpexpr(qp) );		}	else		putx(qp);	}putcomma(ncomma, type, NO);frtemp(sp);frtemp(tp);frchain( &p0 );}LOCAL putcomma(n, type, indir)int n, type, indir;{type = types2[type];if(indir)	type |= P2PTR;while(--n >= 0)	p2op(P2COMOP, type);}ftnint simoffset(p0)expptr *p0;{ftnint offset, prod;register expptr p, lp, rp;offset = 0;p = *p0;if(p == NULL)	return(0);if( ! ISINT(p->vtype) )	return(0);if(p->tag==TEXPR && p->opcode==OPSTAR)	{	lp = p->leftp;	rp = p->rightp;	if(ISICON(rp) && lp->tag==TEXPR && lp->opcode==OPPLUS && ISICON(lp->rightp))		{		p->opcode = OPPLUS;		lp->opcode = OPSTAR;		prod = rp->const.ci * lp->rightp->const.ci;		lp->rightp->const.ci = rp->const.ci;		rp->const.ci = prod;		}	}if(p->tag==TEXPR && p->opcode==OPPLUS && ISICON(p->rightp))	{	rp = p->rightp;	lp = p->leftp;	offset += rp->const.ci;	frexpr(rp);	free(p);	*p0 = lp;	}if(p->tag == TCONST)	{	offset += p->const.ci;	frexpr(p);	*p0 = NULL;	}return(offset);}p2op(op, type)int op, type;{p2triple(op, 0, type);}p2icon(offset, type)ftnint offset;int type;{p2triple(P2ICON, 0, type);p2word(offset);}p2oreg(offset, reg, type)ftnint offset;int reg, type;{p2triple(P2OREG, reg, type);p2word(offset);p2name("");}p2reg(reg, type)int reg, type;{p2triple(P2REG, reg, type);}p2pass(s)char *s;{p2triple(P2PASS, (strlen(s) + FOUR-1)/FOUR, 0);p2str(s);}p2str(s)register char *s;{union { long int word; char str[FOUR]; } u;register int i;i = 0;u.word = 0;while(*s)	{	u.str[i++] = *s++;	if(i == FOUR)		{		p2word(u.word);		u.word = 0;		i = 0;		}	}if(i > 0)	p2word(u.word);}p2triple(op, var, type)int op, var, type;{register long word;word = op | (var<<8);word |= ( (long int) type) <<16;p2word(word);}p2name(s)char *s;{int i;union  { long int word[2];  char str[8]; } u;u.word[0] = u.word[1] = 0;for(i = 0 ; i<8 && *s ; ++i)	u.str[i] = *s++;p2word(u.word[0]);p2word(u.word[1]);}p2word(w)long int w;{*p2bufp++ = w;if(p2bufp >= p2bufend)	p2flush();}p2flush(){if(p2bufp > p2buff)	write(fileno(textfile), p2buff, (p2bufp-p2buff)*sizeof(long int));p2bufp = p2buff;}

⌨️ 快捷键说明

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