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