X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/47621762e2dee2321ca27787ee4435da3c5f94b9..ec8b7f804cb07583fb603480f1ebe5db1abf1a73:/usr/src/cmd/f77/misc.c diff --git a/usr/src/cmd/f77/misc.c b/usr/src/cmd/f77/misc.c index a40f181558..3434836340 100644 --- a/usr/src/cmd/f77/misc.c +++ b/usr/src/cmd/f77/misc.c @@ -101,7 +101,8 @@ return(q); chainp mkchain(p,q) -register int p, q; +register tagptr p; +register chainp q; { register chainp r; @@ -185,7 +186,7 @@ register char *s; { register char *p, *q; -p = q = ckalloc(n); +p = q = (char *) ckalloc(n); while(--n >= 0) *q++ = *s++; return(p); @@ -251,13 +252,13 @@ return( atof(v) ); -struct Nameblock *mkname(l, s) +Namep mkname(l, s) int l; register char *s; { struct Hashentry *hp; int hash; -register struct Nameblock *q; +register Namep q; register int i; char n[VL]; @@ -267,7 +268,7 @@ for(i = 0 ; ivarp) else if(++hp >= lasthash) hp = hashtab; -if(++nintnames >= MAXHASH-1) +if(++nintnames >= maxhash-1) many("names", 'n'); hp->varp = q = ALLOC(Nameblock); hp->hashval = hash; @@ -321,6 +322,36 @@ return( ++lastlabno ); } +/* this label appears in a branch context */ + +struct Labelblock *execlab(stateno) +ftnint stateno; +{ +register struct Labelblock *lp; + +if(lp = mklabel(stateno)) + { + if(lp->labinacc) + warn1("illegal branch to inner block, statement %s", + convic(stateno) ); + else if(lp->labdefined == NO) + lp->blklevel = blklevel; + lp->labused = YES; + if(lp->labtype == LABFORMAT) + err("may not branch to a format"); + else + lp->labtype = LABEXEC; + } +else + execerr("illegal label %s", convic(stateno)); + +return(lp); +} + + + + + /* find or put a name in the external symbol table */ struct Extsym *mkext(s) @@ -362,12 +393,12 @@ return( nextext++ ); -struct Addrblock *builtin(t, s) +Addrp builtin(t, s) int t; char *s; { register struct Extsym *p; -register struct Addrblock *q; +register Addrp q; p = mkext(s); if(p->extstg == STGUNKNOWN) @@ -405,17 +436,18 @@ chains = *p; } -ptr cpblock(n,p) +tagptr cpblock(n,p) register int n; register char * p; { register char *q; ptr q0; -q = q0 = ckalloc(n); +q0 = ckalloc(n); +q = (char *) q0; while(n-- > 0) *q++ = *p++; -return(q0); +return( (tagptr) q0); } @@ -481,61 +513,49 @@ struct Rplblock *rp; while(rpllist) { - rp = rpllist->nextp; - free(rpllist); + rp = rpllist->rplnextp; + free( (charptr) 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) +expptr callk(type, name, args) int type; char *name; chainp args; { -register struct Exprblock *p; +register expptr p; p = mkexpr(OPCALL, builtin(type,name), args); -p->vtype = type; +p->exprblock.vtype = type; return(p); } -struct Exprblock *call4(type, name, arg1, arg2, arg3, arg4) +expptr 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)) ) ) ); +args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3, + mkchain(arg4, CHNULL)) ) ) ); return( callk(type, name, args) ); } -struct Exprblock *call3(type, name, arg1, arg2, arg3) +expptr 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) ) ) ); +args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3, CHNULL) ) ) ); return( callk(type, name, args) ); } @@ -543,34 +563,34 @@ return( callk(type, name, args) ); -struct Exprblock *call2(type, name, arg1, arg2) +expptr call2(type, name, arg1, arg2) int type; char *name; expptr arg1, arg2; { struct Listblock *args; -args = mklist( mkchain(arg1, mkchain(arg2, NULL) ) ); +args = mklist( mkchain(arg1, mkchain(arg2, CHNULL) ) ); return( callk(type,name, args) ); } -struct Exprblock *call1(type, name, arg) +expptr call1(type, name, arg) int type; char *name; expptr arg; { -return( callk(type,name, mklist(mkchain(arg,0)) )); +return( callk(type,name, mklist(mkchain(arg,CHNULL)) )); } -struct Exprblock *call0(type, name) +expptr call0(type, name) int type; char *name; { -return( callk(type, name, NULL) ); +return( callk(type, name, PNULL) ); } @@ -582,7 +602,7 @@ register struct Impldoblock *q; q = ALLOC(Impldoblock); q->tag = TIMPLDO; -q->varnp = dospec; +q->impdospec = dospec; q->datalist = list; return(q); } @@ -610,9 +630,9 @@ fatal("out of memory"); isaddr(p) register expptr p; { -if(p->headblock.tag == TADDR) +if(p->tag == TADDR) return(YES); -if(p->headblock.tag == TEXPR) +if(p->tag == TEXPR) switch(p->exprblock.opcode) { case OPCOMMA: @@ -628,11 +648,33 @@ return(NO); +isstatic(p) +register expptr p; +{ +if(p->headblock.vleng && !ISCONST(p->headblock.vleng)) + return(NO); + +switch(p->tag) + { + case TCONST: + return(YES); + + case TADDR: + if(ONEOF(p->addrblock.vstg,MSKSTATIC) && + ISCONST(p->addrblock.memoffset)) + return(YES); + + default: + return(NO); + } +} + + addressable(p) register expptr p; { -switch(p->headblock.tag) +switch(p->tag) { case TCONST: return(YES);