/*
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 */
#include        "ass00.h"
#include        "assex.h"

#ifndef NORCSID
static char rcs_id[] = "$Id$" ;
static char rcs_ass[]= RCS_ASS ;
static char rcs_ex[] = RCS_EX ;
#endif

/*
 * global data
 */

int     wordsize ;
int     ptrsize ;
cons_t  maxadr ;
cons_t  maxint;
cons_t  maxdint;
cons_t  maxunsig;
cons_t  maxdunsig;

/*
	The structure containing used for procedure environment stacking
*/
stat_t  pstate ;

/*
 * pointers to not yet allocated storage
 */
glob_t  *mglobs;                        /* pointer to module symbols */
glob_t  *xglobs;                        /* pointer to extern symbols */
proc_t  *mprocs;                        /* pointer to local procs */
proc_t  *xprocs;                        /* pointer to external procs */
ptab_t  *proctab;                       /* pointer to proctab[] */

/*
 * some array and structures of known size
 */
FILE    *ifile;                         /* input file buffer */
FILE    *tfile;                         /* code file buffer */
FILE    *dfile;                         /* data file buffer */
FILE    *rtfile;                        /* code file buffer */
FILE    *rdfile;                        /* data file buffer */
char    string[MAXSTRING];

/*
 * some other pointers
 */
glob_t  *lastglosym;                    /* last global symbol */
glob_t  *curglosym;                     /* current global symbol */
relc_t  *f_data = (relc_t *)0 ;         /* first data reloc pointer */
relc_t  *l_data = (relc_t *)0 ;         /* last data reloc pointer */
relc_t  *f_text = (relc_t *)0 ;         /* first text reloc pointer */
relc_t  *l_text = (relc_t *)0 ;         /* last text reloc pointer */

/*
 * some indices
 */
int     strlngth;                       /* index in string[] */
FOFFSET inpoff;                         /* offset in current input file */
FOFFSET libeof;                         /* ceiling for above number */

/*
 * some other counters
 */
int     procnum;                        /* generic for unique proc-descr. */
cons_t  prog_size;                      /* length of current proc */
int     max_bytes;
int     pass;
int     line_num;                       /* line number for error messages */
int     nerrors;                        /* number of nonfatal errors */
cons_t  consiz;                         /* size of U,I or F value */
cons_t  textbytes;                      /* size of code file */
cons_t  databytes;                      /* highwater mark in data */
FOFFSET dataoff;                        /* size of data file */
FOFFSET textoff;                        /* size of text file */
FOFFSET lastoff;                        /* previous size before last block */
int     datamode;                       /* what kind of data */
int     datablocks;                     /* number of datablocks written out */
relc_t *lastheader;                     /* pointer into datareloc */
cons_t  holbase;
cons_t  holsize;
int     unresolved;                     /* # of unresolved references */
int     sourcelines;                    /* number of lines in source program*/
int     intflags        =  1;           /* flags for interpreter */
/*
 * some flags
 */
int     archmode;                       /* reading library ? */
int     procflag;                       /* print "namelist" of procedures */
#ifdef  DUMP
int     c_flag;                         /* print unused opcodes */
char    opcnt1[256];                    /* count primary opcodes */
char    opcnt2[256];                    /* count secondary opcodes */
char    opcnt3[256];                    /* count long opcodes */
#endif
int     d_flag          =  0;           /* don't dump */
int     r_flag          =  0;           /* don't dump relocation tables */
#ifdef JOHAN
int     jflag;
#endif
int     wflag           =  0;           /* don't issue warning messages */
int	Uflag		=  0;		/* exit status 0 on unresolved refs */
int     eof_seen;
int     mod_sizes;                      /* Size info in current module ok? */

#define BASE    (sizeof (struct lines) - sizeof (addr_u))

char    linesize[VALLOW+1] = {
	BASE,                           /* MISSING */
	BASE + sizeof (cons_t),         /* CONST */
	BASE + sizeof prp_cast,         /* PROCNAME */
	BASE + sizeof gbp_cast,         /* GLOSYM */
	BASE + sizeof lbp_cast,         /* LOCSYM */
	BASE + sizeof (struct sad_df),  /* GLOOFF */
	BASE + sizeof (struct sad_ln),  /* LINES */
	BASE                            /* VALLOW */
} ;

/*
 * miscellaneous
 */
char    *progname;                      /* argv[0] */
char    *curfile        =  0;           /* name of current file */
char    *eout           =  "e.out";
arch_t  archhdr;
siz_t  sizes[NDEFAULT] = {
/*   mlab, glab,mproc,xproc, proc */
    { 151,   29,   31,   73,  130 },	/* small */
    { 307,  127,  151,  401,  460 },	/* medium */
    { 601,  251,  151,  401,  600 },	/* large */
    {1601, 1601, 1601, 1601, 2000 }	/* extra large */
};
siz_t  *oursize        =  &sizes[2] ;  /* point to selected sizes */