📄 namgen.c
字号:
#include "defs"impldecl(p)register ptr p;{extern char *types[];register ptr q;int n;if(p->vtype==TYSUBR) return;if(p->tag == TCALL) { impldecl(p->leftp); p->vtype = p->leftp->vtype; p->vtypep = p->leftp->vtypep; return; }if(inbound) n = TYINT;else { n = impltype[p->sthead->namep[0] - 'a' ]; if(n==TYREAL && p->vprec!=0) n = TYLREAL; sprintf(msg, "%s implicitly typed %s",p->sthead->namep, types[n]); warn(msg); }q = p->sthead->varp;p->vtype = q->vtype = n;if(p->blklevel>1 && p->vdclstart==0) { p->blklevel = q->blklevel = p->sthead->blklevel = 1; p->vdclstart = q->vdclstart = 1; --ndecl[blklevel]; ++ndecl[1]; }}extname(p)register ptr p;{register int i;register char *q, *s;/* if(p->vclass == CLARG) return; */if(p->vextbase) return;q = p->sthead->namep;setvproc(p, PROCYES);/* external names are automatically at block level 1 */if( (i =p->blklevel) >1) { p->sthead->blklevel = 1; p->blklevel = 1; p->sthead->varp->blklevel = 1; ++ndecl[1]; --ndecl[i]; }if(p->vclass!=CLUNDEFINED && p->vclass!=CLARG) { dclerr("illegal class for procedure", q); return; }if(p->vclass!=CLARG && strlen(q)>XL) { if(! ioop(q) ) dclerr("procedure name too long", q); return; }if(lookftn(q) > 0) dclerr("procedure name already used", q);else { for(i=0 ; i<NFTNTYPES ; ++i) if(p->vbase[i]) break; if(i < NFTNTYPES) p->vextbase = p->vbase[i]; else p->vextbase = nxtftn(); if(p->vext==0 || p->vclass!=CLARG) for(s = ftnames[ p->vextbase ]; *s++ = *q++ ; ) ; return; }}dclit(p)register ptr p;{register ptr q;if(p->tag == TERROR) return;q = p->sthead->varp;if(p->tag == TCALL) { dclit(p->leftp); if( ioop(p->leftp->sthead->namep) ) p->leftp->vtype = TYLOG; p->vtype = p->leftp->vtype; p->vtypep = p->leftp->vtypep; return; }if(q->vdcldone == 0) mkftnp(q);if(p != q) cpblock(q,p, sizeof(struct exprblock));}mkftnp(p)register ptr p;{int i,k;if(inbound || p->vdcldone) return;if(p == 0) fatal("mkftnp: zero argument");if(p->tag!=TNAME && p->tag!=TTEMP) badtag("mkftnp", p->tag);if(p->vtype == TYUNDEFINED) if(p->vextbase) return; else impldecl(p);p->vdcldone = 1;switch(p->vtype) { case TYCHAR: case TYINT: case TYREAL: case TYLREAL: case TYLOG: case TYCOMPLEX: case TYLCOMPLEX: p->vbase[ eflftn[p->vtype] ] = nxtftn(); break; case TYSTRUCT: k = p->vtypep->basetypes; for(i=0; i<NFTNTYPES ; ++i) if(k & ftnmask[i]) p->vbase[i] = nxtftn(); break; case TYSUBR: break; default: fatal1("invalid type for %s", p->sthead->namep); break; }}namegen(){register ptr p;register struct stentry **hp;register int i;for(hp = hashtab ; hp<hashend ; ++hp) if(*hp && (p = (*hp)->varp) ) if(p->tag == TNAME) mkft(p);for(p = gonelist ; p ; p = p->nextp) mkft(p->datap);for(p = hidlist ; p ; p = p->nextp) if(p->datap->tag == TNAME) mkft(p->datap);for(p = tempvarlist ; p ; p = p->nextp) mkft(p->datap);TEST fprintf(diagfile, "Fortran names:\n");TEST for(i=1; i<=nftnames ; ++i) fprintf(diagfile, "%s\n", ftnames[i]);}mkft(p)register ptr p;{int i;register char *s, *t;if(p->vnamedone) return;if(p->vdcldone==0 && p!=procname) { if(p->vext && p->vtype==TYUNDEFINED) p->vtype = TYSUBR; else if(p->vextbase==0 && p->vadjdim==0 && p->vclass!=CLCOMMON) warn1("%s never used", p->sthead->namep); mkftnp(p); }if(p->vextbase) mkftname(p->vextbase, p->sthead->namep);for(i=0; i<NFTNTYPES ; ++i) if(p->vbase[i] != 0) if(p!=procname && p->vextbase!=0) { s = ftnames[p->vextbase]; t = ftnames[p->vbase[i]]; while(*t++ = *s++ ) ; } else if(p->sthead) mkftname(p->vbase[i], p->sthead->namep); else mkftname(p->vbase[i], CHNULL);p->vnamedone = 1;}mkftname(n,s)int n;char *s;{int i, j;register int k;char fn[7];register char *c1, *c2;if(ftnames[n][0] != '\0') return;if(s==0 || *s=='\0') s = "temp";else if(*s == '_') ++s;k = strlen(s);for(i=0; i<k && i<(XL/2) ; ++i) fn[i] = s[i];if(k > XL) { s += (k-XL); k = XL; }for( ; i<k ; ++i) fn[i] = s[i];fn[i] = '\0';if( lookftn(fn) ) { if(k < XL) ++k; fn[k] = '\0'; c1 = fn + k-1; for(*c1 = '1' ; *c1 <= '9' ; *c1 += 1) if(lookftn(fn) == 0) goto nameok; if(k < XL) ++k; fn[k] = '\0'; c1 = fn + k-2; c2 = c1 + 1; for(*c1 = '1' ; *c1 <= '9' ; *c1 += 1) for(*c2 = '0' ; *c2 <= '9' ; *c2 += 1) if(lookftn(fn) == 0) goto nameok; fatal1("mkftname: cannot generate fortran name for %s", s); }nameok:for(j=0; j<=k ; ++j) ftnames[n][j] = fn[j];}nxtftn(){if( ++nftnames < MAXFTNAMES) { ftnames[nftnames][0] = '\0'; return(nftnames); }fatal("too many Fortran names generated");/* NOTREACHED */}lookftn(s)char *s;{register int i;for(i=1 ; i<=nftnames ; ++i) if(equals(ftnames[i],s)) return(i);return(0);}ptr mkftnblock(type, name)int type;char *name;{register struct varblock *p;register int k;p = allexpblock();p->tag = TFTNBLOCK;p->vtype = type;p->vdcldone = 1;if( (k = lookftn(name)) == 0) { k = nxtftn(); strcpy(ftnames[k], name); }p->vbase[ eflftn[type] ] = k;p->vextbase = k;return(p);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -