/*
 * Structures for symbol table entries.
 */

struct tlentry {			/* local table entry */
   struct tlentry *l_blink;	/*   link for bucket chain */
   char *l_name;		/*   name of variable */
   int l_flag;			/*   variable flags */
   };

struct tgentry {			/* global table entry */
   struct tgentry *g_blink;	/*   link for bucket chain */
   char *g_name;		/*   name of variable */
   int g_flag;			/*   variable flags */
   int g_nargs;			/*   number of args (procedure) or */
   };				/*     number of fields (record) */

struct tcentry {			/* constant table entry */
   struct tcentry *c_blink;	/*   link for bucket chain */
   char *c_name;		/*   pointer to string */
   int c_length;		/*   length of string */
   int c_flag;			/*   type of literal flag */
   };

struct tientry {			/* identifier table entry */
   struct tientry *i_blink;	/*   link for bucket chain */
   char *i_name;		/*   pointer to string */
   int i_length;		/*   length of string */
   };

/*
 * Flag values.
 */

#define F_Global	    01	/* variable declared global externally */
#define F_Proc		    04	/* procedure */
#define F_Record	   010	/* record */
#define F_Dynamic	   020	/* variable declared local dynamic */
#define F_Static	   040	/* variable declared local static */
#define F_Builtin	  0100	/* identifier refers to built-in procedure */
#define F_ImpError	  0400	/* procedure has default error */
#define F_Argument	 01000	/* variable is a formal parameter */
#define F_IntLit	 02000	/* literal is an integer */
#define F_RealLit	 04000	/* literal is a real */
#define F_StrLit	010000	/* literal is a string */
#define F_CsetLit	020000	/* literal is a cset */

/*
 * Symbol table region pointers.
 */

extern struct tlentry **lhash;	/* hash area for local table */
extern struct tgentry **ghash;	/* hash area for global table */
extern struct tcentry **chash;	/* hash area for constant table */
extern struct tientry **ihash;	/* hash area for identifier table */

extern struct tlentry *ltable;	/* local table */
extern struct tgentry *gtable;	/* global table */
extern struct tcentry *ctable;	/* constant table */
extern struct tientry *itable;	/* identifier table */

extern struct tlentry *lfree;	/* free pointer for local table */
extern struct tgentry *gfree;	/* free pointer for global table */
extern struct tcentry *ctfree;	/* free pointer for constant table */
extern struct tientry *ifree;	/* free pointer for identifier table */


/*
 * Structure for keyword table.
 */

struct keyent {
      char *keyname;
      int keyid;
      };

extern struct keyent keytab[];	/* keyword table */

/*
 * Hash functions for symbol tables.
 */

#define ghasher(x)	(((word)x)&gmask)	 /* global symbol table */
#define lhasher(x)	(((word)x)&lmask)	 /* local symbol table */
#define chasher(x)	(((word)x)&cmask)	 /* constant symbol table */
