/*
 * Copyright (c) 1993 by Sun Microsystems, Inc.
 */

#pragma ident	"@(#)dextern	6.15	97/12/08 SMI"

#include <stdio.h>
#include <ctype.h>
#include <memory.h>
#include <string.h>
#include <malloc.h>
#include <values.h>
#ifdef __STDC__
#include <stdlib.h>
#else
extern char *malloc();
extern char *calloc();
extern char *realloc();
extern void exit();
#include <sys/types.h>		/* for size_t */
#ifndef _SIZE_T
#define	_SIZE_T
#if defined(_LP64) || defined(_I32LPx)
typedef	unsigned long	size_t;		/* size of something in bytes */
#else
typedef	unsigned int	size_t;		/* (historical version) */
#endif
#endif
#endif
#ifdef NOLIBW
/*
 * no wide char classification macro or I/O.
 * mimic these with whatever we have.
 * "%ws", L'c' and L"ssss" in the source files are
 * replaced by sed in makefile.
 */
#define	iswascii(c)	isascii((char)(c))
#define	iswspace(c)	isspace((char)(c))
#define	iswalpha(c)	isalpha((char)(c))
#define	iswdigit(c)	isdigit((char)(c))
#define	iswxdigit(c)	isxdigit((char)(c))
#define	iswupper(c)	isupper((char)(c))
#define	iswlower(c)	islower((char)(c))
#define	towlower(c)	((wchar_t) tolower((char)(c)))
#define	getwc(f)	getc(f)
#define	ungetwc(c, f)	ungetc((char)(c), f)
#define	putwc(c, f)	putc((char)(c), (f))
#else /* !NOLIBW */ /* This is probably a SysV with MNLS extension. */
#include <wctype.h>
#endif /* !NOLIBW */
	/*  MANIFEST CONSTANT DEFINITIONS */
#if u3b || u3b15 || u3b2 || vax || uts || sparc
#define	WORD32
#endif
#include <libintl.h>

	/* base of nonterminal internal numbers */

#define	NTBASE (10000000)

	/* internal codes for error and accept actions */

#define	ERRCODE  8190
#define	ACCEPTCODE 8191

	/* sizes and limits */

#define	ACTSIZE 4000
#define	MEMSIZE 2000
#define	PSTSIZE 1024
#define	NSTATES 1000
#define	NTERMS 127
#define	NPROD 300
#define	NNONTERM 600
#define	TEMPSIZE 800
#define	CNAMSZ 1000
#define	LSETSIZE 950
#define	WSETSIZE 850

#define	NAMESIZE 50
#define	NTYPES 1000

#define	NMBCHARSZ 100
#define	LKFACTOR 5

#ifdef WORD32
	/* bit packing macros (may be machine dependent) */
#define	BIT(a, i) ((a)[(i)>>5] & (1<<((i)&037)))
#define	SETBIT(a, i) ((a)[(i)>>5] |= (1<<((i)&037)))

	/* number of words needed to hold n+1 bits */
#define	NWORDS(n) (((n)+32)/32)

#else

	/* bit packing macros (may be machine dependent) */
#define	BIT(a, i) ((a)[(i)>>4] & (1<<((i)&017)))
#define	SETBIT(a, i) ((a)[(i)>>4] |= (1<<((i)&017)))

	/* number of words needed to hold n+1 bits */
#define	NWORDS(n) (((n)+16)/16)
#endif

	/*
	 * relationships which must hold:
	 * TBITSET ints must hold NTERMS+1 bits...
	 * WSETSIZE >= NNONTERM
	 * LSETSIZE >= NNONTERM
	 * TEMPSIZE >= NTERMS + NNONTERMs + 1
	 * TEMPSIZE >= NSTATES
	 */

	/* associativities */

#define	NOASC 0  /* no assoc. */
#define	LASC 1  /* left assoc. */
#define	RASC 2  /* right assoc. */
#define	BASC 3  /* binary assoc. */

	/* flags for state generation */

#define	DONE 0
#define	MUSTDO 1
#define	MUSTLOOKAHEAD 2

	/* flags for a rule having an action, and being reduced */

#define	ACTFLAG 04
#define	REDFLAG 010

	/* output parser flags */
#define	YYFLAG1 (-10000000)

	/* macros for getting associativity and precedence levels */

#define	ASSOC(i) ((i)&07)
#define	PLEVEL(i) (((i)>>4)&077)
#define	TYPE(i)  ((i>>10)&077)

	/* macros for setting associativity and precedence levels */

#define	SETASC(i, j) i |= j
#define	SETPLEV(i, j) i |= (j<<4)
#define	SETTYPE(i, j) i |= (j<<10)

	/* looping macros */

#define	TLOOP(i) for (i = 1; i <= ntokens; ++i)
#define	NTLOOP(i) for (i = 0; i <= nnonter; ++i)
#define	PLOOP(s, i) for (i = s; i < nprod; ++i)
#define	SLOOP(i) for (i = 0; i < nstate; ++i)
#define	WSBUMP(x) ++x
#define	WSLOOP(s, j) for (j = s; j < &wsets[cwp]; ++j)
#define	ITMLOOP(i, p, q) q = pstate[i+1]; for (p = pstate[i]; p < q; ++p)
#define	SETLOOP(i) for (i = 0; i < tbitset; ++i)

	/* I/O descriptors */

extern FILE * finput;		/* input file */
extern FILE * faction;		/* file for saving actions */
extern FILE * fdefine;		/* file for #defines */
extern FILE * ftable;		/* y.tab.c file */
extern FILE * ftemp;		/* tempfile to pass 2 */
extern FILE * fdebug;		/* tempfile for two debugging info arrays */
extern FILE * foutput;		/* y.output file */

	/* structure declarations */

typedef struct looksets {
	int *lset;
} LOOKSETS;

typedef struct item {
	int *pitem;
	LOOKSETS *look;
} ITEM;

typedef struct toksymb {
	wchar_t *name;
	int value;
} TOKSYMB;

typedef struct mbclit {
	wchar_t character;
	int tvalue; /* token issued for the character */
} MBCLIT;

typedef struct ntsymb {
	wchar_t *name;
	int tvalue;
} NTSYMB;

typedef struct wset {
	int *pitem;
	int flag;
	LOOKSETS ws;
} WSET;

	/* token information */

extern int ntokens;	/* number of tokens */
extern TOKSYMB *tokset;
extern int ntoksz;

	/*
	 * multibyte (c > 255) character literals are
	 * handled as though they were tokens except
	 * that it generates a separate mapping table.
	 */
extern int nmbchars;	/* number of mb literals */
extern MBCLIT *mbchars;
extern int nmbcharsz;

	/* nonterminal information */

extern int nnonter;	/* the number of nonterminals */
extern NTSYMB *nontrst;
extern int nnontersz;

	/* grammar rule information */

extern int nprod;	/* number of productions */
extern int **prdptr;	/* pointers to descriptions of productions */
extern int *levprd;	/* contains production levels to break conflicts */
extern wchar_t *had_act; /* set if reduction has associated action code */

	/* state information */

extern int nstate;		/* number of states */
extern ITEM **pstate;	/* pointers to the descriptions of the states */
extern int *tystate;	/* contains type information about the states */
extern int *defact;	/* the default action of the state */

extern int size;

	/* lookahead set information */

extern int TBITSET;
extern LOOKSETS *lkst;
extern int nolook;  /* flag to turn off lookahead computations */

	/* working set information */

extern WSET *wsets;

	/* storage for productions */

extern int *mem0;
extern int *mem;
extern int *tracemem;
extern int new_memsize;

	/* storage for action table */

extern int *amem;
extern int *memp;		/* next free action table position */
extern int *indgo;		/* index to the stored goto table */
extern int new_actsize;

	/* temporary vector, indexable by states, terms, or ntokens */

extern int *temp1;
extern int lineno; /* current line number */

	/* statistics collection variables */

extern int zzgoent;
extern int zzgobest;
extern int zzacent;
extern int zzexcp;
extern int zzrrconf;
extern int zzsrconf;

	/* define external functions */

extern void setup(int, char * []);
extern void closure(int);
extern void output(void);
extern void aryfil(int *, int, int);
extern void error(char *, ...);
extern void warning(int, char *, ...);
extern void putitem(int *, LOOKSETS *);
extern void go2out(void);
extern void hideprod(void);
extern void callopt(void);
extern void warray(wchar_t *, int *, int);
extern wchar_t *symnam(int);
extern wchar_t *writem(int *);
extern void exp_mem(int);
extern void exp_act(int **);
extern apack(int *, int);
extern int state(int);
extern void fprintf3(FILE *, const char *, const wchar_t *, const char *, ...);
extern void error3(const char *, const wchar_t *, const char *, ...);

extern wchar_t *wscpy(wchar_t *, const wchar_t *);
extern size_t wslen(const wchar_t *);
extern int wscmp(const wchar_t *, const wchar_t *);


	/* yaccpar location */

extern char *parser;

	/* default settings for a number of macros */

	/* name of yacc tempfiles */

#ifndef TEMPNAME
#define	TEMPNAME "yacc.tmp"
#endif

#ifndef ACTNAME
#define	ACTNAME "yacc.acts"
#endif

#ifndef DEBUGNAME
#define	DEBUGNAME "yacc.debug"
#endif

	/* command to clobber tempfiles after use */

#ifndef ZAPFILE
#define	ZAPFILE(x) (void)unlink(x)
#endif

#ifndef PARSER
#define	PARSER "/usr/ccs/lib/yaccpar"
#endif
