blob: 80e8d34fca48a0e136ab9458ee2f68d36db58b6c [file] [log] [blame]
%{
/* 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);
}