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

📄 dclgen.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#include "defs"#define DOCOMMON 1#define NOCOMMON 0dclgen(){register ptr p, q;ptr q1;chainp *y, z;register struct stentry *s;struct stentry **hp;int first;int i, j;extern char *types[];char *sp;/*   print procedure statement and argument list */for(p = prevcomments ; p ; p = p->nextp)	{	sp = p->datap;	fprintf(codefile, "%s\n", sp+1);	cfree(sp);	}frchain(&prevcomments);if(tailor.procheader)	fprintf(codefile, "%s\n", tailor.procheader);if(procname)	{	p2str("      ");	if(procname->vtype==TYSUBR || procname->vtype==TYUNDEFINED)		p2key(FSUBROUTINE);	else	{		p2str(types[procname->vtype]);		p2key(FFUNCTION);		}	p2str(procname->sthead->namep);	}else if(procclass == PRBLOCK)	{	p2stmt(0);	p2key(FBLOCKDATA);	}else	{	p2str("c  main program");	if(tailor.ftnsys == CRAY)		{		p2stmt(0);		p2key(FPROGRAM);		}	}if(thisargs)	{	p2str( "(" );	first = 1;	for(p = thisargs ; p ; p = p->nextp)		if( (q=p->datap)->vextbase)			{			if(first) first = 0;			else p2str(", ");			p2str(ftnames[q->vextbase]);			}		else	for(i=0 ; i<NFTNTYPES ; ++i)				if(j = q->vbase[i])					{					if(first) first = 0;					else p2str( ", " );					p2str(ftnames[j]);					}	p2str( ")" );	}/* first put out declarations of variables that are used as   adjustable dimensions*/y = 0;z = & y;for(hp = hashtab ; hp<hashend; ++hp)	if( *hp && (q = (*hp)->varp) )		if(q->tag==TNAME && q->vadjdim && q!=procname)			z = z->nextp = mkchain(q,CHNULL);dclchain(y, NOCOMMON);frchain(&y);/* then declare the rest of the arguments */z = & y;for(p = thisargs ; p ; p = p->nextp)	if(p->datap->vadjdim == 0)		z = z->nextp = mkchain(p->datap,CHNULL);dclchain(y, NOCOMMON);frchain(&y);frchain(&thisargs);/* now put out declarations for common blocks */for(p = commonlist ; p ; p = p->nextp)	prcomm(p->datap);TEST fprintf(diagfile, "\nend of common declarations");z = &y;/* next the other variables that are in the symbol table */for(hp = hashtab ; hp<hashend ; ++hp)	if( *hp && (q = (*hp)->varp) )		if(q->tag==TNAME && q->vadjdim==0 && q->vclass!=CLCOMMON &&		    q->vclass!=CLARG && q!=procname &&		    (tailor.dclintrinsics || q->vproc!=PROCINTRINSIC) )			z = z->nextp = mkchain(q,CHNULL);dclchain(y, NOCOMMON);frchain(&y);TEST fprintf(diagfile, "\nend of symbol table, start of gonelist");/* now declare variables that are no longer in the symbol table */dclchain(gonelist, NOCOMMON);TEST fprintf(diagfile, "\nbeginning of hidlist");dclchain(hidlist, NOCOMMON);dclchain(tempvarlist, NOCOMMON);/* finally put out equivalence statements that are generated    because of structure and character variables*/for(p = genequivs; p ; p = p->nextp)	{	q = p->datap;	p2stmt(0);	first = 1;	p2key(FEQUIVALENCE);	p2str( "(" );	for(i=0; i<NFTNTYPES; ++i)		if(q->vbase[i])			{			if(first) first = 0;			else p2str( ", " );			p2str(ftnames[ q->vbase[i] ]);			p2str( "(1" );			if(q1 = q->vdim)				for(q1 = q1->datap; q1 ; q1 = q1->nextp)					p2str( ",1" );			p2str( ")" );			}	p2str( ")" );	}frchain(&genequivs);}prcomm(p)register ptr p;{register int first;register ptr q;p2stmt(0);p2key(FCOMMON);p2str( "/" );p2str(p->comname);p2str("/ ");first = 1;for(q = p->comchain ; q; q = q->nextp)	{	if(first) first=0;	else p2str(", ");	prname(q->datap);	}dclchain(p->comchain, DOCOMMON);}prname(p)register ptr p;{register int i;switch(p->tag)	{	case TCONST:		p2str(p->leftp);		return;	case TNAME:		if( ! p->vdcldone )			if(p->blklevel == 1)				dclit(p);			else	mkftnp(p);		for(i=0; i<NFTNTYPES ; ++i)			if(p->vbase[i])				{				p2str(ftnames[p->vbase[i]]);				return;				}		fatal1("prname: no fortran types for name %s",			p->sthead->namep);	case TFTNBLOCK:		for(i=0; i<NFTNTYPES ; ++i)			if(p->vbase[i])				{				p2str(ftnames[p->vbase[i]]);				return;				}		return;	default:		badtag("prname", p->tag);	}}dclchain(chp, okcom)ptr chp;int okcom;{extern char *ftntypes[];register ptr pn, p;register int i;int first, nline;ptr q,v;int ntypes;int size,align,mask;int subval;nline = 0;for(pn = chp ; pn ; pn = pn->nextp)	{	p = pn->datap;	if( (p->tag==TNAME || p->tag==TTEMP) && p->vext!=0)		{		if(nline%NAMESPERLINE == 0)			{			p2stmt(0);			p2key(FEXTERNAL);			}		else	p2str(", ");		++nline;		p2str(ftnames[p->vextbase]);		}	}for(pn = chp ; pn ; pn = pn->nextp)	{	p = pn->datap;	if( (p->tag==TNAME || p->tag==TTEMP) &&	    p->vtype==TYSTRUCT && p->vclass!=CLARG)		{		ntypes = 0;		for(i=0; i<NFTNTYPES; ++i)			if(p->vbase[i])				++ntypes;		if(ntypes > 1)			genequivs = mkchain(p, genequivs);		}	}for(i=0; i<NFTNTYPES; ++i)	{	nline = 0;	for(pn = chp; pn ; pn = pn->nextp)		{		p = pn->datap;		if( (p->tag==TNAME || p->tag==TTEMP) &&		    p->vtype!=TYSUBR && p->vbase[i]!=0 &&		    (okcom || p->vclass!=CLCOMMON) )			{			if(nline%NAMESPERLINE == 0)				{				p2stmt(0);				p2str(ftntypes[i]);				}			else	p2str( ", " );			++nline;			p2str(ftnames[p->vbase[i]]);			first = -1;					if(p->vtype==TYCHAR || p->vtype==TYSTRUCT ||			   (p->vtype==TYLCOMPLEX && tailor.lngcxtype==NULL))				{				p2str( "(" );				sizalign(p, &size,&align,&mask);				p2int( size/tailor.ftnsize[i] );				first = 0;				}			else if(p->vdim)				{				p2str( "(" );				first = 1;				}			if(first >=0)				{				if(q = p->vdim)				    for(q = q->datap ; q ; q = q->nextp)					{					if(q->upperb == 0)						{						q->upperb = mkint(1);						if(q->lowerb)							{							frexpr(q->lowerb);							q->lowerb = 0;							}						}					else if(q->lowerb)						{						v = fold( mknode(TAROP,OPMINUS,							mkint(1),cpexpr(q->lowerb)) );						v = fold( mknode(TAROP,OPPLUS,							cpexpr(q->upperb),v) );						q->lowerb = 0;						q->upperb = v;						}					if(first) first = 0;					else p2str( ", " );					v = q->upperb = simple(RVAL,q->upperb);					if( (v->tag==TNAME && v->vclass==CLARG) ||					    (isicon(v,&subval) && subval>0) )						prname(v);					else	dclerr("invalid array bound",						p->sthead->namep);					}				p2str( ")" );				}			}		}	}}

⌨️ 快捷键说明

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