xref: /csrg-svn/usr.bin/f77/pass1.vax/misc.c (revision 47955)
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