
%{

/* Parser for command lines in the Wine debugger
 *
 * Version 1.0
 * Eric Youngdale
 * 9/93
 */

#include <stdio.h>
#define YYSTYPE int

#include "regpos.h"
extern FILE * yyin;
unsigned int * regval = NULL;
unsigned int dbg_mask = 0;
unsigned int dbg_mode = 0;

void issue_prompt();
%}


%token CONT
%token QUIT
%token HELP
%token INFO
%token STACK
%token REG
%token REGS
%token NUM
%token SET
%token PRINT
%token IDENTIFIER
%token NO_SYMBOL
%token SYMBOLFILE
%token DEFINE

%%

 input:  /* empty */
	| input line  { issue_prompt(); }

 line:		'\n'
	| infocmd '\n'
	| error '\n'       {yyerrok; }
	| QUIT  '\n'       { exit(0); };
	| HELP  '\n'       { dbg_help(); };
	| CONT '\n'        { return; };
	| SYMBOLFILE IDENTIFIER '\n' { read_symboltable($2); };
	| DEFINE IDENTIFIER expr '\n'  { add_hash($2, $3); };
	| x_command
	| print_command
	| deposit_command

deposit_command:
	SET REG '=' expr '\n' { regval[$2] = $4; }
	| SET '*' expr '=' expr '\n' { *((unsigned int *) $3) = $5; }
	| SET symbol '=' expr '\n' { *((unsigned int *) $2) = $4; }


x_command:
	  'x' expr  '\n' { examine_memory($2, 1, 'x'); };
	| 'x' '/' fmt expr  '\n' { examine_memory($4, 1, $3); };
	| 'x' '/' NUM fmt expr  '\n' { examine_memory($5, $3, $4); };

 print_command:
	PRINT expr  '\n' { examine_memory(((unsigned int) &$2 ), 1, 'x'); };

 fmt:  'x'     { $$ = 'x'; }
	| 'd'  { $$ = 'd'; }
	| 'i'  { $$ = 'i'; }
	| 'w'  { $$ = 'w'; }
	| 's'  { $$ = 's'; }
	| 'c'  { $$ = 'c'; }
	| 'b' { $$ = 'b'; }

 symbol: IDENTIFIER             { $$ = find_hash($1);
			           if($$ == 0xffffffff) {
					   fprintf(stderr,"Symbol %s not found\n", $1);
					   YYERROR;
				   };
			        }; 

 expr:  NUM			{ $$ = $1;	}
	| REG			{ $$ = regval[$1]; }
	| symbol   		{ $$ = *((unsigned int *) $1); }
	| expr '+' NUM		{ $$ = $1 + $3; }
	| expr '-' NUM		{ $$ = $1 - $3; };
	| '(' expr ')'		{ $$ = $2; };
	| '*' expr		{ $$ = *((unsigned int *) $2); };
	
 infocmd: INFO REGS { info_reg(); }
	| INFO STACK  { info_stack(); };


%%

void 
issue_prompt(){
#ifndef USE_READLINE
	fprintf(stderr,"Wine-dbg>");
#endif
}

static int loaded_symbols = 0;

void
wine_debug(int * regs)
{
	int i;
#ifdef YYDEBUG
	yydebug = 0;
#endif
	yyin = stdin;
	regval = regs;

	/* This only works for linux - NetBSD will need something different here. */
	if((SC_CS & 7) != 7) {
		dbg_mask = 0xffffffff;
		dbg_mode = 32;
	} else {
		dbg_mask = 0xffff;
		dbg_mode = 16;
	};

	/* This is intended to read the entry points from the Windows image, and
	   insert them in the hash table.  It does not work yet, so it is commented out. */
#if 0
	if(!loaded_symbols){
		loaded_symbols++;
		load_entrypoints();
	};
#endif

	/* Show where we crashed */
	examine_memory(SC_EIP(dbg_mask), 1, 'i');

	issue_prompt();

	yyparse();
	flush_symbols();
	fprintf(stderr,"Returning to Wine...\n");

}


yyerror(char * s){
	fprintf(stderr,"%s\n", s);
}

