BSD 4 development
[unix-history] / usr / src / cmd / f77 / misc.c
index a40f181..3434836 100644 (file)
@@ -101,7 +101,8 @@ return(q);
 
 
 chainp mkchain(p,q)
 
 
 chainp mkchain(p,q)
-register int p, q;
+register tagptr p;
+register chainp q;
 {
 register chainp r;
 
 {
 register chainp r;
 
@@ -185,7 +186,7 @@ register char *s;
 {
 register char *p, *q;
 
 {
 register char *p, *q;
 
-p = q = ckalloc(n);
+p = q = (char *) ckalloc(n);
 while(--n >= 0)
        *q++ = *s++;
 return(p);
 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;
 int l;
 register char *s;
 {
 struct Hashentry *hp;
 int hash;
-register struct Nameblock *q;
+register Namep q;
 register int i;
 char n[VL];
 
 register int i;
 char n[VL];
 
@@ -267,7 +268,7 @@ for(i = 0 ; i<l && *s!='\0' ; ++i)
        hash += *s;
        n[i] = *s++;
        }
        hash += *s;
        n[i] = *s++;
        }
-hash %= MAXHASH;
+hash %= maxhash;
 while( i < VL )
        n[i++] = ' ';
 
 while( i < VL )
        n[i++] = ' ';
 
@@ -278,7 +279,7 @@ while(q = hp->varp)
        else if(++hp >= lasthash)
                hp = hashtab;
 
        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;
        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)
 /* 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;
 int t;
 char *s;
 {
 register struct Extsym *p;
-register struct Addrblock *q;
+register Addrp q;
 
 p = mkext(s);
 if(p->extstg == STGUNKNOWN)
 
 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;
 
 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++;
 while(n-- > 0)
        *q++ = *p++;
-return(q0);
+return( (tagptr) q0);
 }
 
 
 }
 
 
@@ -481,61 +513,49 @@ struct Rplblock *rp;
 
 while(rpllist)
        {
 
 while(rpllist)
        {
-       rp = rpllist->nextp;
-       free(rpllist);
+       rp = rpllist->rplnextp;
+       free( (charptr) rpllist);
        rpllist = rp;
        }
 }
 
 
        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;
 {
 int type;
 char *name;
 chainp args;
 {
-register struct Exprblock *p;
+register expptr p;
 
 p = mkexpr(OPCALL, builtin(type,name), args);
 
 p = mkexpr(OPCALL, builtin(type,name), args);
-p->vtype = type;
+p->exprblock.vtype = type;
 return(p);
 }
 
 
 
 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;
 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) );
 }
 
 
 
 
 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;
 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) );
 }
 
 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;
 
 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) );
 }
 
 
 
 
 return( callk(type,name, args) );
 }
 
 
 
 
-struct Exprblock *call1(type, name, arg)
+expptr call1(type, name, arg)
 int type;
 char *name;
 expptr 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;
 {
 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 = ALLOC(Impldoblock);
 q->tag = TIMPLDO;
-q->varnp = dospec;
+q->impdospec = dospec;
 q->datalist = list;
 return(q);
 }
 q->datalist = list;
 return(q);
 }
@@ -610,9 +630,9 @@ fatal("out of memory");
 isaddr(p)
 register expptr p;
 {
 isaddr(p)
 register expptr p;
 {
-if(p->headblock.tag == TADDR)
+if(p->tag == TADDR)
        return(YES);
        return(YES);
-if(p->headblock.tag == TEXPR)
+if(p->tag == TEXPR)
        switch(p->exprblock.opcode)
                {
                case OPCOMMA:
        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;
 {
 
 addressable(p)
 register expptr p;
 {
-switch(p->headblock.tag)
+switch(p->tag)
        {
        case TCONST:
                return(YES);
        {
        case TCONST:
                return(YES);