
/*
HEADER: 	;
TITLE: 		Frankenstein Cross Assemblers;
VERSION: 	2.0;
DESCRIPTION: "	Reconfigurable Cross-assembler producing Intel (TM)
		Hex format object records.  ";
FILENAME: 	frasmdat.h;
SEE-ALSO: 	;
AUTHORS: 	Mark Zenier;
*/

/*
	description	structures and data used in parser and output phases
	history		September 15, 1987
			August 3, 1988   Global
			September 14, 1990   6 char portable var
*/

#include <ctype.h>
#define PRINTCTRL(char) ((char)+'@')

#ifndef Global
#define	Global	extern
#endif

#ifdef USEINDEX
#define strchr index
#endif

#ifdef NOSTRING
extern char * strncpy();
extern char * strchr();
extern int strcmp();
extern int strlen();
#else
#include <string.h>
#endif

#define local 

#define TRUE 1
#define FALSE 0

#define hexch(cv) (hexcva[(cv)&0xf])
extern char hexcva[];

/* symbol table element */
struct symel
{
	char	*symstr;
	int	tok;
	int	seg;
	long	value;
	struct	symel *nextsym;
	int	symnum;
};

#define SSG_UNUSED 0
#define SSG_UNDEF -1
#define SSG_ABS 8
#define SSG_RESV -2
#define SSG_EQU 2
#define SSG_SET 3

#define SYMNULL (struct symel *) NULL
struct symel * symbentry();

/* opcode symbol table element */

struct opsym
{
	char	*opstr;
	int	token;
	int	numsyn;
	int	subsyn;
};

struct opsynt
{
	int	syntaxgrp;
	int	elcnt;
	int	gentabsub;
};

struct igel 
{
	int	selmask;
	int	criteria;
	char	* genstr;
};
	
#define PPEXPRLEN 256

struct evalrel
{
	int	seg;
	long	value;
	char	exprstr[PPEXPRLEN];
};

#define INBUFFSZ 258
extern char finbuff[INBUFFSZ];

extern int nextsymnum;
Global struct symel **symbindex;

#define EXPRLSIZE (INBUFFSZ/2)
extern int nextexprs;
Global int	exprlist[EXPRLSIZE];

#define STRLSIZE (INBUFFSZ/2)
extern int nextstrs;
Global char *	stringlist[STRLSIZE];

extern struct opsym optab[];
extern int gnumopcode;
extern struct opsynt ostab[];
extern struct igel igtab[];
extern int ophashlnk[];

#define NUMPEXP 6
Global struct evalrel evalr[NUMPEXP];

#define PESTKDEPTH 32
struct evstkel
{
	long v;
	int s;
};

Global struct evstkel	estk[PESTKDEPTH], *estkm1p;

Global int	currseg; 
Global long 	locctr; 

extern FILE *yyin;
extern FILE	*intermedf;
extern int	listflag;
extern int hexvalid, hexflag;
Global FILE	*hexoutf, *loutf;
extern int errorcnt, warncnt;

extern int linenumber;

#define IFSTKDEPTH 32
extern int	ifstkpt; 
Global enum { If_Active, If_Skip, If_Err } 
	elseifstk[IFSTKDEPTH], endifstk[IFSTKDEPTH];

#define FILESTKDPTH 20
Global int currfstk;
#define nextfstk (currfstk+1)
Global struct fstkel
{
	char *fnm;
	FILE *fpt;
} infilestk[FILESTKDPTH];

Global int lnumstk[FILESTKDPTH];
Global char currentfnm[100];

extern struct symel * endsymbol;

enum readacts
{
	Nra_normal, 
	Nra_new, 
	Nra_end 
} ;

extern enum readacts nextreadact;

char * savestring(), *findgen();
long	strtol();
void	reservedsym();
char	*calloc(), *malloc();

extern struct symel * endsymbol;
extern char ignosyn[] ;
extern char ignosel[] ;

#define NUM_CHTA 6
extern int chtnxalph, *chtcpoint, *chtnpoint ;
Global int *(chtatab[NUM_CHTA]);
int chtcreate(), chtcfind(), chtran();

#define CF_END		-2
#define CF_INVALID 	-1
#define CF_UNDEF 	0
#define CF_CHAR 	1
#define CF_NUMBER 	2

