mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
145 lines
2.5 KiB
C
145 lines
2.5 KiB
C
/*
|
|
Copyright 1982
|
|
Alcyon Corporation
|
|
8716 Production Ave.
|
|
San Diego, Ca. 92121
|
|
|
|
@(#)interf.c 1.5 12/14/83
|
|
*/
|
|
|
|
#include "cgen.h"
|
|
|
|
short bol;
|
|
short gflag;
|
|
short onepass;
|
|
|
|
/* outexpr - output expression*/
|
|
outexpr(tp) /* returns - none*/
|
|
struct tnode *tp; /* pointer to tree node*/
|
|
{
|
|
outline();
|
|
if( exprok(tp) ) {
|
|
#ifdef DEBUG
|
|
if (cflag) printf("outexpr 1: type is %d\n",tp->t_type);
|
|
#endif
|
|
scodegen(canon(tp),FOREFF,0);
|
|
#ifdef DEBUG
|
|
if (cflag) printf("outexpr 2: type is %d\n",tp->t_type);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
outifgoto(tp,dir,lab)
|
|
struct tnode *tp;
|
|
int dir;
|
|
int lab;
|
|
{
|
|
outline();
|
|
if( exprok(tp) )
|
|
condbr(canon(tp),dir,lab,0);
|
|
}
|
|
|
|
outcforreg(tp)
|
|
struct tnode *tp;
|
|
{
|
|
outline();
|
|
if( exprok(tp) )
|
|
outmovr(scodegen(canon(tp),FORREG,0),0,tp);
|
|
}
|
|
|
|
outinit(tp) /* returns - none*/
|
|
struct tnode *tp;
|
|
{
|
|
register short typeout;
|
|
|
|
outline();
|
|
if( exprok(tp) ) {
|
|
typeout = tp->t_type;
|
|
tp = canon(tp);
|
|
if( tp->t_op == ADDR )
|
|
tp = tp->t_left;
|
|
if( tp->t_op == CINT || tp->t_op == CLONG || tp->t_op == SYMBOL ) {
|
|
if( tp->t_op != CINT ) /* [vlh] 4.1 added CLONG... */
|
|
printf(".dc.l ");
|
|
else {
|
|
printf(".dc");
|
|
outtype(typeout);
|
|
putchar(' ');
|
|
}
|
|
outaexpr(tp,A_NOIMMED); /* [vlh] 4.0 not immed... */
|
|
}
|
|
else
|
|
error("invalid initialization");
|
|
putchar('\n');
|
|
}
|
|
}
|
|
|
|
/* snalloc - code generator symbol node allocation*/
|
|
/* This might be coalesced into parser snalloc.*/
|
|
char *snalloc(type,sc,offset,dp,ssp) /* returns ptr to node alloced*/
|
|
int type; /* type of symbol*/
|
|
int sc; /* storage class*/
|
|
long offset; /* offset from Local Environment Ptr*/
|
|
int dp; /*for compatability with parser*/
|
|
int ssp; /*for compatability with parser*/
|
|
{
|
|
register struct symnode *sp;
|
|
|
|
sp = talloc(sizeof(*sp));
|
|
sp->t_op = SYMBOL;
|
|
sp->t_type = type;
|
|
sp->t_su = dp;
|
|
sp->t_ssp = ssp;
|
|
sp->t_sc = sc;
|
|
switch( sc ) {
|
|
|
|
case STATIC:
|
|
sp->t_offset = 0;
|
|
sp->t_reg = 0;
|
|
sp->t_label = offset;
|
|
break;
|
|
|
|
case REGISTER:
|
|
sp->t_offset = 0;
|
|
sp->t_reg = offset;
|
|
sp->t_label = 0;
|
|
break;
|
|
|
|
case AUTO:
|
|
sp->t_sc = REGOFF;
|
|
sp->t_offset = offset;
|
|
sp->t_reg = LEP;
|
|
sp->t_label = 0;
|
|
break;
|
|
|
|
default:
|
|
sp->t_offset = offset;
|
|
sp->t_reg = 0;
|
|
sp->t_label = 0;
|
|
break;
|
|
}
|
|
return(sp);
|
|
}
|
|
|
|
exprok(tp)
|
|
struct tnode *tp;
|
|
{
|
|
if( tp < exprarea || tp > &exprarea[EXPSIZE] )
|
|
return(0);
|
|
if( LEAFOP(tp->t_op) )
|
|
return(1);
|
|
if( BINOP(tp->t_op) && !exprok(tp->t_right) )
|
|
return(0);
|
|
return( exprok(tp->t_left) );
|
|
}
|
|
|
|
outline()
|
|
{
|
|
if( onepass && !bol )
|
|
putchar('\n');
|
|
if (!gflag)
|
|
printf("*line %d\n",lineno);
|
|
else
|
|
printf("~_lN%d:\n",lineno);
|
|
}
|