223 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			223 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <local.h>
 | 
						|
 | 
						|
#ifdef extern
 | 
						|
#define INIT(x)         = x
 | 
						|
#else
 | 
						|
#define INIT(x)         /* empty */
 | 
						|
#endif
 | 
						|
 | 
						|
#if BIGMACHINE
 | 
						|
#define BORS(x,y) x
 | 
						|
#else
 | 
						|
#define BORS(x,y) y
 | 
						|
#endif
 | 
						|
/* Tunable constants */
 | 
						|
 | 
						|
#define MAXALLREG 5             /* Maximum number of allocates per rule */
 | 
						|
#define MAXREGS BORS(36,32)     /* Total number of registers */
 | 
						|
#define MAXREGVARS 8		/* Maximum regvars per type */
 | 
						|
#define MAXPROPS 16             /* Total number of register properties */
 | 
						|
#define MAXTOKENS BORS(75,32)   /* Different kind of tokens */
 | 
						|
#define MAXSETS BORS(100,80)    /* Number of tokenexpressions definable */
 | 
						|
#define MAXEMPATLEN 25		/* Maximum length of EM-pattern/replacement */
 | 
						|
#define TOKENSIZE 5             /* Maximum number of fields in token struct */
 | 
						|
#define MAXINSTANCE BORS(250,120) /* Maximum number of different tokeninstances */
 | 
						|
#define MAXSTRINGS BORS(800,400)/* Maximum number of different codestrings */
 | 
						|
#define MAXPATTERN BORS(8000,6000) /* Maximum number of bytes in pattern[] */
 | 
						|
#define MAXNODES BORS(500,400)  /* Maximum number of expression nodes */
 | 
						|
#define MAXMEMBERS 2            /* Maximum number of subregisters per reg */
 | 
						|
#define NMOVES BORS(50,30)      /* Maximum number of move definitions */
 | 
						|
#define MAXC1   20              /* Maximum of coercions type 1 */
 | 
						|
#define MAXC2   20              /* Maximum of coercions type 2 */
 | 
						|
#define MAXC3   20              /* Maximum of coercions type 3 */
 | 
						|
#define MAXSPLIT 4              /* Maximum degree of split */
 | 
						|
#define MAXNSTR 40		/* Maximum consecutive strings in coderule */
 | 
						|
 | 
						|
extern char *hname INIT("tables.h");
 | 
						|
extern char *cname INIT("tables.c");
 | 
						|
extern char *iname;			/* stdin */
 | 
						|
 | 
						|
/* Derived constants */
 | 
						|
 | 
						|
#define SETSIZE ((MAXREGS+1+MAXTOKENS+15)>>4)
 | 
						|
#define PROPSETSIZE ((MAXPROPS+15)>>4)
 | 
						|
 | 
						|
#define BMASK 0377
 | 
						|
#define BSHIFT 8
 | 
						|
 | 
						|
#define TRUE    1
 | 
						|
#define FALSE   0
 | 
						|
 | 
						|
#define MAXPATLEN 7             /* Maximum length of tokenpatterns */
 | 
						|
 | 
						|
typedef char byte;
 | 
						|
typedef char * string;
 | 
						|
 | 
						|
extern char *myalloc();
 | 
						|
 | 
						|
#include <cg_pattern.h>
 | 
						|
 | 
						|
typedef struct list1str {
 | 
						|
	struct list1str *l1next;
 | 
						|
	string l1name;
 | 
						|
} *list1;
 | 
						|
typedef struct list2str {
 | 
						|
	struct list2str *l2next;
 | 
						|
	list1 l2list;
 | 
						|
} *list2;
 | 
						|
typedef struct list3str {
 | 
						|
	struct list3str *l3next;
 | 
						|
	list2 l3list;
 | 
						|
} *list3;
 | 
						|
 | 
						|
typedef struct reginfo {
 | 
						|
	string rname;
 | 
						|
	string rrepr;
 | 
						|
	int rsize;
 | 
						|
	int rmembers[MAXMEMBERS];
 | 
						|
	int rregvar;
 | 
						|
	short rprop[PROPSETSIZE];
 | 
						|
} *reginfo;
 | 
						|
 | 
						|
typedef struct tokeninfo {
 | 
						|
	string t_name;
 | 
						|
	list2 t_struct;
 | 
						|
	struct {
 | 
						|
		int t_type;
 | 
						|
		string t_sname;
 | 
						|
	} t_fields[TOKENSIZE-1];
 | 
						|
	int t_size;
 | 
						|
	cost_t t_cost;
 | 
						|
	int t_format;
 | 
						|
} token_t,*token_p;
 | 
						|
 | 
						|
typedef struct ident {
 | 
						|
	struct ident *i_next;
 | 
						|
	string i_name;
 | 
						|
	int i_type;
 | 
						|
#               define IREG 1
 | 
						|
#               define IPRP 2
 | 
						|
#               define ITOK 3
 | 
						|
#               define IEXP 4
 | 
						|
	union {
 | 
						|
		int i_regno;
 | 
						|
		int i_prpno;
 | 
						|
		int i_tokno;
 | 
						|
		int i_expno;
 | 
						|
	} i_i;
 | 
						|
} ident_t,*ident_p;
 | 
						|
 | 
						|
#define ITABSIZE 32
 | 
						|
extern ident_p identtab[ITABSIZE];
 | 
						|
 | 
						|
#define LOOKUP          0
 | 
						|
#define HALFWAY         1
 | 
						|
#define ENTER           2
 | 
						|
#define JUSTLOOKING     3
 | 
						|
 | 
						|
 | 
						|
typedef struct expr {
 | 
						|
	int expr_typ;
 | 
						|
#               define TYPINT  1
 | 
						|
#               define TYPREG  2
 | 
						|
#               define TYPSTR  3
 | 
						|
#               define TYPBOOL 4
 | 
						|
	int expr_index;
 | 
						|
} expr_t,*expr_p;
 | 
						|
 | 
						|
extern unsigned cc1 INIT(1),cc2 INIT(1),cc3 INIT(1),cc4 INIT(1);
 | 
						|
 | 
						|
extern node_t  nodes[MAXNODES];
 | 
						|
extern node_p  lastnode INIT(nodes+1);
 | 
						|
 | 
						|
extern string codestrings[MAXSTRINGS];
 | 
						|
extern int ncodestrings;
 | 
						|
 | 
						|
extern int strar[MAXNSTR];
 | 
						|
extern int nstr;
 | 
						|
 | 
						|
extern int pathash[256];
 | 
						|
 | 
						|
extern reginfo machregs[MAXREGS];
 | 
						|
extern char stregclass[MAXREGS];
 | 
						|
extern int nmachregs INIT(1);
 | 
						|
extern int nregclasses INIT(1);
 | 
						|
extern int maxmembers;
 | 
						|
extern struct {
 | 
						|
	ident_p propname;
 | 
						|
	set_t	propset;
 | 
						|
} machprops[MAXPROPS];
 | 
						|
extern int nprops;
 | 
						|
extern token_t machtokens[MAXTOKENS];
 | 
						|
extern int nmachtokens INIT(1);
 | 
						|
extern set_t machsets[MAXSETS];
 | 
						|
extern int nmachsets;
 | 
						|
extern int patmnem[MAXEMPATLEN];
 | 
						|
extern int empatlen;
 | 
						|
extern int maxempatlen;
 | 
						|
extern int empatexpr;
 | 
						|
extern int maxrule INIT(1);
 | 
						|
extern int pattokexp[MAXPATLEN];
 | 
						|
extern int tokpatlen;
 | 
						|
extern int lookident;        /* lexical analyzer flag */
 | 
						|
extern list3 structpool;
 | 
						|
extern int nallreg;
 | 
						|
extern int allreg[MAXALLREG];
 | 
						|
extern int maxallreg;
 | 
						|
extern int lino;
 | 
						|
extern int nerrors;
 | 
						|
extern int curtokexp;
 | 
						|
extern expr_t arexp[TOKENSIZE];
 | 
						|
extern int narexp;
 | 
						|
extern inst_t arinstance[MAXINSTANCE];
 | 
						|
extern int narinstance INIT(1);
 | 
						|
extern move_t machmoves[NMOVES];
 | 
						|
extern int nmoves;
 | 
						|
extern byte pattern[MAXPATTERN];
 | 
						|
extern int npatbytes;
 | 
						|
extern int prevind;
 | 
						|
extern int rulecount;                  /* Temporary index for ... construct */
 | 
						|
extern int ncoderules;
 | 
						|
extern int codebytes;
 | 
						|
extern FILE *cfile;
 | 
						|
extern FILE *hfile;
 | 
						|
extern int maxtokensize;
 | 
						|
extern int dealflag;
 | 
						|
extern int emrepllen;
 | 
						|
extern int replmnem[MAXEMPATLEN];
 | 
						|
extern int tokrepllen;
 | 
						|
extern int replinst[MAXPATLEN];
 | 
						|
extern int replexpr[MAXPATLEN];
 | 
						|
extern c1_t c1coercs[MAXC1];
 | 
						|
extern c2_t c2coercs[MAXC2];
 | 
						|
extern c3_t c3coercs[MAXC3];
 | 
						|
extern int nc1,nc2,nc3;
 | 
						|
extern int maxsplit;
 | 
						|
extern int wsize INIT(-1);
 | 
						|
extern int psize INIT(-1);
 | 
						|
extern int bsize INIT(-1);
 | 
						|
extern char *fmt;
 | 
						|
 | 
						|
extern int cchandled;
 | 
						|
extern int ccspoiled;
 | 
						|
extern int ccregexpr;
 | 
						|
extern int ccinstanceno;
 | 
						|
extern int cocopropno;
 | 
						|
extern int cocosetno;
 | 
						|
extern int allexpno;
 | 
						|
 | 
						|
extern int rvused;	/* regvars used */
 | 
						|
extern int nregvar[4];	/* # of register variables of all kinds */
 | 
						|
extern int rvnumbers[4][MAXREGVARS];	/* The register numbers */
 | 
						|
 | 
						|
#define chktabsiz(size,maxsize,which) if(size>=maxsize) tabovf(which)
 | 
						|
 | 
						|
#define MUST1BEINT(e) int exp1=e.expr_index;tstint(e)
 | 
						|
#define MUST2BEINT(e1,e2) int exp1=e1.expr_index,exp2=e2.expr_index;tstint(e1);tstint(e2)
 | 
						|
#define MUST1BEBOOL(e) int exp1=e.expr_index;tstbool(e)
 | 
						|
#define MUST2BEBOOL(e1,e2) int exp1=e1.expr_index,exp2=e2.expr_index;tstbool(e1);tstbool(e2)
 | 
						|
 | 
						|
extern ident_p ilookup();
 | 
						|
extern list2 lookstruct();
 | 
						|
extern string scopy();
 | 
						|
extern unsigned hash();
 |