/* $Id$ */

/* Symbol table data structure.
   Each identifier structure refers to a list of possible meanings of this
   identifier. Each of these meanings is represented by a "symbol" structure.
*/

typedef union constant {	/* depends on type */
  long	co_ival;
  double co_rval;
  char *co_sval;
  char *co_setval;
} t_const, *p_const;

typedef struct name {
  long	nm_value;		/* address or offset */
  struct scope *nm_scope;	/* for names that define a scope */
} t_name, *p_name;

typedef struct symbol {
  struct symbol	*sy_next;	/* link to next meaning */
  struct symbol	*sy_prev_sc;	/* link to previous decl in scope */
  struct type	*sy_type;	/* type of symbol */
  int		sy_class;
#define CONST		0x0001
#define TYPE		0x0002
#define TAG		0x0004
#define MODULE		0x0008
#define PROC		0x0010
#define FUNCTION	0x0020
#define VAR		0x0040
#define REGVAR		0x0080
#define LOCVAR		0x0100
#define VARPAR		0x0200
#define FIELD		0x0400
#define FILESYM		0x0800	/* a filename */
#define FILELINK	0x1000	/* a filename without its suffix */
#define LBOUND		0x2000	/* lower bound of array descriptor */
#define UBOUND		0x4000	/* upper bound of array descriptor */
  struct idf	*sy_idf;	/* reference back to its idf structure */
  struct scope	*sy_scope;	/* scope in which this symbol resides */
  union {
	t_const	syv_const;	/* CONST */
	t_name	syv_name;
	struct file *syv_file;		/* for FILESYM */
	struct symbol *syv_fllink;	/* for FILELINK */
	struct symbol *syv_descr;	/* for LBOUND and UBOUND */
	struct fields *syv_field;
  }	sy_v;
#define sy_const	sy_v.syv_const
#define sy_name		sy_v.syv_name
#define sy_file		sy_v.syv_file
#define sy_filelink	sy_v.syv_fllink
#define sy_field	sy_v.syv_field
#define sy_descr	sy_v.syv_descr
} t_symbol, *p_symbol;

/* ALLOCDEF "symbol" 50 */

extern p_symbol	NewSymbol(), Lookup(), Lookfromscope(), add_file();
extern p_symbol identify();

extern p_symbol	currfile, listfile;