mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 00:36:31 +00:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1676 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			505 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			505 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* dlgauto.h automaton
 | 
						|
 *
 | 
						|
 * SOFTWARE RIGHTS
 | 
						|
 *
 | 
						|
 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
 | 
						|
 * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
 | 
						|
 * company may do whatever they wish with source code distributed with
 | 
						|
 * PCCTS or the code generated by PCCTS, including the incorporation of
 | 
						|
 * PCCTS, or its output, into commerical software.
 | 
						|
 *
 | 
						|
 * We encourage users to develop software with PCCTS.  However, we do ask
 | 
						|
 * that credit is given to us for developing PCCTS.  By "credit",
 | 
						|
 * we mean that if you incorporate our source code into one of your
 | 
						|
 * programs (commercial product, research project, or otherwise) that you
 | 
						|
 * acknowledge this fact somewhere in the documentation, research report,
 | 
						|
 * etc...  If you like PCCTS and have developed a nice tool with the
 | 
						|
 * output, please mention that you developed it using PCCTS.  In
 | 
						|
 * addition, we ask that this header remain intact in our source code.
 | 
						|
 * As long as these guidelines are kept, we expect to continue enhancing
 | 
						|
 * this system and expect to make other tools available as they are
 | 
						|
 * completed.
 | 
						|
 *
 | 
						|
 * ANTLR 1.33
 | 
						|
 * Will Cohen and Terence Parr
 | 
						|
 * Parr Research Corporation
 | 
						|
 * with Purdue University and AHPCRC, University of Minnesota
 | 
						|
 * 1989-2000
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef ZZDEFAUTO_H
 | 
						|
#define ZZDEFAUTO_H
 | 
						|
 | 
						|
/*  10-Apr-97 133MR1	Uses __USE_PROTOS show should #include pcctscfg.h */
 | 
						|
 | 
						|
#include "pcctscfg.h"
 | 
						|
 | 
						|
zzchar_t	*zzlextext;	/* text of most recently matched token */
 | 
						|
zzchar_t	*zzbegexpr;	/* beginning of last reg expr recogn. */
 | 
						|
zzchar_t	*zzendexpr;	/* beginning of last reg expr recogn. */
 | 
						|
int	zzbufsize = 0;	/* number of characters in zzlextext */          /* MR7 */
 | 
						|
int	zzbegcol = 0;	/* column that first character of token is in*/
 | 
						|
int	zzendcol = 0;	/* column that last character of token is in */
 | 
						|
int	zzline = 1;	/* line current token is on */
 | 
						|
int	zzreal_line=1;	/* line of 1st portion of token that is not skipped */
 | 
						|
int	zzchar;		/* character to determine next state */
 | 
						|
int	zzbufovf;	/* indicates that buffer too small for text */
 | 
						|
int	zzcharfull = 0;
 | 
						|
static zzchar_t	*zznextpos;/* points to next available position in zzlextext*/
 | 
						|
static int 	zzclass;
 | 
						|
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
void	zzerrstd(const char *);
 | 
						|
void	(*zzerr)(const char *)=zzerrstd;/* pointer to error reporting function */
 | 
						|
extern int	zzerr_in(void);
 | 
						|
static int	(*zzfunc_in)(void) = zzerr_in;  /* MR20 */
 | 
						|
#else
 | 
						|
void	zzerrstd();
 | 
						|
void	(*zzerr)()=zzerrstd;	/* pointer to error reporting function */
 | 
						|
extern int	zzerr_in();
 | 
						|
static int	(*zzfunc_in)() = zzerr_in;      /* MR20 */
 | 
						|
#endif
 | 
						|
 | 
						|
static FILE	*zzstream_in=0;
 | 
						|
static zzchar_t	*zzstr_in=0;
 | 
						|
 | 
						|
#ifdef USER_ZZMODE_STACK
 | 
						|
int 	          zzauto = 0;
 | 
						|
#else
 | 
						|
static int     zzauto = 0;
 | 
						|
#endif
 | 
						|
static int	zzadd_erase;
 | 
						|
static char 	zzebuf[70];
 | 
						|
 | 
						|
#ifdef ZZCOL
 | 
						|
#define ZZINC (++zzendcol)
 | 
						|
#else
 | 
						|
#define ZZINC
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#define ZZGETC_STREAM {zzchar = getc(zzstream_in); zzclass = ZZSHIFT(zzchar);}
 | 
						|
#define ZZGETC_FUNC {zzchar = (*zzfunc_in)(); zzclass = ZZSHIFT(zzchar);}
 | 
						|
#define ZZGETC_STR { 			\
 | 
						|
	if (*zzstr_in){				\
 | 
						|
		zzchar = *zzstr_in;		\
 | 
						|
		++zzstr_in;				\
 | 
						|
	}else{						\
 | 
						|
		zzchar = EOF;			\
 | 
						|
	}							\
 | 
						|
	zzclass = ZZSHIFT(zzchar);	\
 | 
						|
}
 | 
						|
 | 
						|
#define ZZNEWSTATE	(newstate = dfa[state][zzclass])
 | 
						|
 | 
						|
#ifndef ZZCOPY
 | 
						|
#define ZZCOPY	\
 | 
						|
	/* Truncate matching buffer to size (not an error) */	\
 | 
						|
	if (zznextpos < lastpos){				\
 | 
						|
		*(zznextpos++) = zzchar;			\
 | 
						|
	}else{							\
 | 
						|
		zzbufovf = 1;					\
 | 
						|
	}
 | 
						|
#endif
 | 
						|
 | 
						|
void
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
zzrdstream( FILE *f )
 | 
						|
#else
 | 
						|
zzrdstream( f )
 | 
						|
FILE *f;
 | 
						|
#endif
 | 
						|
{
 | 
						|
	/* make sure that it is really set to something, otherwise just
 | 
						|
	   leave it be.
 | 
						|
	*/
 | 
						|
	if (f){
 | 
						|
		/* make sure that there is always someplace to get input
 | 
						|
		   before closing zzstream_in
 | 
						|
		*/
 | 
						|
#if 0
 | 
						|
		if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
 | 
						|
#endif
 | 
						|
		zzline = 1;
 | 
						|
		zzstream_in = f;
 | 
						|
		zzfunc_in = NULL;
 | 
						|
		zzstr_in = 0;
 | 
						|
		zzcharfull = 0;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
zzrdfunc( int (*f)(void) )
 | 
						|
#else
 | 
						|
zzrdfunc( f )
 | 
						|
int (*f)();
 | 
						|
#endif
 | 
						|
{
 | 
						|
	/* make sure that it is really set to something, otherwise just
 | 
						|
	   leave it be.
 | 
						|
	*/
 | 
						|
	if (f){
 | 
						|
		/* make sure that there is always someplace to get input
 | 
						|
		   before closing zzstream_in
 | 
						|
		*/
 | 
						|
#if 0
 | 
						|
		if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
 | 
						|
#endif
 | 
						|
		zzline = 1;
 | 
						|
		zzstream_in = NULL;
 | 
						|
		zzfunc_in = f;
 | 
						|
		zzstr_in = 0;
 | 
						|
		zzcharfull = 0;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
zzrdstr( zzchar_t *s )
 | 
						|
#else
 | 
						|
zzrdstr( s )
 | 
						|
zzchar_t *s;
 | 
						|
#endif
 | 
						|
{
 | 
						|
	/* make sure that it is really set to something, otherwise just
 | 
						|
	   leave it be.
 | 
						|
	*/
 | 
						|
	if (s){
 | 
						|
		/* make sure that there is always someplace to get input
 | 
						|
		   before closing zzstream_in
 | 
						|
		*/
 | 
						|
#if 0
 | 
						|
		if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
 | 
						|
#endif
 | 
						|
		zzline = 1;
 | 
						|
		zzstream_in = NULL;
 | 
						|
		zzfunc_in = 0;
 | 
						|
		zzstr_in = s;
 | 
						|
		zzcharfull = 0;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
void zzclose_stream(void)
 | 
						|
#else
 | 
						|
void zzclose_stream()
 | 
						|
#endif
 | 
						|
{
 | 
						|
#if 0
 | 
						|
	fclose( zzstream_in );
 | 
						|
	zzstream_in = NULL;
 | 
						|
	zzfunc_in = NULL;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
/* saves dlg state, but not what feeds dlg (such as file position) */
 | 
						|
void
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
zzsave_dlg_state(struct zzdlg_state *state)
 | 
						|
#else
 | 
						|
zzsave_dlg_state(state)
 | 
						|
struct zzdlg_state *state;
 | 
						|
#endif
 | 
						|
{
 | 
						|
	state->stream = zzstream_in;
 | 
						|
	state->func_ptr = zzfunc_in;
 | 
						|
	state->str = zzstr_in;
 | 
						|
	state->auto_num = zzauto;
 | 
						|
	state->add_erase = zzadd_erase;
 | 
						|
	state->lookc = zzchar;
 | 
						|
	state->char_full = zzcharfull;
 | 
						|
	state->begcol = zzbegcol;
 | 
						|
	state->endcol = zzendcol;
 | 
						|
	state->line = zzline;
 | 
						|
	state->lextext = zzlextext;
 | 
						|
	state->begexpr = zzbegexpr;
 | 
						|
	state->endexpr = zzendexpr;
 | 
						|
	state->bufsize = zzbufsize;
 | 
						|
	state->bufovf = zzbufovf;
 | 
						|
	state->nextpos = zznextpos;
 | 
						|
	state->class_num = zzclass;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
zzrestore_dlg_state(struct zzdlg_state *state)
 | 
						|
#else
 | 
						|
zzrestore_dlg_state(state)
 | 
						|
struct zzdlg_state *state;
 | 
						|
#endif
 | 
						|
{
 | 
						|
	zzstream_in = state->stream;
 | 
						|
	zzfunc_in = state->func_ptr;
 | 
						|
	zzstr_in = state->str;
 | 
						|
	zzauto = state->auto_num;
 | 
						|
	zzadd_erase = state->add_erase;
 | 
						|
	zzchar = state->lookc;
 | 
						|
	zzcharfull = state->char_full;
 | 
						|
	zzbegcol = state->begcol;
 | 
						|
	zzendcol = state->endcol;
 | 
						|
	zzline = state->line;
 | 
						|
	zzlextext = state->lextext;
 | 
						|
	zzbegexpr = state->begexpr;
 | 
						|
	zzendexpr = state->endexpr;
 | 
						|
	zzbufsize = state->bufsize;
 | 
						|
	zzbufovf = state->bufovf;
 | 
						|
	zznextpos = state->nextpos;
 | 
						|
	zzclass = state->class_num;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
zzmode( int m )
 | 
						|
#else
 | 
						|
zzmode( m )
 | 
						|
int m;
 | 
						|
#endif
 | 
						|
{
 | 
						|
	/* points to base of dfa table */
 | 
						|
	if (m<MAX_MODE){
 | 
						|
		zzauto = m;
 | 
						|
		/* have to redo class since using different compression */
 | 
						|
		zzclass = ZZSHIFT(zzchar);
 | 
						|
	}else{
 | 
						|
		sprintf(zzebuf,"Invalid automaton mode = %d ",m);
 | 
						|
		zzerr(zzebuf);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/* erase what is currently in the buffer, and get a new reg. expr */
 | 
						|
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
void zzskip(void)
 | 
						|
#else
 | 
						|
void zzskip()
 | 
						|
#endif
 | 
						|
{
 | 
						|
	zzadd_erase = 1;
 | 
						|
}
 | 
						|
 | 
						|
/* don't erase what is in the zzlextext buffer, add on to it */
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
void zzmore()
 | 
						|
#else
 | 
						|
void zzmore()
 | 
						|
#endif
 | 
						|
{
 | 
						|
	zzadd_erase = 2;
 | 
						|
}
 | 
						|
 | 
						|
/* substitute c for the reg. expr last matched and is in the buffer */
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
void
 | 
						|
zzreplchar(zzchar_t c)
 | 
						|
#else
 | 
						|
void
 | 
						|
zzreplchar(c)
 | 
						|
zzchar_t c;
 | 
						|
#endif
 | 
						|
{
 | 
						|
	/* can't allow overwriting null at end of string */
 | 
						|
	if (zzbegexpr < &zzlextext[zzbufsize-1]){
 | 
						|
		*zzbegexpr = c;
 | 
						|
		*(zzbegexpr+1) = '\0';
 | 
						|
	}
 | 
						|
	zzendexpr = zzbegexpr;
 | 
						|
	if (c != '\0') {
 | 
						|
		zznextpos = zzbegexpr + 1;
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		zznextpos = zzbegexpr;	/* MR30 Zero terminates string. */
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/* replace the string s for the reg. expr last matched and in the buffer */
 | 
						|
void
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
zzreplstr(register zzchar_t *s)
 | 
						|
#else
 | 
						|
zzreplstr(s)
 | 
						|
register zzchar_t *s;
 | 
						|
#endif
 | 
						|
{
 | 
						|
	register zzchar_t *l= &zzlextext[zzbufsize -1];
 | 
						|
 | 
						|
	zznextpos = zzbegexpr;
 | 
						|
	if (s){
 | 
						|
	 	while ((zznextpos <= l) && (*(zznextpos++) = *(s++))!=0){
 | 
						|
			/* empty */
 | 
						|
		}
 | 
						|
		/* correct for NULL at end of string */
 | 
						|
		zznextpos--;
 | 
						|
	}
 | 
						|
	if ((zznextpos <= l) && (*(--s) == 0)){
 | 
						|
		zzbufovf = 0;
 | 
						|
	}else{
 | 
						|
		zzbufovf = 1;
 | 
						|
	}
 | 
						|
	*(zznextpos) = '\0';
 | 
						|
	zzendexpr = zznextpos - 1;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
void zzgettok(void)
 | 
						|
#else
 | 
						|
void zzgettok()
 | 
						|
#endif
 | 
						|
{
 | 
						|
	register int state, newstate;
 | 
						|
	/* last space reserved for the null char */
 | 
						|
	zzchar_t *lastpos;  /* MR27 Remove register since address operator used. */
 | 
						|
 | 
						|
skip:
 | 
						|
	zzreal_line = zzline;
 | 
						|
	zzbufovf = 0;
 | 
						|
	lastpos = &zzlextext[zzbufsize-1];
 | 
						|
	zznextpos = zzlextext;
 | 
						|
	zzbegcol = zzendcol+1;
 | 
						|
more:
 | 
						|
	zzbegexpr = zznextpos;
 | 
						|
#ifdef ZZINTERACTIVE
 | 
						|
	/* interactive version of automaton */
 | 
						|
	/* if there is something in zzchar, process it */
 | 
						|
	state = newstate = dfa_base[zzauto];
 | 
						|
	if (zzcharfull){
 | 
						|
		ZZINC;
 | 
						|
		ZZCOPY;
 | 
						|
		ZZNEWSTATE;
 | 
						|
	}
 | 
						|
	if (zzstr_in)
 | 
						|
		while (zzalternatives[newstate]){
 | 
						|
			state = newstate;
 | 
						|
			ZZGETC_STR;
 | 
						|
			ZZINC;
 | 
						|
			ZZCOPY;
 | 
						|
			ZZNEWSTATE;
 | 
						|
		}
 | 
						|
	else if (zzstream_in)
 | 
						|
		while (zzalternatives[newstate]){
 | 
						|
			state = newstate;
 | 
						|
			ZZGETC_STREAM;
 | 
						|
			ZZINC;
 | 
						|
			ZZCOPY;
 | 
						|
			ZZNEWSTATE;
 | 
						|
		}
 | 
						|
	else if (zzfunc_in)
 | 
						|
		while (zzalternatives[newstate]){
 | 
						|
			state = newstate;
 | 
						|
			ZZGETC_FUNC;
 | 
						|
			ZZINC;
 | 
						|
			ZZCOPY;
 | 
						|
			ZZNEWSTATE;
 | 
						|
		}
 | 
						|
	/* figure out if last character really part of token */
 | 
						|
	if ((state != dfa_base[zzauto]) && (newstate == DfaStates)){
 | 
						|
		zzcharfull = 1;
 | 
						|
		--zznextpos;
 | 
						|
	}else{
 | 
						|
		zzcharfull = 0;
 | 
						|
		state = newstate;
 | 
						|
	}
 | 
						|
	*(zznextpos) = '\0';
 | 
						|
	/* Able to transition out of start state to some non err state?*/
 | 
						|
	if ( state == dfa_base[zzauto] ){
 | 
						|
		/* make sure doesn't get stuck */
 | 
						|
		zzadvance();
 | 
						|
	}
 | 
						|
#else
 | 
						|
	/* non-interactive version of automaton */
 | 
						|
	if (!zzcharfull)
 | 
						|
		zzadvance();
 | 
						|
	else
 | 
						|
		ZZINC;
 | 
						|
	state = dfa_base[zzauto];
 | 
						|
	if (zzstr_in)
 | 
						|
		while (ZZNEWSTATE != DfaStates){
 | 
						|
			state = newstate;
 | 
						|
			ZZCOPY;
 | 
						|
			ZZGETC_STR;
 | 
						|
			ZZINC;
 | 
						|
		}
 | 
						|
	else if (zzstream_in)
 | 
						|
		while (ZZNEWSTATE != DfaStates){
 | 
						|
			state = newstate;
 | 
						|
			ZZCOPY;
 | 
						|
			ZZGETC_STREAM;
 | 
						|
			ZZINC;
 | 
						|
		}
 | 
						|
	else if (zzfunc_in)
 | 
						|
		while (ZZNEWSTATE != DfaStates){
 | 
						|
			state = newstate;
 | 
						|
			ZZCOPY;
 | 
						|
			ZZGETC_FUNC;
 | 
						|
			ZZINC;
 | 
						|
		}
 | 
						|
	zzcharfull = 1;
 | 
						|
	if ( state == dfa_base[zzauto] ){
 | 
						|
		if (zznextpos < lastpos){
 | 
						|
			*(zznextpos++) = zzchar;
 | 
						|
		}else{
 | 
						|
			zzbufovf = 1;
 | 
						|
		}
 | 
						|
		*zznextpos = '\0';
 | 
						|
		/* make sure doesn't get stuck */
 | 
						|
		zzadvance();
 | 
						|
	}else{
 | 
						|
		*zznextpos = '\0';
 | 
						|
	}
 | 
						|
#endif
 | 
						|
#ifdef ZZCOL
 | 
						|
	zzendcol -= zzcharfull;
 | 
						|
#endif
 | 
						|
	zzendexpr = zznextpos -1;
 | 
						|
	zzadd_erase = 0;
 | 
						|
	(*actions[accepts[state]])();
 | 
						|
	switch (zzadd_erase) {
 | 
						|
		case 1: goto skip;
 | 
						|
		case 2: goto more;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
void zzadvance(void)
 | 
						|
#else
 | 
						|
void zzadvance()
 | 
						|
#endif
 | 
						|
{
 | 
						|
	if (zzstream_in) { ZZGETC_STREAM; zzcharfull = 1; ZZINC;}
 | 
						|
	if (zzfunc_in) { ZZGETC_FUNC; zzcharfull = 1; ZZINC;}
 | 
						|
	if (zzstr_in) { ZZGETC_STR; zzcharfull = 1; ZZINC;}
 | 
						|
	if (!(zzstream_in || zzfunc_in || zzstr_in)){
 | 
						|
		zzerr_in();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
zzerrstd(const char *s)
 | 
						|
#else
 | 
						|
zzerrstd(s)
 | 
						|
char *s;
 | 
						|
#endif
 | 
						|
{
 | 
						|
        zzLexErrCount++;                /* MR11 */
 | 
						|
        fprintf(stderr,
 | 
						|
                "%s near line %d (text was '%s')\n",
 | 
						|
                ((s == NULL) ? "Lexical error" : s),
 | 
						|
                zzline,zzlextext);
 | 
						|
}
 | 
						|
 | 
						|
#ifdef __USE_PROTOS
 | 
						|
int zzerr_in(void)
 | 
						|
#else
 | 
						|
int zzerr_in()
 | 
						|
#endif
 | 
						|
{
 | 
						|
	fprintf(stderr,"No input stream, function, or string\n");
 | 
						|
	/* return eof to get out gracefully */
 | 
						|
	return EOF;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |