#include	"defs.h"


FILEP infile	= { stdin };
FILEP diagfile	= { stderr };

FILEP textfile;
FILEP asmfile;
FILEP initfile;
long int headoffset;

char token[200];
int toklen;
int lineno;
char *infname;
int needkwd;
struct labelblock *thislabel	= NULL;
flag nowarnflag	= NO;
flag ftn66flag	= NO;
flag profileflag	= NO;
flag optimflag	= NO;
flag shiftcase	= YES;
flag undeftype	= NO;
flag shortsubs	= YES;
flag onetripflag	= NO;
flag checksubs	= NO;
flag debugflag	= NO;
int nerr;
int nwarn;
int ndata;

flag saveall;
flag substars;
int parstate	= OUTSIDE;
flag headerdone	= NO;
int blklevel;
int impltype[26];
int implleng[26];
int implstg[26];

int tyint	= TYLONG ;
int tylogical	= TYLONG;
ftnint typesize[NTYPES]
	= { 1, SZADDR, SZSHORT, SZLONG, SZLONG, 2*SZLONG,
	    2*SZLONG, 4*SZLONG, SZLONG, 1, 1, 1};
int typealign[NTYPES]
	= { 1, ALIADDR, ALISHORT, ALILONG, ALILONG, ALIDOUBLE,
	    ALILONG, ALIDOUBLE, ALILONG, 1, 1, 1};
int procno;
int proctype	= TYUNKNOWN;
char *procname;
int rtvlabel[NTYPES];
int fudgelabel;
struct addrblock *typeaddr;
struct addrblock *retslot;
int cxslot	= -1;
int chslot	= -1;
int chlgslot	= -1;
int procclass	= CLUNKNOWN;
int nentry;
flag multitype;
ftnint procleng;
int lastlabno	= 10;
int lastvarno;
int lastargslot;
int argloc;
ftnint autoleng;
ftnint bssleng	= 0;
int retlabel;
int ret0label;
struct ctlframe ctls[MAXCTL];
struct ctlframe *ctlstack	= ctls-1;
struct ctlframe *lastctl	= ctls+MAXCTL ;

struct nameblock *regnamep[MAXREGVAR];
int highregvar;
int nregvar;

struct extsym extsymtab[MAXEXT];
struct extsym *nextext	= extsymtab;
struct extsym *lastext	= extsymtab+MAXEXT;

struct equivblock eqvclass[MAXEQUIV];
struct hashentry hashtab[MAXHASH];
struct hashentry *lasthash	= hashtab+MAXHASH;

struct labelblock labeltab[MAXSTNO];
struct labelblock *labtabend	= labeltab+MAXSTNO;
struct labelblock *highlabtab =	labeltab;
struct rplblock *rpllist	= NULL;
chainp curdtp	= NULL;
flag toomanyinit;
ftnint curdtelt;
chainp templist	= NULL;
chainp holdtemps	= NULL;
int dorange	= 0;
struct entrypoint *entries	= NULL;

chainp chains	= NULL;

flag inioctl;
struct addrblock *ioblkp;
int iostmt;
int nioctl;
int nequiv	= 0;
int nintnames	= 0;
int nextnames	= 0;

struct literal litpool[MAXLITERALS];
int nliterals;



fileinit()
{
procno = 0;
lastlabno = 10;
lastvarno = 0;
nextext = extsymtab;
nliterals = 0;
nerr = 0;
ndata = 0;
}





procinit()
{
	register struct nameblock *p;
	register struct dimblock *q;
	register struct hashentry *hp;
	register struct labelblock *lp;
	chainp cp;
	int i;
	
	pruse(asmfile, USECONST);

#if FAMILY == SCJ
	p2pass(USETEXT);
#endif
	parstate = OUTSIDE;
	headerdone = NO;
	blklevel = 1;
	saveall = NO;
	substars = NO;
	nwarn = 0;
	thislabel = NULL;
	needkwd = 0;

	++procno;
	proctype = TYUNKNOWN;
	procname = "MAIN_    ";
	procclass = CLUNKNOWN;
	nentry = 0;
	multitype = NO;
	typeaddr = NULL;
	retslot = NULL;
	cxslot = -1;
	chslot = -1;
	chlgslot = -1;
	procleng = 0;
	blklevel = 1;
	lastargslot = 0;

	/* allow space for register save areas on the stack */
#if TARGET==PDP11
	autoleng = 6;
#endif
#if TARGET==INTERDATA
	autoleng = (NREGSAVE*SZINT);
#endif

	for (lp = labeltab ; lp < labtabend ; ++lp)
		lp->stateno = 0;

	for (hp = hashtab ; hp < lasthash ; ++hp)
		if(p = hp->varp)  {
			frexpr(p->vleng);
			if(q = p->vdim)  {
				for (i = 0 ; i < q->ndim ; ++i)  {
					frexpr(q->dims[i].dimsize);
					frexpr(q->dims[i].dimexpr);
					}
				frexpr(q->nelt);
				frexpr(q->baseoffset);
				frexpr(q->basexpr);
				free(q);
				}
			free(p);
			hp->varp = NULL;
			}
	nintnames = 0;
	highlabtab = labeltab;

	ctlstack = ctls - 1;
	for (cp = templist ; cp ; cp = cp->nextp)
		free(cp->datap);
	frchain(&templist);
	holdtemps = NULL;
	dorange = 0;
	nregvar = 0;		/***/
	highregvar = 0;		/***/
	entries = NULL;
	rpllist = NULL;
	inioctl = NO;
	ioblkp = NULL;
	nequiv = 0;

	for (i = 0 ; i<NTYPES ; ++i)
		rtvlabel[i] = 0;
	fudgelabel = 0;
	
	if(undeftype)
		setimpl(TYUNKNOWN, (ftnint) 0, 'a', 'z');
	else  {
		setimpl(TYREAL, (ftnint) 0, 'a', 'z');
		setimpl(tyint,  (ftnint) 0, 'i', 'n');
		}
	setimpl(-STGBSS, (ftnint) 0, 'a', 'z');	/* set class */
	setlog();
}




setimpl(type, length, c1, c2)
int type;
ftnint length;
int c1, c2;
{
int i;
char buff[100];

if(c1==0 || c2==0)
	return;

if(c1 > c2)
	err( sprintf(buff, "characters out of order in implicit:%c-%c", c1, c2) );
else
	if(type < 0)
		for(i = c1 ; i<=c2 ; ++i)
			implstg[i-'a'] = - type;
	else
		{
		type = lengtype(type, (int) length);
		if(type != TYCHAR)
			length = 0;
		for(i = c1 ; i<=c2 ; ++i)
			{
			impltype[i-'a'] = type;
			implleng[i-'a'] = length;
			}
		}
}
