1*47951Sbostic /*-
2*47951Sbostic * Copyright (c) 1980 The Regents of the University of California.
3*47951Sbostic * All rights reserved.
4*47951Sbostic *
5*47951Sbostic * %sccs.include.proprietary.c%
643215Sbostic */
743215Sbostic
843215Sbostic #ifndef lint
9*47951Sbostic static char sccsid[] = "@(#)misc.c 5.2 (Berkeley) 04/12/91";
10*47951Sbostic #endif /* not lint */
1143215Sbostic
1243215Sbostic /*
1343215Sbostic * misc.c
1443215Sbostic *
1543215Sbostic * Miscellaneous routines for the f77 compiler, 4.2 BSD.
1643215Sbostic *
1743215Sbostic * University of Utah CS Dept modification history:
1843215Sbostic *
1943215Sbostic * $Log: misc.c,v $
2043215Sbostic * Revision 3.1 84/10/13 01:53:26 donn
2143215Sbostic * Installed Jerry Berkman's version; added UofU comment header.
2243215Sbostic *
2343215Sbostic */
2443215Sbostic
2543215Sbostic #include "defs.h"
2643215Sbostic
2743215Sbostic
2843215Sbostic
cpn(n,a,b)2943215Sbostic cpn(n, a, b)
3043215Sbostic register int n;
3143215Sbostic register char *a, *b;
3243215Sbostic {
3343215Sbostic while(--n >= 0)
3443215Sbostic *b++ = *a++;
3543215Sbostic }
3643215Sbostic
3743215Sbostic
3843215Sbostic
eqn(n,a,b)3943215Sbostic eqn(n, a, b)
4043215Sbostic register int n;
4143215Sbostic register char *a, *b;
4243215Sbostic {
4343215Sbostic while(--n >= 0)
4443215Sbostic if(*a++ != *b++)
4543215Sbostic return(NO);
4643215Sbostic return(YES);
4743215Sbostic }
4843215Sbostic
4943215Sbostic
5043215Sbostic
5143215Sbostic
5243215Sbostic
5343215Sbostic
5443215Sbostic
cmpstr(a,b,la,lb)5543215Sbostic cmpstr(a, b, la, lb) /* compare two strings */
5643215Sbostic register char *a, *b;
5743215Sbostic ftnint la, lb;
5843215Sbostic {
5943215Sbostic register char *aend, *bend;
6043215Sbostic aend = a + la;
6143215Sbostic bend = b + lb;
6243215Sbostic
6343215Sbostic
6443215Sbostic if(la <= lb)
6543215Sbostic {
6643215Sbostic while(a < aend)
6743215Sbostic if(*a != *b)
6843215Sbostic return( *a - *b );
6943215Sbostic else
7043215Sbostic { ++a; ++b; }
7143215Sbostic
7243215Sbostic while(b < bend)
7343215Sbostic if(*b != ' ')
7443215Sbostic return(' ' - *b);
7543215Sbostic else
7643215Sbostic ++b;
7743215Sbostic }
7843215Sbostic
7943215Sbostic else
8043215Sbostic {
8143215Sbostic while(b < bend)
8243215Sbostic if(*a != *b)
8343215Sbostic return( *a - *b );
8443215Sbostic else
8543215Sbostic { ++a; ++b; }
8643215Sbostic while(a < aend)
8743215Sbostic if(*a != ' ')
8843215Sbostic return(*a - ' ');
8943215Sbostic else
9043215Sbostic ++a;
9143215Sbostic }
9243215Sbostic return(0);
9343215Sbostic }
9443215Sbostic
9543215Sbostic
9643215Sbostic
9743215Sbostic
9843215Sbostic
hookup(x,y)9943215Sbostic chainp hookup(x,y)
10043215Sbostic register chainp x, y;
10143215Sbostic {
10243215Sbostic register chainp p;
10343215Sbostic
10443215Sbostic if(x == NULL)
10543215Sbostic return(y);
10643215Sbostic
10743215Sbostic for(p = x ; p->nextp ; p = p->nextp)
10843215Sbostic ;
10943215Sbostic p->nextp = y;
11043215Sbostic return(x);
11143215Sbostic }
11243215Sbostic
11343215Sbostic
11443215Sbostic
mklist(p)11543215Sbostic struct Listblock *mklist(p)
11643215Sbostic chainp p;
11743215Sbostic {
11843215Sbostic register struct Listblock *q;
11943215Sbostic
12043215Sbostic q = ALLOC(Listblock);
12143215Sbostic q->tag = TLIST;
12243215Sbostic q->listp = p;
12343215Sbostic return(q);
12443215Sbostic }
12543215Sbostic
12643215Sbostic
mkchain(p,q)12743215Sbostic chainp mkchain(p,q)
12843215Sbostic register tagptr p;
12943215Sbostic register chainp q;
13043215Sbostic {
13143215Sbostic register chainp r;
13243215Sbostic
13343215Sbostic if(chains)
13443215Sbostic {
13543215Sbostic r = chains;
13643215Sbostic chains = chains->nextp;
13743215Sbostic }
13843215Sbostic else
13943215Sbostic r = ALLOC(Chain);
14043215Sbostic
14143215Sbostic r->datap = p;
14243215Sbostic r->nextp = q;
14343215Sbostic return(r);
14443215Sbostic }
14543215Sbostic
14643215Sbostic
14743215Sbostic
varstr(n,s)14843215Sbostic char * varstr(n, s)
14943215Sbostic register int n;
15043215Sbostic register char *s;
15143215Sbostic {
15243215Sbostic register int i;
15343215Sbostic static char name[XL+1];
15443215Sbostic
15543215Sbostic for(i=0; i<n && *s!=' ' && *s!='\0' ; ++i)
15643215Sbostic name[i] = *s++;
15743215Sbostic
15843215Sbostic name[i] = '\0';
15943215Sbostic
16043215Sbostic return( name );
16143215Sbostic }
16243215Sbostic
16343215Sbostic
16443215Sbostic
16543215Sbostic
varunder(n,s)16643215Sbostic char * varunder(n, s)
16743215Sbostic register int n;
16843215Sbostic register char *s;
16943215Sbostic {
17043215Sbostic register int i;
17143215Sbostic static char name[XL+1];
17243215Sbostic
17343215Sbostic for(i=0; i<n && *s!=' ' && *s!='\0' ; ++i)
17443215Sbostic name[i] = *s++;
17543215Sbostic
17643215Sbostic #if TARGET != GCOS
17743215Sbostic name[i++] = '_';
17843215Sbostic #endif
17943215Sbostic
18043215Sbostic name[i] = '\0';
18143215Sbostic
18243215Sbostic return( name );
18343215Sbostic }
18443215Sbostic
18543215Sbostic
18643215Sbostic
18743215Sbostic
18843215Sbostic
nounder(n,s)18943215Sbostic char * nounder(n, s)
19043215Sbostic register int n;
19143215Sbostic register char *s;
19243215Sbostic {
19343215Sbostic register int i;
19443215Sbostic static char name[XL+1];
19543215Sbostic
19643215Sbostic for(i=0; i<n && *s!=' ' && *s!='\0' ; ++s)
19743215Sbostic if(*s != '_')
19843215Sbostic name[i++] = *s;
19943215Sbostic
20043215Sbostic name[i] = '\0';
20143215Sbostic
20243215Sbostic return( name );
20343215Sbostic }
20443215Sbostic
20543215Sbostic
20643215Sbostic
copyn(n,s)20743215Sbostic char *copyn(n, s)
20843215Sbostic register int n;
20943215Sbostic register char *s;
21043215Sbostic {
21143215Sbostic register char *p, *q;
21243215Sbostic
21343215Sbostic p = q = (char *) ckalloc(n);
21443215Sbostic while(--n >= 0)
21543215Sbostic *q++ = *s++;
21643215Sbostic return(p);
21743215Sbostic }
21843215Sbostic
21943215Sbostic
22043215Sbostic
copys(s)22143215Sbostic char *copys(s)
22243215Sbostic char *s;
22343215Sbostic {
22443215Sbostic return( copyn( strlen(s)+1 , s) );
22543215Sbostic }
22643215Sbostic
22743215Sbostic
22843215Sbostic
convci(n,s)22943215Sbostic ftnint convci(n, s)
23043215Sbostic register int n;
23143215Sbostic register char *s;
23243215Sbostic {
23343215Sbostic ftnint sum;
23443215Sbostic ftnint digval;
23543215Sbostic sum = 0;
23643215Sbostic while(n-- > 0)
23743215Sbostic {
23843215Sbostic if (sum > MAXINT/10 ) {
23943215Sbostic err("integer constant too large");
24043215Sbostic return(sum);
24143215Sbostic }
24243215Sbostic sum *= 10;
24343215Sbostic digval = *s++ - '0';
24443215Sbostic #if (TARGET == TAHOE)
24543215Sbostic sum += digval;
24643215Sbostic #endif
24743215Sbostic #if (TARGET == VAX)
24843215Sbostic if ( MAXINT - sum >= digval ) {
24943215Sbostic sum += digval;
25043215Sbostic } else {
25143215Sbostic /* KLUDGE. On VAXs, MININT is (-MAXINT)-1 , i.e., there
25243215Sbostic is one more neg. integer than pos. integer. The
25343215Sbostic following code returns MININT whenever (MAXINT+1)
25443215Sbostic is seen. On VAXs, such statements as: i = MININT
25543215Sbostic work, although this generates garbage for
25643215Sbostic such statements as: i = MPLUS1 where MPLUS1 is MAXINT+1
25743215Sbostic or: i = 5 - 2147483647/2 .
25843215Sbostic The only excuse for this kludge is it keeps all legal
25943215Sbostic programs running and flags most illegal constants, unlike
26043215Sbostic the previous version which flaged nothing outside data stmts!
26143215Sbostic */
26243215Sbostic if ( n == 0 && MAXINT - sum + 1 == digval ) {
26343215Sbostic warn("minimum negative integer compiled - possibly bad code");
26443215Sbostic sum = MININT;
26543215Sbostic } else {
26643215Sbostic err("integer constant too large");
26743215Sbostic return(sum);
26843215Sbostic }
26943215Sbostic }
27043215Sbostic #endif
27143215Sbostic }
27243215Sbostic return(sum);
27343215Sbostic }
27443215Sbostic
convic(n)27543215Sbostic char *convic(n)
27643215Sbostic ftnint n;
27743215Sbostic {
27843215Sbostic static char s[20];
27943215Sbostic register char *t;
28043215Sbostic
28143215Sbostic s[19] = '\0';
28243215Sbostic t = s+19;
28343215Sbostic
28443215Sbostic do {
28543215Sbostic *--t = '0' + n%10;
28643215Sbostic n /= 10;
28743215Sbostic } while(n > 0);
28843215Sbostic
28943215Sbostic return(t);
29043215Sbostic }
29143215Sbostic
29243215Sbostic
29343215Sbostic
convcd(n,s)29443215Sbostic double convcd(n, s)
29543215Sbostic int n;
29643215Sbostic register char *s;
29743215Sbostic {
29843215Sbostic double atof();
29943215Sbostic char v[100];
30043215Sbostic register char *t;
30143215Sbostic if(n > 90)
30243215Sbostic {
30343215Sbostic err("too many digits in floating constant");
30443215Sbostic n = 90;
30543215Sbostic }
30643215Sbostic for(t = v ; n-- > 0 ; s++)
30743215Sbostic *t++ = (*s=='d' ? 'e' : *s);
30843215Sbostic *t = '\0';
30943215Sbostic return( atof(v) );
31043215Sbostic }
31143215Sbostic
31243215Sbostic
31343215Sbostic
mkname(l,s)31443215Sbostic Namep mkname(l, s)
31543215Sbostic int l;
31643215Sbostic register char *s;
31743215Sbostic {
31843215Sbostic struct Hashentry *hp;
31943215Sbostic int hash;
32043215Sbostic register Namep q;
32143215Sbostic register int i;
32243215Sbostic char n[VL];
32343215Sbostic
32443215Sbostic hash = 0;
32543215Sbostic for(i = 0 ; i<l && *s!='\0' ; ++i)
32643215Sbostic {
32743215Sbostic hash += *s;
32843215Sbostic n[i] = *s++;
32943215Sbostic }
33043215Sbostic hash %= maxhash;
33143215Sbostic while( i < VL )
33243215Sbostic n[i++] = ' ';
33343215Sbostic
33443215Sbostic hp = hashtab + hash;
33543215Sbostic while(q = hp->varp)
33643215Sbostic if( hash==hp->hashval && eqn(VL,n,q->varname) )
33743215Sbostic return(q);
33843215Sbostic else if(++hp >= lasthash)
33943215Sbostic hp = hashtab;
34043215Sbostic
34143215Sbostic if(++nintnames >= maxhash-1)
34243215Sbostic many("names", 'n');
34343215Sbostic hp->varp = q = ALLOC(Nameblock);
34443215Sbostic hp->hashval = hash;
34543215Sbostic q->tag = TNAME;
34643215Sbostic cpn(VL, n, q->varname);
34743215Sbostic return(q);
34843215Sbostic }
34943215Sbostic
35043215Sbostic
35143215Sbostic
mklabel(l)35243215Sbostic struct Labelblock *mklabel(l)
35343215Sbostic ftnint l;
35443215Sbostic {
35543215Sbostic register struct Labelblock *lp;
35643215Sbostic
35743215Sbostic if(l <= 0 || l > 99999 ) {
35843215Sbostic errstr("illegal label %d", l);
35943215Sbostic return(NULL);
36043215Sbostic }
36143215Sbostic
36243215Sbostic for(lp = labeltab ; lp < highlabtab ; ++lp)
36343215Sbostic if(lp->stateno == l)
36443215Sbostic return(lp);
36543215Sbostic
36643215Sbostic if(++highlabtab > labtabend)
36743215Sbostic many("statement numbers", 's');
36843215Sbostic
36943215Sbostic lp->stateno = l;
37043215Sbostic lp->labelno = newlabel();
37143215Sbostic lp->blklevel = 0;
37243215Sbostic lp->labused = NO;
37343215Sbostic lp->labdefined = NO;
37443215Sbostic lp->labinacc = NO;
37543215Sbostic lp->labtype = LABUNKNOWN;
37643215Sbostic return(lp);
37743215Sbostic }
37843215Sbostic
37943215Sbostic
newlabel()38043215Sbostic newlabel()
38143215Sbostic {
38243215Sbostic return( ++lastlabno );
38343215Sbostic }
38443215Sbostic
38543215Sbostic
38643215Sbostic /* this label appears in a branch context */
38743215Sbostic
execlab(stateno)38843215Sbostic struct Labelblock *execlab(stateno)
38943215Sbostic ftnint stateno;
39043215Sbostic {
39143215Sbostic register struct Labelblock *lp;
39243215Sbostic
39343215Sbostic if(lp = mklabel(stateno))
39443215Sbostic {
39543215Sbostic if(lp->labinacc)
39643215Sbostic warn1("illegal branch to inner block, statement %s",
39743215Sbostic convic(stateno) );
39843215Sbostic else if(lp->labdefined == NO)
39943215Sbostic lp->blklevel = blklevel;
40043215Sbostic lp->labused = YES;
40143215Sbostic if(lp->labtype == LABFORMAT)
40243215Sbostic err("may not branch to a format");
40343215Sbostic else
40443215Sbostic lp->labtype = LABEXEC;
40543215Sbostic }
40643215Sbostic
40743215Sbostic return(lp);
40843215Sbostic }
40943215Sbostic
41043215Sbostic
41143215Sbostic
41243215Sbostic
41343215Sbostic
41443215Sbostic /* find or put a name in the external symbol table */
41543215Sbostic
mkext(s)41643215Sbostic struct Extsym *mkext(s)
41743215Sbostic char *s;
41843215Sbostic {
41943215Sbostic int i;
42043215Sbostic register char *t;
42143215Sbostic char n[XL];
42243215Sbostic struct Extsym *p;
42343215Sbostic
42443215Sbostic i = 0;
42543215Sbostic t = n;
42643215Sbostic while(i<XL && *s)
42743215Sbostic *t++ = *s++;
42843215Sbostic while(t < n+XL)
42943215Sbostic *t++ = ' ';
43043215Sbostic
43143215Sbostic for(p = extsymtab ; p<nextext ; ++p)
43243215Sbostic if(eqn(XL, n, p->extname))
43343215Sbostic return( p );
43443215Sbostic
43543215Sbostic if(nextext >= lastext)
43643215Sbostic many("external symbols", 'x');
43743215Sbostic
43843215Sbostic cpn(XL, n, nextext->extname);
43943215Sbostic nextext->extstg = STGUNKNOWN;
44043215Sbostic nextext->extsave = NO;
44143215Sbostic nextext->extp = 0;
44243215Sbostic nextext->extleng = 0;
44343215Sbostic nextext->maxleng = 0;
44443215Sbostic nextext->extinit = NO;
44543215Sbostic return( nextext++ );
44643215Sbostic }
44743215Sbostic
44843215Sbostic
44943215Sbostic
45043215Sbostic
45143215Sbostic
45243215Sbostic
45343215Sbostic
45443215Sbostic
builtin(t,s)45543215Sbostic Addrp builtin(t, s)
45643215Sbostic int t;
45743215Sbostic char *s;
45843215Sbostic {
45943215Sbostic register struct Extsym *p;
46043215Sbostic register Addrp q;
46143215Sbostic
46243215Sbostic p = mkext(s);
46343215Sbostic if(p->extstg == STGUNKNOWN)
46443215Sbostic p->extstg = STGEXT;
46543215Sbostic else if(p->extstg != STGEXT)
46643215Sbostic {
46743215Sbostic errstr("improper use of builtin %s", s);
46843215Sbostic return(0);
46943215Sbostic }
47043215Sbostic
47143215Sbostic q = ALLOC(Addrblock);
47243215Sbostic q->tag = TADDR;
47343215Sbostic q->vtype = t;
47443215Sbostic q->vclass = CLPROC;
47543215Sbostic q->vstg = STGEXT;
47643215Sbostic q->memno = p - extsymtab;
47743215Sbostic return(q);
47843215Sbostic }
47943215Sbostic
48043215Sbostic
48143215Sbostic
frchain(p)48243215Sbostic frchain(p)
48343215Sbostic register chainp *p;
48443215Sbostic {
48543215Sbostic register chainp q;
48643215Sbostic
48743215Sbostic if(p==0 || *p==0)
48843215Sbostic return;
48943215Sbostic
49043215Sbostic for(q = *p; q->nextp ; q = q->nextp)
49143215Sbostic ;
49243215Sbostic q->nextp = chains;
49343215Sbostic chains = *p;
49443215Sbostic *p = 0;
49543215Sbostic }
49643215Sbostic
49743215Sbostic
cpblock(n,p)49843215Sbostic tagptr cpblock(n,p)
49943215Sbostic register int n;
50043215Sbostic register char * p;
50143215Sbostic {
50243215Sbostic register char *q;
50343215Sbostic ptr q0;
50443215Sbostic
50543215Sbostic q0 = ckalloc(n);
50643215Sbostic q = (char *) q0;
50743215Sbostic while(n-- > 0)
50843215Sbostic *q++ = *p++;
50943215Sbostic return( (tagptr) q0);
51043215Sbostic }
51143215Sbostic
51243215Sbostic
51343215Sbostic
max(a,b)51443215Sbostic max(a,b)
51543215Sbostic int a,b;
51643215Sbostic {
51743215Sbostic return( a>b ? a : b);
51843215Sbostic }
51943215Sbostic
52043215Sbostic
lmax(a,b)52143215Sbostic ftnint lmax(a, b)
52243215Sbostic ftnint a, b;
52343215Sbostic {
52443215Sbostic return( a>b ? a : b);
52543215Sbostic }
52643215Sbostic
lmin(a,b)52743215Sbostic ftnint lmin(a, b)
52843215Sbostic ftnint a, b;
52943215Sbostic {
53043215Sbostic return(a < b ? a : b);
53143215Sbostic }
53243215Sbostic
53343215Sbostic
53443215Sbostic
53543215Sbostic
maxtype(t1,t2)53643215Sbostic maxtype(t1, t2)
53743215Sbostic int t1, t2;
53843215Sbostic {
53943215Sbostic int t;
54043215Sbostic
54143215Sbostic t = max(t1, t2);
54243215Sbostic if(t==TYCOMPLEX && (t1==TYDREAL || t2==TYDREAL) )
54343215Sbostic t = TYDCOMPLEX;
54443215Sbostic return(t);
54543215Sbostic }
54643215Sbostic
54743215Sbostic
54843215Sbostic
54943215Sbostic /* return log base 2 of n if n a power of 2; otherwise -1 */
55043215Sbostic #if FAMILY == PCC
log2(n)55143215Sbostic log2(n)
55243215Sbostic ftnint n;
55343215Sbostic {
55443215Sbostic int k;
55543215Sbostic
55643215Sbostic /* trick based on binary representation */
55743215Sbostic
55843215Sbostic if(n<=0 || (n & (n-1))!=0)
55943215Sbostic return(-1);
56043215Sbostic
56143215Sbostic for(k = 0 ; n >>= 1 ; ++k)
56243215Sbostic ;
56343215Sbostic return(k);
56443215Sbostic }
56543215Sbostic #endif
56643215Sbostic
56743215Sbostic
56843215Sbostic
frrpl()56943215Sbostic frrpl()
57043215Sbostic {
57143215Sbostic struct Rplblock *rp;
57243215Sbostic
57343215Sbostic while(rpllist)
57443215Sbostic {
57543215Sbostic rp = rpllist->rplnextp;
57643215Sbostic free( (charptr) rpllist);
57743215Sbostic rpllist = rp;
57843215Sbostic }
57943215Sbostic }
58043215Sbostic
58143215Sbostic
58243215Sbostic
callk(type,name,args)58343215Sbostic expptr callk(type, name, args)
58443215Sbostic int type;
58543215Sbostic char *name;
58643215Sbostic chainp args;
58743215Sbostic {
58843215Sbostic register expptr p;
58943215Sbostic
59043215Sbostic p = mkexpr(OPCALL, builtin(type,name), args);
59143215Sbostic p->exprblock.vtype = type;
59243215Sbostic return(p);
59343215Sbostic }
59443215Sbostic
59543215Sbostic
59643215Sbostic
call4(type,name,arg1,arg2,arg3,arg4)59743215Sbostic expptr call4(type, name, arg1, arg2, arg3, arg4)
59843215Sbostic int type;
59943215Sbostic char *name;
60043215Sbostic expptr arg1, arg2, arg3, arg4;
60143215Sbostic {
60243215Sbostic struct Listblock *args;
60343215Sbostic args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3,
60443215Sbostic mkchain(arg4, CHNULL)) ) ) );
60543215Sbostic return( callk(type, name, args) );
60643215Sbostic }
60743215Sbostic
60843215Sbostic
60943215Sbostic
61043215Sbostic
call3(type,name,arg1,arg2,arg3)61143215Sbostic expptr call3(type, name, arg1, arg2, arg3)
61243215Sbostic int type;
61343215Sbostic char *name;
61443215Sbostic expptr arg1, arg2, arg3;
61543215Sbostic {
61643215Sbostic struct Listblock *args;
61743215Sbostic args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3, CHNULL) ) ) );
61843215Sbostic return( callk(type, name, args) );
61943215Sbostic }
62043215Sbostic
62143215Sbostic
62243215Sbostic
62343215Sbostic
62443215Sbostic
call2(type,name,arg1,arg2)62543215Sbostic expptr call2(type, name, arg1, arg2)
62643215Sbostic int type;
62743215Sbostic char *name;
62843215Sbostic expptr arg1, arg2;
62943215Sbostic {
63043215Sbostic struct Listblock *args;
63143215Sbostic
63243215Sbostic args = mklist( mkchain(arg1, mkchain(arg2, CHNULL) ) );
63343215Sbostic return( callk(type,name, args) );
63443215Sbostic }
63543215Sbostic
63643215Sbostic
63743215Sbostic
63843215Sbostic
call1(type,name,arg)63943215Sbostic expptr call1(type, name, arg)
64043215Sbostic int type;
64143215Sbostic char *name;
64243215Sbostic expptr arg;
64343215Sbostic {
64443215Sbostic return( callk(type,name, mklist(mkchain(arg,CHNULL)) ));
64543215Sbostic }
64643215Sbostic
64743215Sbostic
call0(type,name)64843215Sbostic expptr call0(type, name)
64943215Sbostic int type;
65043215Sbostic char *name;
65143215Sbostic {
65243215Sbostic return( callk(type, name, PNULL) );
65343215Sbostic }
65443215Sbostic
65543215Sbostic
65643215Sbostic
mkiodo(dospec,list)65743215Sbostic struct Impldoblock *mkiodo(dospec, list)
65843215Sbostic chainp dospec, list;
65943215Sbostic {
66043215Sbostic register struct Impldoblock *q;
66143215Sbostic
66243215Sbostic q = ALLOC(Impldoblock);
66343215Sbostic q->tag = TIMPLDO;
66443215Sbostic q->impdospec = dospec;
66543215Sbostic q->datalist = list;
66643215Sbostic return(q);
66743215Sbostic }
66843215Sbostic
66943215Sbostic
67043215Sbostic
67143215Sbostic
ckalloc(n)67243215Sbostic ptr ckalloc(n)
67343215Sbostic register int n;
67443215Sbostic {
67543215Sbostic register ptr p;
67643215Sbostic ptr calloc();
67743215Sbostic
67843215Sbostic if( p = calloc(1, (unsigned) n) )
67943215Sbostic return(p);
68043215Sbostic
68143215Sbostic fatal("out of memory");
68243215Sbostic /* NOTREACHED */
68343215Sbostic }
68443215Sbostic
68543215Sbostic
68643215Sbostic
68743215Sbostic
68843215Sbostic
isaddr(p)68943215Sbostic isaddr(p)
69043215Sbostic register expptr p;
69143215Sbostic {
69243215Sbostic if(p->tag == TADDR)
69343215Sbostic return(YES);
69443215Sbostic if(p->tag == TEXPR)
69543215Sbostic switch(p->exprblock.opcode)
69643215Sbostic {
69743215Sbostic case OPCOMMA:
69843215Sbostic return( isaddr(p->exprblock.rightp) );
69943215Sbostic
70043215Sbostic case OPASSIGN:
70143215Sbostic case OPPLUSEQ:
70243215Sbostic return( isaddr(p->exprblock.leftp) );
70343215Sbostic }
70443215Sbostic return(NO);
70543215Sbostic }
70643215Sbostic
70743215Sbostic
70843215Sbostic
70943215Sbostic
isstatic(p)71043215Sbostic isstatic(p)
71143215Sbostic register expptr p;
71243215Sbostic {
71343215Sbostic if(p->headblock.vleng && !ISCONST(p->headblock.vleng))
71443215Sbostic return(NO);
71543215Sbostic
71643215Sbostic switch(p->tag)
71743215Sbostic {
71843215Sbostic case TCONST:
71943215Sbostic return(YES);
72043215Sbostic
72143215Sbostic case TADDR:
72243215Sbostic if(ONEOF(p->addrblock.vstg,MSKSTATIC) &&
72343215Sbostic ISCONST(p->addrblock.memoffset))
72443215Sbostic return(YES);
72543215Sbostic
72643215Sbostic default:
72743215Sbostic return(NO);
72843215Sbostic }
72943215Sbostic }
73043215Sbostic
73143215Sbostic
73243215Sbostic
addressable(p)73343215Sbostic addressable(p)
73443215Sbostic register expptr p;
73543215Sbostic {
73643215Sbostic switch(p->tag)
73743215Sbostic {
73843215Sbostic case TCONST:
73943215Sbostic return(YES);
74043215Sbostic
74143215Sbostic case TADDR:
74243215Sbostic return( addressable(p->addrblock.memoffset) );
74343215Sbostic
74443215Sbostic default:
74543215Sbostic return(NO);
74643215Sbostic }
74743215Sbostic }
74843215Sbostic
74943215Sbostic
75043215Sbostic
hextoi(c)75143215Sbostic hextoi(c)
75243215Sbostic register int c;
75343215Sbostic {
75443215Sbostic register char *p;
75543215Sbostic static char p0[17] = "0123456789abcdef";
75643215Sbostic
75743215Sbostic for(p = p0 ; *p ; ++p)
75843215Sbostic if(*p == c)
75943215Sbostic return( p-p0 );
76043215Sbostic return(16);
76143215Sbostic }
762