1*47955Sbostic /*-
2*47955Sbostic * Copyright (c) 1980 The Regents of the University of California.
3*47955Sbostic * All rights reserved.
4*47955Sbostic *
5*47955Sbostic * %sccs.include.proprietary.c%
622846Smckusick */
722846Smckusick
822846Smckusick #ifndef lint
9*47955Sbostic static char sccsid[] = "@(#)misc.c 5.3 (Berkeley) 04/12/91";
10*47955Sbostic #endif /* not lint */
1122846Smckusick
1222846Smckusick /*
1322846Smckusick * misc.c
1422846Smckusick *
1522846Smckusick * Miscellaneous routines for the f77 compiler, 4.2 BSD.
1622846Smckusick *
1722846Smckusick * University of Utah CS Dept modification history:
1822846Smckusick *
1922846Smckusick * $Log: misc.c,v $
2025743Sdonn * Revision 5.2 85/12/18 00:35:08 donn
2125743Sdonn * Prevent core dumps for peculiar statement numbers.
2225743Sdonn *
2325743Sdonn * Revision 5.1 85/08/10 03:48:29 donn
2425743Sdonn * 4.3 alpha
2525743Sdonn *
2622846Smckusick * Revision 3.1 84/10/13 01:53:26 donn
2722846Smckusick * Installed Jerry Berkman's version; added UofU comment header.
2822846Smckusick *
2922846Smckusick */
3022846Smckusick
3122846Smckusick #include "defs.h"
3222846Smckusick
3322846Smckusick
3422846Smckusick
cpn(n,a,b)3522846Smckusick cpn(n, a, b)
3622846Smckusick register int n;
3722846Smckusick register char *a, *b;
3822846Smckusick {
3922846Smckusick while(--n >= 0)
4022846Smckusick *b++ = *a++;
4122846Smckusick }
4222846Smckusick
4322846Smckusick
4422846Smckusick
eqn(n,a,b)4522846Smckusick eqn(n, a, b)
4622846Smckusick register int n;
4722846Smckusick register char *a, *b;
4822846Smckusick {
4922846Smckusick while(--n >= 0)
5022846Smckusick if(*a++ != *b++)
5122846Smckusick return(NO);
5222846Smckusick return(YES);
5322846Smckusick }
5422846Smckusick
5522846Smckusick
5622846Smckusick
5722846Smckusick
5822846Smckusick
5922846Smckusick
6022846Smckusick
cmpstr(a,b,la,lb)6122846Smckusick cmpstr(a, b, la, lb) /* compare two strings */
6222846Smckusick register char *a, *b;
6322846Smckusick ftnint la, lb;
6422846Smckusick {
6522846Smckusick register char *aend, *bend;
6622846Smckusick aend = a + la;
6722846Smckusick bend = b + lb;
6822846Smckusick
6922846Smckusick
7022846Smckusick if(la <= lb)
7122846Smckusick {
7222846Smckusick while(a < aend)
7322846Smckusick if(*a != *b)
7422846Smckusick return( *a - *b );
7522846Smckusick else
7622846Smckusick { ++a; ++b; }
7722846Smckusick
7822846Smckusick while(b < bend)
7922846Smckusick if(*b != ' ')
8022846Smckusick return(' ' - *b);
8122846Smckusick else
8222846Smckusick ++b;
8322846Smckusick }
8422846Smckusick
8522846Smckusick else
8622846Smckusick {
8722846Smckusick while(b < bend)
8822846Smckusick if(*a != *b)
8922846Smckusick return( *a - *b );
9022846Smckusick else
9122846Smckusick { ++a; ++b; }
9222846Smckusick while(a < aend)
9322846Smckusick if(*a != ' ')
9422846Smckusick return(*a - ' ');
9522846Smckusick else
9622846Smckusick ++a;
9722846Smckusick }
9822846Smckusick return(0);
9922846Smckusick }
10022846Smckusick
10122846Smckusick
10222846Smckusick
10322846Smckusick
10422846Smckusick
hookup(x,y)10522846Smckusick chainp hookup(x,y)
10622846Smckusick register chainp x, y;
10722846Smckusick {
10822846Smckusick register chainp p;
10922846Smckusick
11022846Smckusick if(x == NULL)
11122846Smckusick return(y);
11222846Smckusick
11322846Smckusick for(p = x ; p->nextp ; p = p->nextp)
11422846Smckusick ;
11522846Smckusick p->nextp = y;
11622846Smckusick return(x);
11722846Smckusick }
11822846Smckusick
11922846Smckusick
12022846Smckusick
mklist(p)12122846Smckusick struct Listblock *mklist(p)
12222846Smckusick chainp p;
12322846Smckusick {
12422846Smckusick register struct Listblock *q;
12522846Smckusick
12622846Smckusick q = ALLOC(Listblock);
12722846Smckusick q->tag = TLIST;
12822846Smckusick q->listp = p;
12922846Smckusick return(q);
13022846Smckusick }
13122846Smckusick
13222846Smckusick
mkchain(p,q)13322846Smckusick chainp mkchain(p,q)
13422846Smckusick register tagptr p;
13522846Smckusick register chainp q;
13622846Smckusick {
13722846Smckusick register chainp r;
13822846Smckusick
13922846Smckusick if(chains)
14022846Smckusick {
14122846Smckusick r = chains;
14222846Smckusick chains = chains->nextp;
14322846Smckusick }
14422846Smckusick else
14522846Smckusick r = ALLOC(Chain);
14622846Smckusick
14722846Smckusick r->datap = p;
14822846Smckusick r->nextp = q;
14922846Smckusick return(r);
15022846Smckusick }
15122846Smckusick
15222846Smckusick
15322846Smckusick
varstr(n,s)15422846Smckusick char * varstr(n, s)
15522846Smckusick register int n;
15622846Smckusick register char *s;
15722846Smckusick {
15822846Smckusick register int i;
15922846Smckusick static char name[XL+1];
16022846Smckusick
16122846Smckusick for(i=0; i<n && *s!=' ' && *s!='\0' ; ++i)
16222846Smckusick name[i] = *s++;
16322846Smckusick
16422846Smckusick name[i] = '\0';
16522846Smckusick
16622846Smckusick return( name );
16722846Smckusick }
16822846Smckusick
16922846Smckusick
17022846Smckusick
17122846Smckusick
varunder(n,s)17222846Smckusick char * varunder(n, s)
17322846Smckusick register int n;
17422846Smckusick register char *s;
17522846Smckusick {
17622846Smckusick register int i;
17722846Smckusick static char name[XL+1];
17822846Smckusick
17922846Smckusick for(i=0; i<n && *s!=' ' && *s!='\0' ; ++i)
18022846Smckusick name[i] = *s++;
18122846Smckusick
18222846Smckusick #if TARGET != GCOS
18322846Smckusick name[i++] = '_';
18422846Smckusick #endif
18522846Smckusick
18622846Smckusick name[i] = '\0';
18722846Smckusick
18822846Smckusick return( name );
18922846Smckusick }
19022846Smckusick
19122846Smckusick
19222846Smckusick
19322846Smckusick
19422846Smckusick
nounder(n,s)19522846Smckusick char * nounder(n, s)
19622846Smckusick register int n;
19722846Smckusick register char *s;
19822846Smckusick {
19922846Smckusick register int i;
20022846Smckusick static char name[XL+1];
20122846Smckusick
20222846Smckusick for(i=0; i<n && *s!=' ' && *s!='\0' ; ++s)
20322846Smckusick if(*s != '_')
20422846Smckusick name[i++] = *s;
20522846Smckusick
20622846Smckusick name[i] = '\0';
20722846Smckusick
20822846Smckusick return( name );
20922846Smckusick }
21022846Smckusick
21122846Smckusick
21222846Smckusick
copyn(n,s)21322846Smckusick char *copyn(n, s)
21422846Smckusick register int n;
21522846Smckusick register char *s;
21622846Smckusick {
21722846Smckusick register char *p, *q;
21822846Smckusick
21922846Smckusick p = q = (char *) ckalloc(n);
22022846Smckusick while(--n >= 0)
22122846Smckusick *q++ = *s++;
22222846Smckusick return(p);
22322846Smckusick }
22422846Smckusick
22522846Smckusick
22622846Smckusick
copys(s)22722846Smckusick char *copys(s)
22822846Smckusick char *s;
22922846Smckusick {
23022846Smckusick return( copyn( strlen(s)+1 , s) );
23122846Smckusick }
23222846Smckusick
23322846Smckusick
23422846Smckusick
convci(n,s)23522846Smckusick ftnint convci(n, s)
23622846Smckusick register int n;
23722846Smckusick register char *s;
23822846Smckusick {
23922846Smckusick ftnint sum;
24022846Smckusick ftnint digval;
24122846Smckusick sum = 0;
24222846Smckusick while(n-- > 0)
24322846Smckusick {
24422846Smckusick if (sum > MAXINT/10 ) {
24522846Smckusick err("integer constant too large");
24622846Smckusick return(sum);
24722846Smckusick }
24822846Smckusick sum *= 10;
24922846Smckusick digval = *s++ - '0';
25022846Smckusick #if (TARGET != VAX)
25122846Smckusick sum += digval;
25222846Smckusick #endif
25322846Smckusick #if (TARGET == VAX)
25422846Smckusick if ( MAXINT - sum >= digval ) {
25522846Smckusick sum += digval;
25622846Smckusick } else {
25722846Smckusick /* KLUDGE. On VAXs, MININT is (-MAXINT)-1 , i.e., there
25822846Smckusick is one more neg. integer than pos. integer. The
25922846Smckusick following code returns MININT whenever (MAXINT+1)
26022846Smckusick is seen. On VAXs, such statements as: i = MININT
26122846Smckusick work, although this generates garbage for
26222846Smckusick such statements as: i = MPLUS1 where MPLUS1 is MAXINT+1
26322846Smckusick or: i = 5 - 2147483647/2 .
26422846Smckusick The only excuse for this kludge is it keeps all legal
26522846Smckusick programs running and flags most illegal constants, unlike
26622846Smckusick the previous version which flaged nothing outside data stmts!
26722846Smckusick */
26822846Smckusick if ( n == 0 && MAXINT - sum + 1 == digval ) {
26922846Smckusick warn("minimum negative integer compiled - possibly bad code");
27022846Smckusick sum = MININT;
27122846Smckusick } else {
27222846Smckusick err("integer constant too large");
27322846Smckusick return(sum);
27422846Smckusick }
27522846Smckusick }
27622846Smckusick #endif
27722846Smckusick }
27822846Smckusick return(sum);
27922846Smckusick }
28022846Smckusick
convic(n)28122846Smckusick char *convic(n)
28222846Smckusick ftnint n;
28322846Smckusick {
28422846Smckusick static char s[20];
28522846Smckusick register char *t;
28622846Smckusick
28722846Smckusick s[19] = '\0';
28822846Smckusick t = s+19;
28922846Smckusick
29022846Smckusick do {
29122846Smckusick *--t = '0' + n%10;
29222846Smckusick n /= 10;
29322846Smckusick } while(n > 0);
29422846Smckusick
29522846Smckusick return(t);
29622846Smckusick }
29722846Smckusick
29822846Smckusick
29922846Smckusick
convcd(n,s)30022846Smckusick double convcd(n, s)
30122846Smckusick int n;
30222846Smckusick register char *s;
30322846Smckusick {
30422846Smckusick double atof();
30522846Smckusick char v[100];
30622846Smckusick register char *t;
30722846Smckusick if(n > 90)
30822846Smckusick {
30922846Smckusick err("too many digits in floating constant");
31022846Smckusick n = 90;
31122846Smckusick }
31222846Smckusick for(t = v ; n-- > 0 ; s++)
31322846Smckusick *t++ = (*s=='d' ? 'e' : *s);
31422846Smckusick *t = '\0';
31522846Smckusick return( atof(v) );
31622846Smckusick }
31722846Smckusick
31822846Smckusick
31922846Smckusick
mkname(l,s)32022846Smckusick Namep mkname(l, s)
32122846Smckusick int l;
32222846Smckusick register char *s;
32322846Smckusick {
32422846Smckusick struct Hashentry *hp;
32522846Smckusick int hash;
32622846Smckusick register Namep q;
32722846Smckusick register int i;
32822846Smckusick char n[VL];
32922846Smckusick
33022846Smckusick hash = 0;
33122846Smckusick for(i = 0 ; i<l && *s!='\0' ; ++i)
33222846Smckusick {
33322846Smckusick hash += *s;
33422846Smckusick n[i] = *s++;
33522846Smckusick }
33622846Smckusick hash %= maxhash;
33722846Smckusick while( i < VL )
33822846Smckusick n[i++] = ' ';
33922846Smckusick
34022846Smckusick hp = hashtab + hash;
34122846Smckusick while(q = hp->varp)
34222846Smckusick if( hash==hp->hashval && eqn(VL,n,q->varname) )
34322846Smckusick return(q);
34422846Smckusick else if(++hp >= lasthash)
34522846Smckusick hp = hashtab;
34622846Smckusick
34722846Smckusick if(++nintnames >= maxhash-1)
34822846Smckusick many("names", 'n');
34922846Smckusick hp->varp = q = ALLOC(Nameblock);
35022846Smckusick hp->hashval = hash;
35122846Smckusick q->tag = TNAME;
35222846Smckusick cpn(VL, n, q->varname);
35322846Smckusick return(q);
35422846Smckusick }
35522846Smckusick
35622846Smckusick
35722846Smckusick
mklabel(l)35822846Smckusick struct Labelblock *mklabel(l)
35922846Smckusick ftnint l;
36022846Smckusick {
36122846Smckusick register struct Labelblock *lp;
36222846Smckusick
36322846Smckusick if(l <= 0 || l > 99999 ) {
36422846Smckusick errstr("illegal label %d", l);
36525743Sdonn l = 0;
36622846Smckusick }
36722846Smckusick
36822846Smckusick for(lp = labeltab ; lp < highlabtab ; ++lp)
36922846Smckusick if(lp->stateno == l)
37022846Smckusick return(lp);
37122846Smckusick
37222846Smckusick if(++highlabtab > labtabend)
37322846Smckusick many("statement numbers", 's');
37422846Smckusick
37522846Smckusick lp->stateno = l;
37622846Smckusick lp->labelno = newlabel();
37722846Smckusick lp->blklevel = 0;
37822846Smckusick lp->labused = NO;
37922846Smckusick lp->labdefined = NO;
38022846Smckusick lp->labinacc = NO;
38122846Smckusick lp->labtype = LABUNKNOWN;
38222846Smckusick return(lp);
38322846Smckusick }
38422846Smckusick
38522846Smckusick
newlabel()38622846Smckusick newlabel()
38722846Smckusick {
38822846Smckusick return( ++lastlabno );
38922846Smckusick }
39022846Smckusick
39122846Smckusick
39222846Smckusick /* this label appears in a branch context */
39322846Smckusick
execlab(stateno)39422846Smckusick struct Labelblock *execlab(stateno)
39522846Smckusick ftnint stateno;
39622846Smckusick {
39722846Smckusick register struct Labelblock *lp;
39822846Smckusick
39922846Smckusick if(lp = mklabel(stateno))
40022846Smckusick {
40122846Smckusick if(lp->labinacc)
40222846Smckusick warn1("illegal branch to inner block, statement %s",
40322846Smckusick convic(stateno) );
40422846Smckusick else if(lp->labdefined == NO)
40522846Smckusick lp->blklevel = blklevel;
40622846Smckusick lp->labused = YES;
40722846Smckusick if(lp->labtype == LABFORMAT)
40822846Smckusick err("may not branch to a format");
40922846Smckusick else
41022846Smckusick lp->labtype = LABEXEC;
41122846Smckusick }
41222846Smckusick
41322846Smckusick return(lp);
41422846Smckusick }
41522846Smckusick
41622846Smckusick
41722846Smckusick
41822846Smckusick
41922846Smckusick
42022846Smckusick /* find or put a name in the external symbol table */
42122846Smckusick
mkext(s)42222846Smckusick struct Extsym *mkext(s)
42322846Smckusick char *s;
42422846Smckusick {
42522846Smckusick int i;
42622846Smckusick register char *t;
42722846Smckusick char n[XL];
42822846Smckusick struct Extsym *p;
42922846Smckusick
43022846Smckusick i = 0;
43122846Smckusick t = n;
43222846Smckusick while(i<XL && *s)
43322846Smckusick *t++ = *s++;
43422846Smckusick while(t < n+XL)
43522846Smckusick *t++ = ' ';
43622846Smckusick
43722846Smckusick for(p = extsymtab ; p<nextext ; ++p)
43822846Smckusick if(eqn(XL, n, p->extname))
43922846Smckusick return( p );
44022846Smckusick
44122846Smckusick if(nextext >= lastext)
44222846Smckusick many("external symbols", 'x');
44322846Smckusick
44422846Smckusick cpn(XL, n, nextext->extname);
44522846Smckusick nextext->extstg = STGUNKNOWN;
44622846Smckusick nextext->extsave = NO;
44722846Smckusick nextext->extp = 0;
44822846Smckusick nextext->extleng = 0;
44922846Smckusick nextext->maxleng = 0;
45022846Smckusick nextext->extinit = NO;
45122846Smckusick return( nextext++ );
45222846Smckusick }
45322846Smckusick
45422846Smckusick
45522846Smckusick
45622846Smckusick
45722846Smckusick
45822846Smckusick
45922846Smckusick
46022846Smckusick
builtin(t,s)46122846Smckusick Addrp builtin(t, s)
46222846Smckusick int t;
46322846Smckusick char *s;
46422846Smckusick {
46522846Smckusick register struct Extsym *p;
46622846Smckusick register Addrp q;
46722846Smckusick
46822846Smckusick p = mkext(s);
46922846Smckusick if(p->extstg == STGUNKNOWN)
47022846Smckusick p->extstg = STGEXT;
47122846Smckusick else if(p->extstg != STGEXT)
47222846Smckusick {
47322846Smckusick errstr("improper use of builtin %s", s);
47422846Smckusick return(0);
47522846Smckusick }
47622846Smckusick
47722846Smckusick q = ALLOC(Addrblock);
47822846Smckusick q->tag = TADDR;
47922846Smckusick q->vtype = t;
48022846Smckusick q->vclass = CLPROC;
48122846Smckusick q->vstg = STGEXT;
48222846Smckusick q->memno = p - extsymtab;
48322846Smckusick return(q);
48422846Smckusick }
48522846Smckusick
48622846Smckusick
48722846Smckusick
frchain(p)48822846Smckusick frchain(p)
48922846Smckusick register chainp *p;
49022846Smckusick {
49122846Smckusick register chainp q;
49222846Smckusick
49322846Smckusick if(p==0 || *p==0)
49422846Smckusick return;
49522846Smckusick
49622846Smckusick for(q = *p; q->nextp ; q = q->nextp)
49722846Smckusick ;
49822846Smckusick q->nextp = chains;
49922846Smckusick chains = *p;
50022846Smckusick *p = 0;
50122846Smckusick }
50222846Smckusick
50322846Smckusick
cpblock(n,p)50422846Smckusick tagptr cpblock(n,p)
50522846Smckusick register int n;
50622846Smckusick register char * p;
50722846Smckusick {
50822846Smckusick register char *q;
50922846Smckusick ptr q0;
51022846Smckusick
51122846Smckusick q0 = ckalloc(n);
51222846Smckusick q = (char *) q0;
51322846Smckusick while(n-- > 0)
51422846Smckusick *q++ = *p++;
51522846Smckusick return( (tagptr) q0);
51622846Smckusick }
51722846Smckusick
51822846Smckusick
51922846Smckusick
max(a,b)52022846Smckusick max(a,b)
52122846Smckusick int a,b;
52222846Smckusick {
52322846Smckusick return( a>b ? a : b);
52422846Smckusick }
52522846Smckusick
52622846Smckusick
lmax(a,b)52722846Smckusick ftnint lmax(a, b)
52822846Smckusick ftnint a, b;
52922846Smckusick {
53022846Smckusick return( a>b ? a : b);
53122846Smckusick }
53222846Smckusick
lmin(a,b)53322846Smckusick ftnint lmin(a, b)
53422846Smckusick ftnint a, b;
53522846Smckusick {
53622846Smckusick return(a < b ? a : b);
53722846Smckusick }
53822846Smckusick
53922846Smckusick
54022846Smckusick
54122846Smckusick
maxtype(t1,t2)54222846Smckusick maxtype(t1, t2)
54322846Smckusick int t1, t2;
54422846Smckusick {
54522846Smckusick int t;
54622846Smckusick
54722846Smckusick t = max(t1, t2);
54822846Smckusick if(t==TYCOMPLEX && (t1==TYDREAL || t2==TYDREAL) )
54922846Smckusick t = TYDCOMPLEX;
55022846Smckusick return(t);
55122846Smckusick }
55222846Smckusick
55322846Smckusick
55422846Smckusick
55522846Smckusick /* return log base 2 of n if n a power of 2; otherwise -1 */
55622846Smckusick #if FAMILY == PCC
log2(n)55722846Smckusick log2(n)
55822846Smckusick ftnint n;
55922846Smckusick {
56022846Smckusick int k;
56122846Smckusick
56222846Smckusick /* trick based on binary representation */
56322846Smckusick
56422846Smckusick if(n<=0 || (n & (n-1))!=0)
56522846Smckusick return(-1);
56622846Smckusick
56722846Smckusick for(k = 0 ; n >>= 1 ; ++k)
56822846Smckusick ;
56922846Smckusick return(k);
57022846Smckusick }
57122846Smckusick #endif
57222846Smckusick
57322846Smckusick
57422846Smckusick
frrpl()57522846Smckusick frrpl()
57622846Smckusick {
57722846Smckusick struct Rplblock *rp;
57822846Smckusick
57922846Smckusick while(rpllist)
58022846Smckusick {
58122846Smckusick rp = rpllist->rplnextp;
58222846Smckusick free( (charptr) rpllist);
58322846Smckusick rpllist = rp;
58422846Smckusick }
58522846Smckusick }
58622846Smckusick
58722846Smckusick
58822846Smckusick
callk(type,name,args)58922846Smckusick expptr callk(type, name, args)
59022846Smckusick int type;
59122846Smckusick char *name;
59222846Smckusick chainp args;
59322846Smckusick {
59422846Smckusick register expptr p;
59522846Smckusick
59622846Smckusick p = mkexpr(OPCALL, builtin(type,name), args);
59722846Smckusick p->exprblock.vtype = type;
59822846Smckusick return(p);
59922846Smckusick }
60022846Smckusick
60122846Smckusick
60222846Smckusick
call4(type,name,arg1,arg2,arg3,arg4)60322846Smckusick expptr call4(type, name, arg1, arg2, arg3, arg4)
60422846Smckusick int type;
60522846Smckusick char *name;
60622846Smckusick expptr arg1, arg2, arg3, arg4;
60722846Smckusick {
60822846Smckusick struct Listblock *args;
60922846Smckusick args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3,
61022846Smckusick mkchain(arg4, CHNULL)) ) ) );
61122846Smckusick return( callk(type, name, args) );
61222846Smckusick }
61322846Smckusick
61422846Smckusick
61522846Smckusick
61622846Smckusick
call3(type,name,arg1,arg2,arg3)61722846Smckusick expptr call3(type, name, arg1, arg2, arg3)
61822846Smckusick int type;
61922846Smckusick char *name;
62022846Smckusick expptr arg1, arg2, arg3;
62122846Smckusick {
62222846Smckusick struct Listblock *args;
62322846Smckusick args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3, CHNULL) ) ) );
62422846Smckusick return( callk(type, name, args) );
62522846Smckusick }
62622846Smckusick
62722846Smckusick
62822846Smckusick
62922846Smckusick
63022846Smckusick
call2(type,name,arg1,arg2)63122846Smckusick expptr call2(type, name, arg1, arg2)
63222846Smckusick int type;
63322846Smckusick char *name;
63422846Smckusick expptr arg1, arg2;
63522846Smckusick {
63622846Smckusick struct Listblock *args;
63722846Smckusick
63822846Smckusick args = mklist( mkchain(arg1, mkchain(arg2, CHNULL) ) );
63922846Smckusick return( callk(type,name, args) );
64022846Smckusick }
64122846Smckusick
64222846Smckusick
64322846Smckusick
64422846Smckusick
call1(type,name,arg)64522846Smckusick expptr call1(type, name, arg)
64622846Smckusick int type;
64722846Smckusick char *name;
64822846Smckusick expptr arg;
64922846Smckusick {
65022846Smckusick return( callk(type,name, mklist(mkchain(arg,CHNULL)) ));
65122846Smckusick }
65222846Smckusick
65322846Smckusick
call0(type,name)65422846Smckusick expptr call0(type, name)
65522846Smckusick int type;
65622846Smckusick char *name;
65722846Smckusick {
65822846Smckusick return( callk(type, name, PNULL) );
65922846Smckusick }
66022846Smckusick
66122846Smckusick
66222846Smckusick
mkiodo(dospec,list)66322846Smckusick struct Impldoblock *mkiodo(dospec, list)
66422846Smckusick chainp dospec, list;
66522846Smckusick {
66622846Smckusick register struct Impldoblock *q;
66722846Smckusick
66822846Smckusick q = ALLOC(Impldoblock);
66922846Smckusick q->tag = TIMPLDO;
67022846Smckusick q->impdospec = dospec;
67122846Smckusick q->datalist = list;
67222846Smckusick return(q);
67322846Smckusick }
67422846Smckusick
67522846Smckusick
67622846Smckusick
67722846Smckusick
ckalloc(n)67822846Smckusick ptr ckalloc(n)
67922846Smckusick register int n;
68022846Smckusick {
68122846Smckusick register ptr p;
68222846Smckusick ptr calloc();
68322846Smckusick
68422846Smckusick if( p = calloc(1, (unsigned) n) )
68522846Smckusick return(p);
68622846Smckusick
68722846Smckusick fatal("out of memory");
68822846Smckusick /* NOTREACHED */
68922846Smckusick }
69022846Smckusick
69122846Smckusick
69222846Smckusick
69322846Smckusick
69422846Smckusick
isaddr(p)69522846Smckusick isaddr(p)
69622846Smckusick register expptr p;
69722846Smckusick {
69822846Smckusick if(p->tag == TADDR)
69922846Smckusick return(YES);
70022846Smckusick if(p->tag == TEXPR)
70122846Smckusick switch(p->exprblock.opcode)
70222846Smckusick {
70322846Smckusick case OPCOMMA:
70422846Smckusick return( isaddr(p->exprblock.rightp) );
70522846Smckusick
70622846Smckusick case OPASSIGN:
70722846Smckusick case OPPLUSEQ:
70822846Smckusick return( isaddr(p->exprblock.leftp) );
70922846Smckusick }
71022846Smckusick return(NO);
71122846Smckusick }
71222846Smckusick
71322846Smckusick
71422846Smckusick
71522846Smckusick
isstatic(p)71622846Smckusick isstatic(p)
71722846Smckusick register expptr p;
71822846Smckusick {
71922846Smckusick if(p->headblock.vleng && !ISCONST(p->headblock.vleng))
72022846Smckusick return(NO);
72122846Smckusick
72222846Smckusick switch(p->tag)
72322846Smckusick {
72422846Smckusick case TCONST:
72522846Smckusick return(YES);
72622846Smckusick
72722846Smckusick case TADDR:
72822846Smckusick if(ONEOF(p->addrblock.vstg,MSKSTATIC) &&
72922846Smckusick ISCONST(p->addrblock.memoffset))
73022846Smckusick return(YES);
73122846Smckusick
73222846Smckusick default:
73322846Smckusick return(NO);
73422846Smckusick }
73522846Smckusick }
73622846Smckusick
73722846Smckusick
73822846Smckusick
addressable(p)73922846Smckusick addressable(p)
74022846Smckusick register expptr p;
74122846Smckusick {
74222846Smckusick switch(p->tag)
74322846Smckusick {
74422846Smckusick case TCONST:
74522846Smckusick return(YES);
74622846Smckusick
74722846Smckusick case TADDR:
74822846Smckusick return( addressable(p->addrblock.memoffset) );
74922846Smckusick
75022846Smckusick default:
75122846Smckusick return(NO);
75222846Smckusick }
75322846Smckusick }
75422846Smckusick
75522846Smckusick
75622846Smckusick
hextoi(c)75722846Smckusick hextoi(c)
75822846Smckusick register int c;
75922846Smckusick {
76022846Smckusick register char *p;
76122846Smckusick static char p0[17] = "0123456789abcdef";
76222846Smckusick
76322846Smckusick for(p = p0 ; *p ; ++p)
76422846Smckusick if(*p == c)
76522846Smckusick return( p-p0 );
76622846Smckusick return(16);
76722846Smckusick }
768