- Enhanced internal variables framework (including read/save to
registry and typing)
- Finalized use of Windows' Console I/O interface (instead of Unix std
streams)
- Now handling registers as internal variables (they are no longer
seen as a specific type)
diff --git a/debugger/break.c b/debugger/break.c
index 616dbc8..ad383f5 100644
--- a/debugger/break.c
+++ b/debugger/break.c
@@ -7,7 +7,6 @@
*/
#include "config.h"
-#include <stdio.h>
#include "debugger.h"
#ifdef __i386__
@@ -40,7 +39,7 @@
#define MAX_BREAKPOINTS 100
-static BREAKPOINT breakpoints[MAX_BREAKPOINTS];
+static DBG_BREAKPOINT breakpoints[MAX_BREAKPOINTS];
static int next_bp = 1; /* breakpoint 0 is reserved for step-over */
diff --git a/debugger/db_disasm.c b/debugger/db_disasm.c
index 1a2e9e8..66003e1 100644
--- a/debugger/db_disasm.c
+++ b/debugger/db_disasm.c
@@ -62,7 +62,6 @@
* Instruction disassembler.
*/
-#include <stdio.h>
#include "debugger.h"
#ifdef __i386__
diff --git a/debugger/dbg.y b/debugger/dbg.y
index fea90c0..903c42e 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -25,7 +25,6 @@
static void issue_prompt(void);
static void mode_command(int);
-void flush_symbols(void);
int yylex(void);
int yyerror(char *);
@@ -34,7 +33,6 @@
%union
{
DBG_VALUE value;
- enum debug_regs reg;
char * string;
int integer;
struct list_id listing;
@@ -50,9 +48,8 @@
%token tFRAME tSHARE tCOND tDISPLAY tUNDISPLAY tDISASSEMBLE
%token tSTEPI tNEXTI tFINISH tSHOW tDIR tWHATIS
%token <string> tPATH
-%token <string> tIDENTIFIER tSTRING tDEBUGSTR
+%token <string> tIDENTIFIER tSTRING tDEBUGSTR tINTVAR
%token <integer> tNUM tFORMAT
-%token <reg> tREG
%token tSYMBOLFILE
%token tCHAR tSHORT tINT tLONG tFLOAT tDOUBLE tUNSIGNED tSIGNED
@@ -159,9 +156,7 @@
| walk_command
set_command:
- tSET tREG '=' expr_value tEOL { DEBUG_SetRegister( $2, $4 );
- DEBUG_FreeExprMem(); }
- | tSET lval_addr '=' expr_value tEOL { DEBUG_WriteMemory( &$2.addr, $4 );
+ tSET lval_addr '=' expr_value tEOL { DEBUG_WriteMemory( &$2, $4 );
DEBUG_FreeExprMem(); }
pathname:
@@ -313,11 +308,10 @@
expr { $$ = DEBUG_EvalExpr($1); }
expr_value:
- expr { DBG_VALUE value = DEBUG_EvalExpr($1);
- /* expr_value is typed as an integer */
- if (!value.addr.off ||
- !DEBUG_READ_MEM((void*)value.addr.off, &$$, sizeof($$)))
- $$ = 0; }
+ expr { DBG_VALUE value = DEBUG_EvalExpr($1);
+ /* expr_value is typed as an integer */
+ $$ = DEBUG_ReadMemory(&value); }
+
/*
* The expr rule builds an expression tree. When we are done, we call
* EvalExpr to evaluate the value of the expression. The advantage of
@@ -327,7 +321,7 @@
expr:
tNUM { $$ = DEBUG_ConstExpr($1); }
| tSTRING { $$ = DEBUG_StringExpr($1); }
- | tREG { $$ = DEBUG_RegisterExpr($1); }
+ | tINTVAR { $$ = DEBUG_IntVarExpr($1); }
| tIDENTIFIER { $$ = DEBUG_SymbolExpr($1); }
| expr OP_DRF tIDENTIFIER { $$ = DEBUG_StructPExpr($1, $3); }
| expr '.' tIDENTIFIER { $$ = DEBUG_StructExpr($1, $3); }
@@ -335,8 +329,8 @@
| tIDENTIFIER '(' expr ')' { $$ = DEBUG_CallExpr($1, 1, $3); }
| tIDENTIFIER '(' expr ',' expr ')' { $$ = DEBUG_CallExpr($1, 2, $3, $5); }
| tIDENTIFIER '(' expr ',' expr ',' expr ')' { $$ = DEBUG_CallExpr($1, 3, $3, $5, $7); }
- | tIDENTIFIER '(' expr ',' expr ',' expr ',' expr ')' { $$ = DEBUG_CallExpr($1, 3, $3, $5, $7, $9); }
- | tIDENTIFIER '(' expr ',' expr ',' expr ',' expr ',' expr ')' { $$ = DEBUG_CallExpr($1, 3, $3, $5, $7, $9, $11); }
+ | tIDENTIFIER '(' expr ',' expr ',' expr ',' expr ')' { $$ = DEBUG_CallExpr($1, 4, $3, $5, $7, $9); }
+ | tIDENTIFIER '(' expr ',' expr ',' expr ',' expr ',' expr ')' { $$ = DEBUG_CallExpr($1, 5, $3, $5, $7, $9, $11); }
| expr '[' expr ']' { $$ = DEBUG_BinopExpr(EXP_OP_ARR, $1, $3); }
| expr ':' expr { $$ = DEBUG_BinopExpr(EXP_OP_SEG, $1, $3); }
| expr OP_LOR expr { $$ = DEBUG_BinopExpr(EXP_OP_LOR, $1, $3); }
@@ -379,7 +373,7 @@
lvalue:
tNUM { $$ = DEBUG_ConstExpr($1); }
- | tREG { $$ = DEBUG_RegisterExpr($1); }
+ | tINTVAR { $$ = DEBUG_IntVarExpr($1); }
| tIDENTIFIER { $$ = DEBUG_SymbolExpr($1); }
| lvalue OP_DRF tIDENTIFIER { $$ = DEBUG_StructPExpr($1, $3); }
| lvalue '.' tIDENTIFIER { $$ = DEBUG_StructExpr($1, $3); }
diff --git a/debugger/debug.l b/debugger/debug.l
index 75f165d..0adf93c 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -5,7 +5,6 @@
*/
%{
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "debugger.h"
@@ -23,11 +22,8 @@
if ( (result = dbg_read((char *) buf, max_size )) < 0 ) \
YY_FATAL_ERROR( "read() in flex scanner failed" );
-extern char * readline(const char *);
-extern void add_history(char *);
static int dbg_read(char * buf, int size);
static char * make_symbol(char *);
-void flush_symbols();
#endif /* DONT_USE_READLINE */
@@ -86,33 +82,6 @@
{STRING} { yylval.string = make_symbol(yytext); return tSTRING; }
<DEBUGSTR>[a-z+\-,]* { yylval.string = yytext; return tDEBUGSTR; }
-$pc { yylval.reg = REG_EIP; return tREG; }
-$flags { yylval.reg = REG_EFL; return tREG; }
-$eip { yylval.reg = REG_EIP; return tREG; }
-$ip { yylval.reg = REG_IP; return tREG; }
-$esp { yylval.reg = REG_ESP; return tREG; }
-$sp { yylval.reg = REG_SP; return tREG; }
-$eax { yylval.reg = REG_EAX; return tREG; }
-$ebx { yylval.reg = REG_EBX; return tREG; }
-$ecx { yylval.reg = REG_ECX; return tREG; }
-$edx { yylval.reg = REG_EDX; return tREG; }
-$esi { yylval.reg = REG_ESI; return tREG; }
-$edi { yylval.reg = REG_EDI; return tREG; }
-$ebp { yylval.reg = REG_EBP; return tREG; }
-$ax { yylval.reg = REG_AX; return tREG; }
-$bx { yylval.reg = REG_BX; return tREG; }
-$cx { yylval.reg = REG_CX; return tREG; }
-$dx { yylval.reg = REG_DX; return tREG; }
-$si { yylval.reg = REG_SI; return tREG; }
-$di { yylval.reg = REG_DI; return tREG; }
-$bp { yylval.reg = REG_BP; return tREG; }
-$es { yylval.reg = REG_ES; return tREG; }
-$ds { yylval.reg = REG_DS; return tREG; }
-$cs { yylval.reg = REG_CS; return tREG; }
-$ss { yylval.reg = REG_SS; return tREG; }
-$fs { yylval.reg = REG_FS; return tREG; }
-$gs { yylval.reg = REG_GS; return tREG; }
-
<INITIAL>info|inf|in { BEGIN(INFO_CMD); return tINFO; }
<INITIAL>up { BEGIN(NOCMD); return tUP; }
<INITIAL>down|dow|do { BEGIN(NOCMD); return tDOWN; }
@@ -155,7 +124,7 @@
<INFO_CMD>share|shar|sha { return tSHARE; }
<INFO_CMD>locals|local|loca|loc { return tLOCAL; }
-<INFO_CMD,WALK_CMD>class|clas|cla { return tCLASS; }
+<INFO_CMD,WALK_CMD>class|clas|cla { return tCLASS; }
<INFO_CMD,WALK_CMD>module|modul|modu|mod { return tMODULE; }
<INFO_CMD,WALK_CMD>queue|queu|que { return tQUEUE; }
<INFO_CMD,WALK_CMD>process|proces|proce|proc { return tPROCESS; }
@@ -163,7 +132,7 @@
<INFO_CMD,WALK_CMD>modref|modre|modr { return tMODREF; }
<INFO_CMD>registers|regs|reg|re { return tREGS; }
<INFO_CMD>segments|segment|segm|seg|se { return tSEGMENTS; }
-<INFO_CMD>stack|stac|sta|st { return tSTACK; }
+<INFO_CMD>stack|stac|sta|st { return tSTACK; }
<INFO_CMD>maps|map { return tMAPS; }
<INFO_CMD,WALK_CMD>window|windo|wind|win|wnd { return tWND; }
<HELP_CMD>info|inf|in { return tINFO; }
@@ -184,6 +153,7 @@
enum { return tENUM; }
{IDENTIFIER} { yylval.string = make_symbol(yytext); return tIDENTIFIER; }
+"$"{IDENTIFIER} { yylval.string = make_symbol(yytext+1); return tINTVAR; }
<PATH_EXPECTED>{PATHNAME} { yylval.string = make_symbol(yytext); return tPATH; }
@@ -279,11 +249,12 @@
static char *local_symbols[30];
static int next_symbol;
-char * make_symbol(char * symbol){
+static char * make_symbol(char * symbol)
+{
return local_symbols[next_symbol++] = DBG_strdup(symbol);
}
-void flush_symbols()
+void flush_symbols(void)
{
while(--next_symbol>= 0) DBG_free(local_symbols[next_symbol]);
next_symbol = 0;
diff --git a/debugger/debugger.h b/debugger/debugger.h
index 1c7b9ed..9190b37 100644
--- a/debugger/debugger.h
+++ b/debugger/debugger.h
@@ -41,6 +41,7 @@
/*
* For constants generated by the parser, we use this datatype
*/
+extern struct datatype * DEBUG_TypeShortUInt;
extern struct datatype * DEBUG_TypeInt;
extern struct datatype * DEBUG_TypeIntConst;
extern struct datatype * DEBUG_TypeUSInt;
@@ -135,7 +136,7 @@
} w;
} u;
struct expr * condition;
-} BREAKPOINT;
+} DBG_BREAKPOINT;
typedef struct tagDBG_THREAD {
struct tagDBG_PROCESS* process;
@@ -147,7 +148,7 @@
int dbg_mode;
enum exec_mode dbg_exec_mode;
int dbg_exec_count;
- BREAKPOINT stepOverBP;
+ DBG_BREAKPOINT stepOverBP;
struct tagDBG_THREAD* next;
struct tagDBG_THREAD* prev;
} DBG_THREAD;
@@ -207,20 +208,12 @@
#define DM_TYPE_NE 2
#define DM_TYPE_PE 3
-#ifdef __i386__
-#ifdef REG_SP /* Some Sun includes define this */
-#undef REG_SP
-#endif
-
-enum debug_regs
-{
- REG_EAX, REG_EBX, REG_ECX, REG_EDX, REG_ESI,
- REG_EDI, REG_EBP, REG_EFL, REG_EIP, REG_ESP,
- REG_AX, REG_BX, REG_CX, REG_DX, REG_SI,
- REG_DI, REG_BP, REG_FL, REG_IP, REG_SP,
- REG_CS, REG_DS, REG_ES, REG_SS, REG_FS, REG_GS
-};
-#endif
+typedef struct {
+ DWORD val;
+ const char* name;
+ LPDWORD pval;
+ struct datatype* type;
+} DBG_INTVAR;
#define OFFSET_OF(__c,__f) ((int)(((char*)&(((__c*)0)->__f))-((char*)0)))
@@ -241,9 +234,27 @@
/* debugger/db_disasm.c */
extern void DEBUG_Disasm( DBG_ADDR *addr, int display );
+ /* debugger/dbg.y */
+extern BOOL DEBUG_Main( BOOL is_debug, BOOL force, DWORD code );
+extern void DEBUG_Exit( DWORD );
+
+ /* debugger/debug.l */
+extern void flush_symbols(void);
+
+ /* debugger/display.c */
+extern int DEBUG_DoDisplay(void);
+extern int DEBUG_AddDisplay(struct expr * exp, int count, char format);
+extern int DEBUG_DoDisplay(void);
+extern int DEBUG_DelDisplay(int displaynum);
+extern int DEBUG_InfoDisplay(void);
+
+ /* debugger/editline.c */
+extern char * readline(const char *);
+extern void add_history(char *);
+
/* debugger/expr.c */
extern void DEBUG_FreeExprMem(void);
-struct expr * DEBUG_RegisterExpr(enum debug_regs);
+struct expr * DEBUG_IntVarExpr(const char* name);
struct expr * DEBUG_SymbolExpr(const char * name);
struct expr * DEBUG_ConstExpr(int val);
struct expr * DEBUG_StringExpr(const char * str);
@@ -262,12 +273,8 @@
extern int DEBUG_FreeExpr(struct expr * exp);
extern int DEBUG_DisplayExpr(const struct expr * exp);
- /* debugger/display.c */
-extern int DEBUG_DoDisplay(void);
-extern int DEBUG_AddDisplay(struct expr * exp, int count, char format);
-extern int DEBUG_DoDisplay(void);
-extern int DEBUG_DelDisplay(int displaynum);
-extern int DEBUG_InfoDisplay(void);
+ /* debugger/external.c */
+extern void DEBUG_ExternalDebugger(void);
/* debugger/hash.c */
extern struct name_hash * DEBUG_AddSymbol( const char *name,
@@ -329,8 +336,8 @@
extern void DEBUG_WalkWindows(HWND hWnd, int indent);
/* debugger/memory.c */
-extern int DEBUG_ReadMemory( const DBG_ADDR *address );
-extern void DEBUG_WriteMemory( const DBG_ADDR *address, int value );
+extern int DEBUG_ReadMemory( const DBG_VALUE* value );
+extern void DEBUG_WriteMemory( const DBG_VALUE* val, int value );
extern void DEBUG_ExamineMemory( const DBG_VALUE *addr, int count, char format);
extern void DEBUG_InvalAddr( const DBG_ADDR* addr );
extern void DEBUG_InvalLinAddr( void* addr );
@@ -360,11 +367,8 @@
extern void DEBUG_InitCVDataTypes(void);
/* debugger/registers.c */
-extern void DEBUG_SetRegister( enum debug_regs reg, int val );
-extern int DEBUG_GetRegister( enum debug_regs reg );
extern void DEBUG_InfoRegisters(void);
extern BOOL DEBUG_ValidateRegisters(void);
-extern int DEBUG_PrintRegister(enum debug_regs reg);
/* debugger/stack.c */
extern void DEBUG_InfoStack(void);
@@ -418,20 +422,15 @@
extern void DEBUG_NukePath(void);
extern void DEBUG_Disassemble( const DBG_VALUE *, const DBG_VALUE*, int offset );
- /* debugger/external.c */
-extern void DEBUG_ExternalDebugger(void);
-
- /* debugger/dbg.y */
-extern BOOL DEBUG_Main( BOOL is_debug, BOOL force, DWORD code );
-extern void DEBUG_Exit( DWORD );
-
/* debugger/winedbg.c */
#define DBG_CHN_MESG 1
#define DBG_CHN_ERR 2
#define DBG_CHN_WARN 4
#define DBG_CHN_FIXME 8
#define DBG_CHN_TRACE 16
-extern int DEBUG_Printf(int chn, const char* format, ...);
+extern void DEBUG_Output(int chn, const char* buffer, int len);
+extern int DEBUG_Printf(int chn, const char* format, ...);
+extern DBG_INTVAR* DEBUG_GetIntVar(const char*);
/* Choose your allocator! */
#if 1
@@ -465,9 +464,16 @@
#define DEBUG_STATUS_DIV_BY_ZERO (DEBUG_STATUS_OFFSET+2)
#define DEBUG_STATUS_BAD_TYPE (DEBUG_STATUS_OFFSET+3)
-#define DBG_IVAR(_var) DEBUG_IV_##_var
-#define INTERNAL_VAR(_var,_val) extern int DBG_IVAR(_var);
+extern DBG_INTVAR DEBUG_IntVars[];
+
+#define DBG_IVARNAME(_var) DEBUG_IV_##_var
+#define DBG_IVARSTRUCT(_var) DEBUG_IntVars[DBG_IVARNAME(_var)]
+#define DBG_IVAR(_var) (*(DBG_IVARSTRUCT(_var).pval))
+#define INTERNAL_VAR(_var,_val,_ref,_typ) DBG_IVARNAME(_var),
+enum debug_int_var {
#include "intvar.h"
+ DBG_IV_LAST
+};
#undef INTERNAL_VAR
#endif /* __WINE_DEBUGGER_H */
diff --git a/debugger/display.c b/debugger/display.c
index 56a03b4..2bf402e 100644
--- a/debugger/display.c
+++ b/debugger/display.c
@@ -6,7 +6,6 @@
*/
#include <stdlib.h>
-#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <sys/types.h>
diff --git a/debugger/editline.c b/debugger/editline.c
index fa690d7..9acc704 100644
--- a/debugger/editline.c
+++ b/debugger/editline.c
@@ -27,12 +27,7 @@
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
-#include <unistd.h>
#include <string.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
#include "windef.h"
#include "debugger.h"
@@ -136,94 +131,29 @@
** Declarations.
*/
static CHAR *editinput();
-extern int read();
-extern int write();
-#if defined(USE_TERMCAP)
-extern char *getenv();
-extern char *tgetstr();
-extern int tgetent();
-#endif /* defined(USE_TERMCAP) */
/*
** TTY input/output functions.
*/
-#ifdef HAVE_TCGETATTR
-#include <termios.h>
-
static void
rl_ttyset(int Reset)
{
- static struct termios old;
- struct termios new;
+ static DWORD old_mode;
- if (Reset == 0) {
- (void)tcgetattr(0, &old);
- rl_erase = old.c_cc[VERASE];
- rl_kill = old.c_cc[VKILL];
- rl_eof = old.c_cc[VEOF];
- rl_intr = old.c_cc[VINTR];
- rl_quit = old.c_cc[VQUIT];
-
- new = old;
- new.c_cc[VINTR] = -1;
- new.c_cc[VQUIT] = -1;
- new.c_lflag &= ~(ECHO | ICANON);
- new.c_iflag &= ~(ISTRIP | INPCK);
- new.c_cc[VMIN] = 1;
- new.c_cc[VTIME] = 0;
- (void)tcsetattr(0, TCSANOW, &new);
- }
- else
- (void)tcsetattr(0, TCSANOW, &old);
+ if (Reset == 0) {
+ GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &old_mode);
+ SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), 0 /*ENABLE_PROCESSED_INPUT|ENABLE_WINDOW_INPUT|ENABLE_MOUSE_INPUT*/);
+ } else {
+ SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), old_mode);
+ }
}
-#else /* HAVE_TCGETATTR */
-
-static void
-rl_ttyset(int Reset)
-{
- static struct sgttyb old_sgttyb;
- static struct tchars old_tchars;
- struct sgttyb new_sgttyb;
- struct tchars new_tchars;
-
- if (Reset == 0) {
- (void)ioctl(0, TIOCGETP, &old_sgttyb);
- rl_erase = old_sgttyb.sg_erase;
- rl_kill = old_sgttyb.sg_kill;
-
- (void)ioctl(0, TIOCGETC, &old_tchars);
- rl_eof = old_tchars.t_eofc;
- rl_intr = old_tchars.t_intrc;
- rl_quit = old_tchars.t_quitc;
-
- new_sgttyb = old_sgttyb;
- new_sgttyb.sg_flags &= ~ECHO;
- new_sgttyb.sg_flags |= RAW;
-#if defined(PASS8)
- new_sgttyb.sg_flags |= PASS8;
-#endif /* defined(PASS8) */
- (void)ioctl(0, TIOCSETP, &new_sgttyb);
-
- new_tchars = old_tchars;
- new_tchars.t_intrc = -1;
- new_tchars.t_quitc = -1;
- (void)ioctl(0, TIOCSETC, &new_tchars);
- }
- else {
- (void)ioctl(0, TIOCSETP, &old_sgttyb);
- (void)ioctl(0, TIOCSETC, &old_tchars);
- }
-}
-
-#endif /* HAVE_TCGETATTR */
-
static void
TTYflush(void)
{
if (ScreenCount) {
- (void)write(1, Screen, ScreenCount);
+ DEBUG_Output(DBG_CHN_MESG, Screen, ScreenCount);
ScreenCount = 0;
}
}
@@ -276,7 +206,7 @@
TTYget(void)
{
CHAR c;
- int retv;
+ DWORD retv;
TTYflush();
if (Pushed) {
@@ -286,16 +216,22 @@
if (*Input)
return *Input++;
- while ( ( retv = read( 0, &c, (size_t)1 ) ) == -1 )
- {
- if ( errno != EINTR )
- {
- perror( "read" );
- return EOF;
- }
+ for (;;) {
+ /* data available ? */
+ if (ReadConsole(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &retv, NULL) &&
+ retv == 1)
+ return c;
+ switch (WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE)) {
+ case WAIT_OBJECT_0:
+ break;
+ default:
+ DEBUG_Printf(DBG_CHN_FIXME, "shouldn't happen\n");
+ /* fall thru */
+ case WAIT_ABANDONED:
+ case WAIT_TIMEOUT:
+ return EOF;
+ }
}
-
- return retv == 1 ? c : EOF;
}
#define TTYback() (backspace ? TTYputs((CHAR *)backspace) : TTYput('\b'))
@@ -310,55 +246,9 @@
static void
TTYinfo(void)
{
- static int init;
-#if defined(USE_TERMCAP)
- char *term;
- char buff[2048];
- char *bp;
-#endif /* defined(USE_TERMCAP) */
-#if defined(TIOCGWINSZ)
- struct winsize W;
-#endif /* defined(TIOCGWINSZ) */
-
- if (init) {
-#if defined(TIOCGWINSZ)
- /* Perhaps we got resized. */
- if (ioctl(0, TIOCGWINSZ, &W) >= 0
- && W.ws_col > 0 && W.ws_row > 0) {
- TTYwidth = (int)W.ws_col;
- TTYrows = (int)W.ws_row;
- }
-#endif /* defined(TIOCGWINSZ) */
- return;
- }
- init++;
-
- TTYwidth = TTYrows = 0;
-#if defined(USE_TERMCAP)
- bp = &buff[0];
- if ((term = getenv("TERM")) == NULL)
- term = "dumb";
- if (tgetent(buff, term) < 0) {
- TTYwidth = SCREEN_WIDTH;
- TTYrows = SCREEN_ROWS;
- return;
- }
- backspace = tgetstr("le", &bp);
- TTYwidth = tgetnum("co");
- TTYrows = tgetnum("li");
-#endif /* defined(USE_TERMCAP) */
-
-#if defined(TIOCGWINSZ)
- if (ioctl(0, TIOCGWINSZ, &W) >= 0) {
- TTYwidth = (int)W.ws_col;
- TTYrows = (int)W.ws_row;
- }
-#endif /* defined(TIOCGWINSZ) */
-
- if (TTYwidth <= 0 || TTYrows <= 0) {
- TTYwidth = SCREEN_WIDTH;
- TTYrows = SCREEN_ROWS;
- }
+ COORD c = GetLargestConsoleWindowSize(GetStdHandle(STD_INPUT_HANDLE));
+ TTYwidth = c.x;
+ TTYrows = c.y;
}
diff --git a/debugger/expr.c b/debugger/expr.c
index 76f4f79..a083fb3 100644
--- a/debugger/expr.c
+++ b/debugger/expr.c
@@ -7,7 +7,6 @@
#include "config.h"
#include <stdlib.h>
-#include <stdio.h>
#include <string.h>
#include "winbase.h"
#include "wine/winbase16.h"
@@ -45,9 +44,8 @@
struct
{
- enum debug_regs reg;
- int result;
- } rgister;
+ const char * name;
+ } intvar;
struct
{
@@ -97,7 +95,7 @@
#define EXPR_TYPE_CONST 0
#define EXPR_TYPE_US_CONST 1
#define EXPR_TYPE_SYMBOL 2
-#define EXPR_TYPE_REGISTER 3
+#define EXPR_TYPE_INTVAR 3
#define EXPR_TYPE_BINOP 4
#define EXPR_TYPE_UNOP 5
#define EXPR_TYPE_STRUCT 6
@@ -151,14 +149,14 @@
}
struct expr *
-DEBUG_RegisterExpr(enum debug_regs regno)
+DEBUG_IntVarExpr(const char* name)
{
struct expr * ex;
ex = DEBUG_GetFreeExpr();
- ex->type = EXPR_TYPE_REGISTER;
- ex->un.rgister.reg = regno;
+ ex->type = EXPR_TYPE_INTVAR;
+ ex->un.intvar.name = name;
return ex;
}
@@ -429,18 +427,17 @@
rtn.addr.off = (unsigned int) &exp->un.call.result;
break;
- case EXPR_TYPE_REGISTER:
- rtn.type = DEBUG_TypeIntConst;
- rtn.cookie = DV_HOST;
- exp->un.rgister.result = DEBUG_GetRegister(exp->un.rgister.reg);
- rtn.addr.off = (unsigned int) &exp->un.rgister.result;
-#ifdef __i386__
- if( exp->un.rgister.reg == REG_EIP )
- rtn.addr.seg = DEBUG_context.SegCs;
- else
- rtn.addr.seg = DEBUG_context.SegDs;
-#endif
- DEBUG_FixAddress( &rtn.addr, 0 );
+ case EXPR_TYPE_INTVAR:
+ {
+
+ DBG_INTVAR* div = DEBUG_GetIntVar(exp->un.intvar.name);
+
+ if (!div) RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
+ rtn.cookie = DV_HOST;
+ rtn.type = div->type;
+ rtn.addr.off = (unsigned int)div->pval;
+ /* EPP FIXME rtn.addr.seg = ?? */
+ }
break;
case EXPR_TYPE_BINOP:
exp1 = DEBUG_EvalExpr(exp->un.binop.exp1);
@@ -662,8 +659,8 @@
DEBUG_DisplayExpr(exp->un.cast.expr);
DEBUG_Printf(DBG_CHN_MESG, ")");
break;
- case EXPR_TYPE_REGISTER:
- DEBUG_PrintRegister(exp->un.rgister.reg);
+ case EXPR_TYPE_INTVAR:
+ DEBUG_Printf(DBG_CHN_MESG, "$%s", exp->un.intvar.name);
break;
case EXPR_TYPE_US_CONST:
DEBUG_Printf(DBG_CHN_MESG, "%ud", exp->un.u_const.value);
@@ -821,7 +818,9 @@
case EXPR_TYPE_CAST:
rtn->un.cast.expr = DEBUG_CloneExpr(exp->un.cast.expr);
break;
- case EXPR_TYPE_REGISTER:
+ case EXPR_TYPE_INTVAR:
+ rtn->un.intvar.name = DBG_strdup(exp->un.intvar.name);
+ break;
case EXPR_TYPE_US_CONST:
case EXPR_TYPE_CONST:
break;
@@ -874,7 +873,9 @@
case EXPR_TYPE_CAST:
DEBUG_FreeExpr(exp->un.cast.expr);
break;
- case EXPR_TYPE_REGISTER:
+ case EXPR_TYPE_INTVAR:
+ DBG_free((char *) exp->un.intvar.name);
+ break;
case EXPR_TYPE_US_CONST:
case EXPR_TYPE_CONST:
break;
diff --git a/debugger/hash.c b/debugger/hash.c
index 0544d65..2d921aa 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -1138,6 +1138,7 @@
/*
* Register variable. Point to DEBUG_context field.
*/
+ assert(curr_func->local_vars[i].regno - 1 < sizeof(reg_ofs)/sizeof(reg_ofs[0]));
value->addr.off = ((DWORD)&DEBUG_context) +
reg_ofs[curr_func->local_vars[i].regno - 1];
value->cookie = DV_HOST;
diff --git a/debugger/info.c b/debugger/info.c
index bd6abee..52615b6 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -6,7 +6,6 @@
*/
#include "config.h"
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "winbase.h"
@@ -92,22 +91,21 @@
char* str = (char*)(long)res;
for (; DEBUG_READ_MEM(str, &ch, 1) && ch; str++) {
- fputc(ch, stderr);
+ DEBUG_Output(DBG_CHN_MESG, &ch, 1);
DEBUG_nchar++;
}
}
else
{
/* shouldn't happen */
- fputc('%', stderr);
- fputc(*ptr, stderr);
+ DEBUG_Printf(DBG_CHN_MESG, "%%%c", *ptr);
DEBUG_nchar += 2;
}
state = 0;
}
else
{
- fputc(*ptr, stderr);
+ DEBUG_Output(DBG_CHN_MESG, ptr, 1);
DEBUG_nchar++;
}
}
diff --git a/debugger/intvar.h b/debugger/intvar.h
index 1e3207e..b7ba920 100644
--- a/debugger/intvar.h
+++ b/debugger/intvar.h
@@ -1,3 +1,51 @@
-INTERNAL_VAR(BreakAllThreadsStartup, FALSE)
-INTERNAL_VAR(ExtDbgOnInvalidAddress, FALSE)
-INTERNAL_VAR(ChannelMask, DBG_CHN_MESG)
+/* -*- tab-width: 8; c-basic-offset: 4 -*- */
+
+/* Wine internal debugger
+ * Definitionz for internal variables
+ * Eric Pouech (c) 2000
+ */
+
+ /* break handling */
+INTERNAL_VAR(BreakAllThreadsStartup, FALSE, NULL, DEBUG_TypeIntConst)
+INTERNAL_VAR(BreakOnCritSectTimeOut, FALSE, NULL, DEBUG_TypeIntConst)
+
+ /* output handling */
+INTERNAL_VAR(ConChannelMask, DBG_CHN_MESG, NULL, DEBUG_TypeIntConst)
+INTERNAL_VAR(StdChannelMask, 0, NULL, DEBUG_TypeIntConst)
+INTERNAL_VAR(UseXTerm, TRUE, NULL, DEBUG_TypeIntConst)
+
+ /* debugging debugger */
+INTERNAL_VAR(ExtDbgOnInvalidAddress, FALSE, NULL, DEBUG_TypeIntConst)
+
+ /* context manipulation */
+#ifdef __i386__
+/* FIXME: 16 bit registers use imply that CPU is little endian, which is
+ * the case when running natively i386 code
+ */
+INTERNAL_VAR(eip, 0, &DEBUG_context.Eip, DEBUG_TypeIntConst)
+INTERNAL_VAR(ip, 0, &DEBUG_context.Eip, DEBUG_TypeShortUInt)
+INTERNAL_VAR(pc, 0, &DEBUG_context.Eip, DEBUG_TypeIntConst)
+INTERNAL_VAR(flags, 0, &DEBUG_context.EFlags, DEBUG_TypeIntConst)
+INTERNAL_VAR(esp, 0, &DEBUG_context.Esp, DEBUG_TypeIntConst)
+INTERNAL_VAR(sp, 0, &DEBUG_context.Esp, DEBUG_TypeShortUInt)
+INTERNAL_VAR(eax, 0, &DEBUG_context.Eax, DEBUG_TypeIntConst)
+INTERNAL_VAR(ax, 0, &DEBUG_context.Eax, DEBUG_TypeShortUInt)
+INTERNAL_VAR(ebx, 0, &DEBUG_context.Ebx, DEBUG_TypeIntConst)
+INTERNAL_VAR(bx, 0, &DEBUG_context.Ebx, DEBUG_TypeShortUInt)
+INTERNAL_VAR(ecx, 0, &DEBUG_context.Ecx, DEBUG_TypeIntConst)
+INTERNAL_VAR(cx, 0, &DEBUG_context.Ecx, DEBUG_TypeShortUInt)
+INTERNAL_VAR(edx, 0, &DEBUG_context.Edx, DEBUG_TypeIntConst)
+INTERNAL_VAR(dx, 0, &DEBUG_context.Edx, DEBUG_TypeShortUInt)
+INTERNAL_VAR(esi, 0, &DEBUG_context.Esi, DEBUG_TypeIntConst)
+INTERNAL_VAR(si, 0, &DEBUG_context.Esi, DEBUG_TypeShortUInt)
+INTERNAL_VAR(edi, 0, &DEBUG_context.Edi, DEBUG_TypeIntConst)
+INTERNAL_VAR(di, 0, &DEBUG_context.Edi, DEBUG_TypeShortUInt)
+INTERNAL_VAR(ebp, 0, &DEBUG_context.Ebp, DEBUG_TypeIntConst)
+INTERNAL_VAR(bp, 0, &DEBUG_context.Ebp, DEBUG_TypeShortUInt)
+INTERNAL_VAR(es, 0, &DEBUG_context.SegEs, DEBUG_TypeIntConst)
+INTERNAL_VAR(ds, 0, &DEBUG_context.SegDs, DEBUG_TypeIntConst)
+INTERNAL_VAR(cs, 0, &DEBUG_context.SegCs, DEBUG_TypeIntConst)
+INTERNAL_VAR(ss, 0, &DEBUG_context.SegSs, DEBUG_TypeIntConst)
+INTERNAL_VAR(fs, 0, &DEBUG_context.SegFs, DEBUG_TypeIntConst)
+INTERNAL_VAR(gs, 0, &DEBUG_context.SegGs, DEBUG_TypeIntConst)
+#endif
diff --git a/debugger/memory.c b/debugger/memory.c
index 4889ce7..6ccf6c3 100644
--- a/debugger/memory.c
+++ b/debugger/memory.c
@@ -7,7 +7,6 @@
*/
#include "config.h"
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -140,16 +139,30 @@
*
* Read a memory value.
*/
-int DEBUG_ReadMemory( const DBG_ADDR *address )
+/* FIXME: this function is now getting closer and closer to
+ * DEBUG_ExprGetValue. They should be merged...
+ */
+int DEBUG_ReadMemory( const DBG_VALUE* val )
{
- DBG_ADDR addr = *address;
- void* lin;
- int value;
-
- DEBUG_FixAddress( &addr, DEBUG_context.SegDs );
- lin = (void*)DEBUG_ToLinear( &addr );
- if (!DEBUG_READ_MEM_VERBOSE(lin, &value, sizeof(value)))
- value = 0;
+ int value = 0; /* to clear any unused byte */
+ int os = DEBUG_GetObjectSize(val->type);
+
+ assert(sizeof(value) >= os);
+
+ /* FIXME: only works on little endian systems */
+
+ if (val->cookie == DV_TARGET) {
+ DBG_ADDR addr = val->addr;
+ void* lin;
+
+ DEBUG_FixAddress( &addr, DEBUG_context.SegDs );
+ lin = (void*)DEBUG_ToLinear( &addr );
+
+ DEBUG_READ_MEM_VERBOSE(lin, &value, os);
+ } else {
+ if (val->addr.off)
+ memcpy(&value, (void*)val->addr.off, os);
+ }
return value;
}
@@ -159,14 +172,24 @@
*
* Store a value in memory.
*/
-void DEBUG_WriteMemory( const DBG_ADDR *address, int value )
+void DEBUG_WriteMemory( const DBG_VALUE* val, int value )
{
- DBG_ADDR addr = *address;
- void* lin;
+ int os = DEBUG_GetObjectSize(val->type);
- DEBUG_FixAddress( &addr, DEBUG_context.SegDs );
- lin = (void*)DEBUG_ToLinear( &addr );
- DEBUG_WRITE_MEM_VERBOSE(lin, &value, sizeof(value));
+ assert(sizeof(value) >= os);
+
+ /* FIXME: only works on little endian systems */
+
+ if (val->cookie == DV_TARGET) {
+ DBG_ADDR addr = val->addr;
+ void* lin;
+
+ DEBUG_FixAddress( &addr, DEBUG_context.SegDs );
+ lin = (void*)DEBUG_ToLinear( &addr );
+ DEBUG_WRITE_MEM_VERBOSE(lin, &value, os);
+ } else {
+ memcpy((void*)val->addr.off, &value, os);
+ }
}
@@ -242,7 +265,7 @@
if (!DEBUG_READ_MEM_VERBOSE(pnt, &wch, sizeof(wch)))
break;
pnt += sizeof(wch);
- fputc( (char)wch, stderr );
+ DEBUG_Printf(DBG_CHN_MESG, "%c", (char)wch);
}
DEBUG_Printf(DBG_CHN_MESG,"\n");
return;
@@ -256,7 +279,7 @@
if (!DEBUG_READ_MEM_VERBOSE(pnt, &ch, sizeof(ch)))
break;
pnt++;
- fputc( ch, stderr );
+ DEBUG_Output(DBG_CHN_MESG, &ch, 1);
}
DEBUG_Printf(DBG_CHN_MESG,"\n");
return;
diff --git a/debugger/registers.c b/debugger/registers.c
index 3e49ca6..4dde821 100644
--- a/debugger/registers.c
+++ b/debugger/registers.c
@@ -5,142 +5,17 @@
*/
#include "config.h"
-#include <stdio.h>
#include <string.h>
#include "debugger.h"
/***********************************************************************
- * DEBUG_SetRegister
- *
- * Set a register value.
- */
-void DEBUG_SetRegister( enum debug_regs reg, int val )
-{
-#ifdef __i386__
- switch(reg)
- {
- case REG_EAX: DEBUG_context.Eax = val; break;
- case REG_EBX: DEBUG_context.Ebx = val; break;
- case REG_ECX: DEBUG_context.Ecx = val; break;
- case REG_EDX: DEBUG_context.Edx = val; break;
- case REG_ESI: DEBUG_context.Esi = val; break;
- case REG_EDI: DEBUG_context.Edi = val; break;
- case REG_EBP: DEBUG_context.Ebp = val; break;
- case REG_EFL: DEBUG_context.EFlags = val; break;
- case REG_EIP: DEBUG_context.Eip = val; break;
- case REG_ESP: DEBUG_context.Esp = val; break;
- case REG_CS: DEBUG_context.SegCs = val; break;
- case REG_DS: DEBUG_context.SegDs = val; break;
- case REG_ES: DEBUG_context.SegEs = val; break;
- case REG_SS: DEBUG_context.SegSs = val; break;
- case REG_FS: DEBUG_context.SegFs = val; break;
- case REG_GS: DEBUG_context.SegGs = val; break;
-#define SET_LOW_WORD(dw,lw) ((dw) = ((dw) & 0xFFFF0000) | LOWORD(lw))
- case REG_AX: SET_LOW_WORD(DEBUG_context.Eax,val); break;
- case REG_BX: SET_LOW_WORD(DEBUG_context.Ebx,val); break;
- case REG_CX: SET_LOW_WORD(DEBUG_context.Ecx,val); break;
- case REG_DX: SET_LOW_WORD(DEBUG_context.Edx,val); break;
- case REG_SI: SET_LOW_WORD(DEBUG_context.Esi,val); break;
- case REG_DI: SET_LOW_WORD(DEBUG_context.Edi,val); break;
- case REG_BP: SET_LOW_WORD(DEBUG_context.Ebp,val); break;
- case REG_FL: SET_LOW_WORD(DEBUG_context.EFlags,val); break;
- case REG_IP: SET_LOW_WORD(DEBUG_context.Eip,val); break;
- case REG_SP: SET_LOW_WORD(DEBUG_context.Esp,val); break;
-#undef SET_LOWORD
- }
-#endif
-}
-
-
-int DEBUG_PrintRegister(enum debug_regs reg)
-{
-#ifdef __i386__
- char* val = NULL;
- switch(reg)
- {
- case REG_EAX: val = "%%eax"; break;
- case REG_EBX: val = "%%ebx"; break;
- case REG_ECX: val = "%%ecx"; break;
- case REG_EDX: val = "%%edx"; break;
- case REG_ESI: val = "%%esi"; break;
- case REG_EDI: val = "%%edi"; break;
- case REG_EBP: val = "%%ebp"; break;
- case REG_EFL: val = "%%efl"; break;
- case REG_EIP: val = "%%eip"; break;
- case REG_ESP: val = "%%esp"; break;
- case REG_AX: val = "%%ax"; break;
- case REG_BX: val = "%%bx"; break;
- case REG_CX: val = "%%cx"; break;
- case REG_DX: val = "%%dx"; break;
- case REG_SI: val = "%%si"; break;
- case REG_DI: val = "%%di"; break;
- case REG_BP: val = "%%bp"; break;
- case REG_FL: val = "%%fl"; break;
- case REG_IP: val = "%%ip"; break;
- case REG_SP: val = "%%sp"; break;
- case REG_CS: val = "%%cs"; break;
- case REG_DS: val = "%%ds"; break;
- case REG_ES: val = "%%es"; break;
- case REG_SS: val = "%%ss"; break;
- case REG_FS: val = "%%fs"; break;
- case REG_GS: val = "%%gs"; break;
- }
- if (val) DEBUG_Printf(DBG_CHN_MESG, val);
- return TRUE;
-#else
- return FALSE;
-#endif
-}
-
-/***********************************************************************
- * DEBUG_GetRegister
- *
- * Get a register value.
- */
-int DEBUG_GetRegister( enum debug_regs reg )
-{
-#ifdef __i386__
- switch(reg)
- {
- case REG_EAX: return DEBUG_context.Eax;
- case REG_EBX: return DEBUG_context.Ebx;
- case REG_ECX: return DEBUG_context.Ecx;
- case REG_EDX: return DEBUG_context.Edx;
- case REG_ESI: return DEBUG_context.Esi;
- case REG_EDI: return DEBUG_context.Edi;
- case REG_EBP: return DEBUG_context.Ebp;
- case REG_EFL: return DEBUG_context.EFlags;
- case REG_EIP: return DEBUG_context.Eip;
- case REG_ESP: return DEBUG_context.Esp;
- case REG_CS: return DEBUG_context.SegCs;
- case REG_DS: return DEBUG_context.SegDs;
- case REG_ES: return DEBUG_context.SegEs;
- case REG_SS: return DEBUG_context.SegSs;
- case REG_FS: return DEBUG_context.SegFs;
- case REG_GS: return DEBUG_context.SegGs;
- case REG_AX: return LOWORD(DEBUG_context.Eax);
- case REG_BX: return LOWORD(DEBUG_context.Ebx);
- case REG_CX: return LOWORD(DEBUG_context.Ecx);
- case REG_DX: return LOWORD(DEBUG_context.Edx);
- case REG_SI: return LOWORD(DEBUG_context.Esi);
- case REG_DI: return LOWORD(DEBUG_context.Edi);
- case REG_BP: return LOWORD(DEBUG_context.Ebp);
- case REG_FL: return LOWORD(DEBUG_context.EFlags);
- case REG_IP: return LOWORD(DEBUG_context.Eip);
- case REG_SP: return LOWORD(DEBUG_context.Esp);
- }
-#endif
- return 0; /* should not happen */
-}
-
-
-/***********************************************************************
* DEBUG_Flags
*
* Return Flag String.
*/
char *DEBUG_Flags( DWORD flag, char *buf )
{
+#ifdef __i386__
char *pt;
strcpy( buf, " - 00 - - - " );
@@ -185,6 +60,10 @@
if ( flag & 0x00040000 ) *pt = 'a'; /* Alignment Check Flag */
if ( buf >= pt-- ) return( buf );
return( buf );
+#else
+ strcpy(buf, "unknown CPU");
+ return buf;
+#endif
}
diff --git a/debugger/source.c b/debugger/source.c
index e4f2365..a43b0a1 100644
--- a/debugger/source.c
+++ b/debugger/source.c
@@ -183,11 +183,12 @@
if( sl == NULL )
{
+ char zbuf[256];
/*
* Still couldn't find it. Ask user for path to add.
*/
- DEBUG_Printf(DBG_CHN_MESG,"Enter path to file %s: ", sourcefile);
- fgets(tmppath, sizeof(tmppath), stdin);
+ sprintf(zbuf, "Enter path to file %s: ", sourcefile);
+ lstrcpynA(tmppath, readline(zbuf), sizeof(tmppath));
if( tmppath[strlen(tmppath)-1] == '\n' )
{
diff --git a/debugger/stabs.c b/debugger/stabs.c
index 807b36b..4601060 100644
--- a/debugger/stabs.c
+++ b/debugger/stabs.c
@@ -16,7 +16,6 @@
#include <sys/mman.h>
#endif
#include <limits.h>
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -1318,17 +1317,14 @@
/*
* Make sure we can stat and open this file.
*/
- if( exe_name == NULL )
- goto leave;
-
- fprintf( stderr, "Loading symbols: %s", exe_name );
+ if (exe_name == NULL) goto leave;
DEBUG_ProcessElfObject(exe_name, 0);
/* previous step should have loaded symbol _DYNAMIC if it exists inside
* the main executable
*/
if (!DEBUG_GetSymbolValue("_DYNAMIC", -1, &val, FALSE)) {
- fprintf(stderr, "Can't find symbol _DYNAMIC\n");
+ DEBUG_Printf(DBG_CHN_WARN, "Can't find symbol _DYNAMIC\n");
goto leave;
}
@@ -1380,7 +1376,7 @@
}
int
-DEBUG_ReadExecutableDbgInfo(void)
+DEBUG_ReadExecutableDbgInfo(const char* exe_name)
{
return FALSE;
}
diff --git a/debugger/stack.c b/debugger/stack.c
index 1b0935d..2142f53 100644
--- a/debugger/stack.c
+++ b/debugger/stack.c
@@ -8,7 +8,6 @@
#include "config.h"
-#include <stdio.h>
#include <stdlib.h>
#include "debugger.h"
diff --git a/debugger/types.c b/debugger/types.c
index 5233d5e..457f1ae 100644
--- a/debugger/types.c
+++ b/debugger/types.c
@@ -8,7 +8,6 @@
*/
#include "config.h"
-#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
@@ -113,7 +112,7 @@
struct datatype * DEBUG_TypeIntConst = NULL;
struct datatype * DEBUG_TypeUSInt = NULL;
struct datatype * DEBUG_TypeString = NULL;
-
+struct datatype * DEBUG_TypeShortUInt = NULL;
/*
* All of the types that have been defined so far.
*/
@@ -319,7 +318,7 @@
DEBUG_InitBasic(BASIC_LONGLONG,"long long int",8,1,"%ld");
DEBUG_InitBasic(BASIC_ULONGLONGI,"long long unsigned int",8,0,"%ld");
DEBUG_InitBasic(BASIC_SHORT,"short int",2,1,"%d");
- DEBUG_InitBasic(BASIC_SHORTUI,"short unsigned int",2,0,"%d");
+ DEBUG_TypeShortUInt = DEBUG_InitBasic(BASIC_SHORTUI,"short unsigned int",2,0,"%d");
DEBUG_InitBasic(BASIC_SCHAR,"signed char",1,1,"'%c'");
DEBUG_InitBasic(BASIC_UCHAR,"unsigned char",1,0,"'%c'");
DEBUG_InitBasic(BASIC_FLT,"float",4,0,"%f");
@@ -865,7 +864,7 @@
DEBUG_nchar += DEBUG_Printf(DBG_CHN_MESG, "\"");
for( i=value->type->un.array.start; i < value->type->un.array.end; i++ )
{
- fputc(*pnt++, stderr);
+ DEBUG_Output(DBG_CHN_MESG, pnt++, 1);
DEBUG_nchar++;
if( DEBUG_nchar > DEBUG_maxchar )
{
diff --git a/debugger/winedbg.c b/debugger/winedbg.c
index 0bdc6d5..16cce68 100644
--- a/debugger/winedbg.c
+++ b/debugger/winedbg.c
@@ -26,47 +26,80 @@
CONTEXT DEBUG_context;
static DBG_PROCESS* proc = NULL;
+DBG_INTVAR DEBUG_IntVars[DBG_IV_LAST];
-/* build internal vars table */
-#define INTERNAL_VAR(_var,_val) int DBG_IVAR(_var) = _val;
-#include "intvar.h"
-#undef INTERNAL_VAR
+void DEBUG_Output(int chn, const char* buffer, int len)
+{
+ if (DBG_IVAR(ConChannelMask) & chn)
+ WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), buffer, len, NULL, NULL);
+ if (DBG_IVAR(StdChannelMask) & chn)
+ fwrite(buffer, len, 1, stderr);
+}
int DEBUG_Printf(int chn, const char* format, ...)
{
char buf[1024];
va_list valist;
+ int len;
va_start(valist, format);
- vsprintf(buf, format, valist);
+ len = vsprintf(buf, format, valist);
va_end(valist);
-#if 0
- if (DBG_IVAR(ChannelMask) & chn)
- WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), buf, strlen(buf), NULL, NULL);
- if (chn == DBG_CHN_MESG) fwrite(buf, strlen(buf), 1, stderr);
-#else
- if (DBG_IVAR(ChannelMask) & chn) fwrite(buf, strlen(buf), 1, stderr);
-#endif
- return strlen(buf);
+ DEBUG_Output(chn, buf, len);
+ return len;
}
-static BOOL DEBUG_Init(void)
+static BOOL DEBUG_IntVarsRW(int read)
{
HKEY hkey;
- DWORD type;
+ DWORD type = REG_DWORD;
DWORD val;
DWORD count = sizeof(val);
+ int i;
+ DBG_INTVAR* div = DEBUG_IntVars;
- if (!RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\WineDbg", &hkey)) {
-#define INTERNAL_VAR(_var,_val) \
- if (!RegQueryValueEx(hkey, #_var, 0, &type, (LPSTR)&val, &count)) \
- DBG_IVAR(_var) = val;
+ if (read) {
+/* initializes internal vars table */
+#define INTERNAL_VAR(_var,_val,_ref,_typ) \
+ div->val = _val; div->name = #_var; div->pval = _ref; \
+ div->type = _typ; div++;
#include "intvar.h"
#undef INTERNAL_VAR
+ }
+
+ if (!RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\WineDbg", &hkey)) {
+ for (i = 0; i < DBG_IV_LAST; i++) {
+ if (read) {
+ if (!DEBUG_IntVars[i].pval) {
+ if (!RegQueryValueEx(hkey, DEBUG_IntVars[i].name, 0,
+ &type, (LPSTR)&val, &count))
+ DEBUG_IntVars[i].val = val;
+ DEBUG_IntVars[i].pval = &DEBUG_IntVars[i].val;
+ } else {
+ *DEBUG_IntVars[i].pval = 0;
+ }
+ } else {
+ /* FIXME: type should be infered from basic type -if any- of intvar */
+ if (DEBUG_IntVars[i].pval == &DEBUG_IntVars[i].val)
+ RegSetValueEx(hkey, DEBUG_IntVars[i].name, 0,
+ type, (LPCVOID)DEBUG_IntVars[i].pval, count);
+ }
+ }
RegCloseKey(hkey);
}
return TRUE;
}
+
+DBG_INTVAR* DEBUG_GetIntVar(const char* name)
+{
+ int i;
+
+ for (i = 0; i < DBG_IV_LAST; i++) {
+ if (!strcmp(DEBUG_IntVars[i].name, name))
+ return &DEBUG_IntVars[i];
+ }
+ return NULL;
+}
static WINE_EXCEPTION_FILTER(wine_dbg)
{
@@ -119,18 +152,6 @@
static void DEBUG_InitCurrProcess(void)
{
-#ifdef DBG_need_heap
- /*
- * Initialize the debugger heap.
- */
- dbg_heap = HeapCreate(HEAP_NO_SERIALIZE, 0x1000, 0x8000000); /* 128MB */
-#endif
-
- /*
- * Initialize the type handling stuff.
- */
- DEBUG_InitTypes();
- DEBUG_InitCVDataTypes();
}
static BOOL DEBUG_ProcessGetString(char* buffer, int size, HANDLE hp, LPSTR addr)
@@ -277,6 +298,8 @@
case EXCEPTION_CRITICAL_SECTION_WAIT:
DEBUG_Printf( DBG_CHN_MESG, "critical section %08lx wait failed",
rec->ExceptionInformation[0] );
+ if (!DBG_IVAR(BreakOnCritSectTimeOut))
+ return DBG_CONTINUE;
break;
default:
DEBUG_Printf( DBG_CHN_MESG, "%08lx", rec->ExceptionCode );
@@ -284,6 +307,8 @@
}
}
+ DEBUG_Printf(DBG_CHN_MESG, "\n");
+
DEBUG_Printf(DBG_CHN_TRACE,
"Entering debugger PC=%lx EFL=%08lx mode=%d count=%d\n",
DEBUG_context.Eip, DEBUG_context.EFlags,
@@ -503,7 +528,7 @@
return ret;
}
-static DWORD CALLBACK DEBUG_MainLoop(DWORD pid)
+static DWORD DEBUG_MainLoop(DWORD pid)
{
DEBUG_EVENT de;
DWORD cont;
@@ -511,87 +536,85 @@
DEBUG_Printf(DBG_CHN_MESG, " on pid %ld\n", pid);
- DEBUG_Init();
-
while (ret && WaitForDebugEvent(&de, INFINITE)) {
ret = DEBUG_HandleDebugEvent(&de, &cont);
ContinueDebugEvent(de.dwProcessId, de.dwThreadId, cont);
}
DEBUG_Printf(DBG_CHN_MESG, "WineDbg terminated on pid %ld\n", pid);
-
- ExitProcess(0);
+
+ return 0;
}
-int PASCAL WinMain(HINSTANCE hInst, HINSTANCE prev, LPSTR _cmdline, int show)
+int DEBUG_main(int argc, char** argv)
{
- char* argv[5];
- char* cmdline = strdup(_cmdline);
- char* ptr = cmdline;
- int instr = FALSE;
- int argc = 0;
+ DWORD pid = 0, retv = 0;
+ int i;
- while ((*ptr == ' ' || *ptr == '\t') && *ptr != 0) ptr++;
- argv[argc++] = ptr;
- for (; *ptr; ptr++) {
- if ((*ptr == ' ' || *ptr == '\t') && !instr) {
- *ptr++ = 0;
- while (*ptr == ' ' || *ptr == '\t') ptr++;
- if (*ptr) argv[argc++] = ptr;
- if (argc >= sizeof(argv) / sizeof(argv[0])) return 0;
- } else if (*ptr == '"') {
- instr = !instr;
- }
- }
+ for (i = 0; i < argc; i++) fprintf(stderr, "argv[%d]=%s\n", i, argv[i]);
+#ifdef DBG_need_heap
+ /* Initialize the debugger heap. */
+ dbg_heap = HeapCreate(HEAP_NO_SERIALIZE, 0x1000, 0x8000000); /* 128MB */
+#endif
+
+ /* Initialize the type handling stuff. */
+ DEBUG_InitTypes();
+ DEBUG_InitCVDataTypes();
-#if 0
- /* would require to change .spec with a cuiexe type */
+ /* Initialize internal vars */
+ DEBUG_IntVarsRW(TRUE);
+
/* keep it as a guiexe for now, so that Wine won't touch the Unix stdin,
* stdout and stderr streams
*/
- if (1 /*DBG_IVAR(UseXterm)*/) {
+ if (DBG_IVAR(UseXTerm)) {
COORD pos;
/* This is a hack: it forces creation of an xterm, not done by default */
pos.x = 0; pos.y = 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
-#endif
DEBUG_Printf(DBG_CHN_MESG, "Starting WineDbg... ");
- if (argc == 2) {
- DWORD pid = atoi(argv[0]);
- HANDLE hEvent = atoi(argv[1]);
+ if (argc == 3) {
+ HANDLE hEvent;
- if (pid != 0 && hEvent != 0) {
- free(cmdline);
-
+ if ((pid = atoi(argv[1])) != 0 && (hEvent = atoi(argv[2])) != 0) {
if (!DebugActiveProcess(pid)) {
DEBUG_Printf(DBG_CHN_ERR, "Can't attach process %ld: %ld\n",
pid, GetLastError());
- return 0;
+ SetEvent(hEvent);
+ goto leave;
}
SetEvent(hEvent);
- return DEBUG_MainLoop(pid);
+ } else {
+ pid = 0;
}
}
- do {
+
+ if (pid == 0) {
PROCESS_INFORMATION info;
STARTUPINFOA startup;
- free(cmdline);
-
memset(&startup, 0, sizeof(startup));
startup.cb = sizeof(startup);
startup.dwFlags = STARTF_USESHOWWINDOW;
startup.wShowWindow = SW_SHOWNORMAL;
- if (CreateProcess(NULL, _cmdline, NULL, NULL,
- FALSE, DEBUG_PROCESS, NULL, NULL, &startup, &info)) {
- return DEBUG_MainLoop(info.dwProcessId);
+ if (!CreateProcess(NULL, argv[1], NULL, NULL,
+ FALSE, DEBUG_PROCESS, NULL, NULL, &startup, &info)) {
+ DEBUG_Printf(DBG_CHN_MESG, "Couldn't start process '%s'\n", argv[1]);
+ goto leave;
}
- DEBUG_Printf(DBG_CHN_MESG, "Couldn't start process '%s'\n", _cmdline);
- } while (0);
- return 0;
+ pid = info.dwProcessId;
+ }
+
+ if (pid) retv = DEBUG_MainLoop(pid);
+ leave:
+ /* saves modified variables */
+ DEBUG_IntVarsRW(FALSE);
+
+ return retv;
}
+
diff --git a/debugger/winedbg.spec b/debugger/winedbg.spec
index 6d2c649..6a6feac 100644
--- a/debugger/winedbg.spec
+++ b/debugger/winedbg.spec
@@ -1,5 +1,5 @@
name winedbg
-mode guiexe
+mode cuiexe
type win32
-init WinMain
+init DEBUG_main