/*
 * Copyright (c) 1997, by Sun Microsystems, Inc.
 * All rights reserved.
 */

/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
/*	  All Rights Reserved  	*/

/*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T	*/
/*	The copyright notice above does not evidence any   	*/
/*	actual or intended publication of such source code.	*/

#ident	"@(#)symtab.h	1.3	97/07/28 SMI"

/*
 * symtab.h	- symbol table structure & flags
 */

#define	UNDEF		0	/* for undefined symbols... */

#define	S_FUNC		1	/* operator */
#define	S_PARM		2	/* parameter (string) */
#define	S_NAME		3	/* name of a binding set */
#define	S_SWTCH		4	/* is a value */

/*
 * S_FUNC type nodes are parents.  S_PARAM type nodes are children.
 * many children may point to the same parent.
 */

struct sym {
	char *s_name;		/* pointer to name of item */
	char *s_value;		/* symbol value */
	char s_type;		/* symbol type (one of S_?) */
	struct sym *s_next;	/* ptr to next in chain */
};

struct sym *s_find(char *), *s_create(char *),
	*s_lookup(char *), *s_value(char *);
char *strsave(char *);

#define	N_CHILD		0	/* child node ptr */
#define	N_RESULT	0x01	/* result pointer */
#define	N_EMPTY		0x02	/* temp "filled" node */

struct node {
	unsigned char n_val;
	char n_flag;	/* N_CHILD / N_RESULT / N_EMPTY */
	unsigned short n_num;	/* node number */
	struct node *n_next;
	union {
		struct node *n_child;
		char *n_result;
	} n_what;
	unsigned short n_node;	/* number of child node or ptr to text */
	int n_lnum;	/* during initial tree, N_RESULT line number */
};

#define	E_DUP (-2)
#define	E_ERROR (-1)

/*
 * For the "file" command, use following lines in /etc/magic:
0	string		kbd!map		kbd map file
>8	byte		>0		Ver %d:
>10	short		>0		with %d table(s)

 */

#define	KBD_MAGIC	"kbd!map"
#define	KBD_HOFF	8	/* offset in h_magic[] of version number */

/*
 * Version stamps:  The 3B2 and 386 byte order are incompatible, therefore
 * they must have different version numbers to insure that tables compiled
 * for one don't get loaded on the other.  The loader will reject them
 * right away.  Don't define another unless it really won't work for
 * your machine.
 */

#ifdef u3b2
#define	KBD_VER		1	/* 3B2 version */
#else
#ifdef i386
#define	KBD_VER		2	/* 386 version */
#else
#define	KBD_VER		3	/* other version */
#endif
#endif

/*
 * kbd_map only used by the compiler.
 */

struct kbd_map {
	char *mapname;
	struct node *maproot;
	unsigned char *maptext;	/* the text */
	struct cornode *mapnodes;	/* the nodes */
	struct kbd_tab *maptab;
	unsigned char *mapone;
	unsigned char *maperr;	/* error string */
	unsigned char map_min;	/* min & max values */
	unsigned char map_max;
};

/*
 * For linkage maps (mapname is (-1), maptext points to string.
 * For external (ALP) maps, it's (-2), maptext points to string.
 */
#define	LINKAGE	((char *) -1)
#define	EXTERNAL ((char *) -2)
