- cleaned-up break handling
- better integration of debugger inner loops (parser & events)
- added attach command
- improved parser so that it can be entered without any process loaded
- added BreakOnFirstChance internal variable
- disabled NE module symbol module (which is broken with ASS)
- misc portability cleanups
diff --git a/debugger/debug.l b/debugger/debug.l
index 0adf93c..cb8dc64 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -2,6 +2,7 @@
* Lexical scanner for command line parsing
*
* Copyright 1993 Eric Youngdale
+ * 2000 Eric Pouech
*/
%{
@@ -10,12 +11,6 @@
#include "debugger.h"
#include "y.tab.h"
-#ifdef DBG_need_heap
-#define malloc(x) DBG_alloc(x)
-#define realloc(x,y) DBG_realloc(x,y)
-#define free(x) DBG_free(x)
-#endif
-
#ifndef DONT_USE_READLINE
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
@@ -23,7 +18,7 @@
YY_FATAL_ERROR( "read() in flex scanner failed" );
static int dbg_read(char * buf, int size);
-static char * make_symbol(char *);
+static char * DEBUG_MakeSymbol(char *);
#endif /* DONT_USE_READLINE */
@@ -47,40 +42,42 @@
%s WALK_CMD
%s SHOW_CMD
%s NOCMD
-%s DEBUGSTR
+%x ASTRING_EXPECTED
+%x NOPROCESS
%%
+ /* set to special state when no process is loaded. */
+ if (!DEBUG_CurrProcess && YYSTATE == INITIAL) {BEGIN(NOPROCESS);}
-\n { BEGIN(0); syntax_error = 0;
- return tEOL; } /*Indicates end of command. Reset state. */
+<*>\n { BEGIN(INITIAL); syntax_error = 0; return tEOL; }
+ /* Indicates end of command. Reset state. */
-"||" { return OP_LOR; }
-"&&" { return OP_LAND; }
-"==" { return OP_EQ; }
-"!=" { return OP_NE; }
-"<=" { return OP_LE; }
-">=" { return OP_GE; }
-"<<" { return OP_SHL; }
-">>" { return OP_SHR; }
-"->" { return OP_DRF; }
-[-+<=>|&^()*/%:!~,\.] { return *yytext; }
-"[" { return *yytext; }
-"]" { return *yytext; }
+"||" { return OP_LOR; }
+"&&" { return OP_LAND; }
+"==" { return OP_EQ; }
+"!=" { return OP_NE; }
+"<=" { return OP_LE; }
+">=" { return OP_GE; }
+"<<" { return OP_SHL; }
+">>" { return OP_SHR; }
+"->" { return OP_DRF; }
+[-+<=>|&^()*/%:!~,\.] { return *yytext; }
+"[" { return *yytext; }
+"]" { return *yytext; }
-"0x"{HEXDIGIT}+ { sscanf(yytext, "%x", &yylval.integer); return tNUM; }
-{DIGIT}+ { sscanf(yytext, "%d", &yylval.integer); return tNUM; }
+"0x"{HEXDIGIT}+ { sscanf(yytext, "%x", &yylval.integer); return tNUM; }
+{DIGIT}+ { sscanf(yytext, "%d", &yylval.integer); return tNUM; }
+<FORMAT_EXPECTED>"/"{DIGIT}+{FORMAT} { char* last;
+ yylval.integer = strtol( yytext+1, &last, NULL ) << 8;
+ yylval.integer |= *last;
+ return tFORMAT; }
-<FORMAT_EXPECTED>"/"{DIGIT}+{FORMAT} { char * last;
- yylval.integer = strtol( yytext+1, &last, NULL );
- yylval.integer = (yylval.integer << 8) | *last;
- return tFORMAT; }
+<FORMAT_EXPECTED>"/"{FORMAT} { yylval.integer = (1 << 8) | yytext[1]; return tFORMAT; }
-
-<FORMAT_EXPECTED>"/"{FORMAT} { yylval.integer = (1 << 8) | yytext[1]; return tFORMAT; }
-
-{STRING} { yylval.string = make_symbol(yytext); return tSTRING; }
-<DEBUGSTR>[a-z+\-,]* { yylval.string = yytext; return tDEBUGSTR; }
+{STRING} { yylval.string = DEBUG_MakeSymbol(yytext); return tSTRING; }
+<ASTRING_EXPECTED>[^\n]+ { char* p = yytext; while (*p == ' ' || *p == '\t') p++;
+ yylval.string = DEBUG_MakeSymbol(p); return tSTRING; }
<INITIAL>info|inf|in { BEGIN(INFO_CMD); return tINFO; }
<INITIAL>up { BEGIN(NOCMD); return tUP; }
@@ -93,9 +90,9 @@
<INITIAL,INFO_CMD,DEL_CMD>display|displa|displ|disp { BEGIN(FORMAT_EXPECTED); return tDISPLAY; }
<INITIAL>undisplay|undispla|undispl|undisp|undis|undi|und { BEGIN(NOCMD); return tUNDISPLAY; }
<INITIAL>delete|delet|dele|del { BEGIN(DEL_CMD); return tDELETE; }
-<INITIAL>quit|qui|qu|q { BEGIN(NOCMD); return tQUIT; }
+<INITIAL,NOPROCESS>quit|qui|qu|q { BEGIN(NOCMD); return tQUIT; }
<INITIAL>set|se { BEGIN(NOCMD); return tSET; }
-<INITIAL>walk|w { BEGIN(WALK_CMD); return tWALK; }
+<INITIAL,NOPROCESS>walk|w { BEGIN(WALK_CMD); return tWALK; }
<INITIAL>x { BEGIN(FORMAT_EXPECTED); return tEXAM; }
<INITIAL>help|hel|he|"?" { BEGIN(HELP_CMD); return tHELP; }
@@ -121,11 +118,12 @@
<INITIAL,INFO_CMD,DEL_CMD>break|brea|bre|br|b { BEGIN(PATH_EXPECTED); return tBREAK; }
<INITIAL>watch|watc|wat { BEGIN(PATH_EXPECTED); return tWATCH; }
<INITIAL>whatis|whati|what { BEGIN(PATH_EXPECTED); return tWHATIS; }
-
+<INITIAL,NOPROCESS>run|ru|r { BEGIN(ASTRING_EXPECTED); return tRUN;}
+<NOPROCESS>attach|attac|atta|att { BEGIN(NOCMD); return tATTACH; }
<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>module|modul|modu|mod { return tMODULE; }
+<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; }
<INFO_CMD,WALK_CMD>threads|thread|threa|thre|thr|th { return tTHREAD; }
@@ -138,7 +136,7 @@
<HELP_CMD>info|inf|in { return tINFO; }
<INITIAL,SHOW_CMD>directories|directorie|directori|director|directo|direct|direc|direc|dir {
- BEGIN(PATH_EXPECTED); return tDIR; }
+ BEGIN(PATH_EXPECTED); return tDIR; }
char { return tCHAR; }
short { return tSHORT; }
@@ -152,20 +150,18 @@
union { return tUNION; }
enum { return tENUM; }
-{IDENTIFIER} { yylval.string = make_symbol(yytext); return tIDENTIFIER; }
-"$"{IDENTIFIER} { yylval.string = make_symbol(yytext+1); return tINTVAR; }
+{IDENTIFIER} { yylval.string = DEBUG_MakeSymbol(yytext); return tIDENTIFIER; }
+"$"{IDENTIFIER} { yylval.string = DEBUG_MakeSymbol(yytext+1); return tINTVAR; }
-<PATH_EXPECTED>{PATHNAME} { yylval.string = make_symbol(yytext); return tPATH; }
+<PATH_EXPECTED>{PATHNAME} { yylval.string = DEBUG_MakeSymbol(yytext); return tPATH; }
-[ \t]+ /* Eat up whitespace */
+<*>[ \t]+ /* Eat up whitespace */
-. { if (syntax_error == 0)
- {
- syntax_error ++; DEBUG_Printf(DBG_CHN_MESG, "Syntax Error\n");
- }
- }
-
-
+<NOPROCESS>. { BEGIN(ASTRING_EXPECTED); yyless(0); return tNOPROCESS;}
+<*>. { if (syntax_error == 0) {
+ syntax_error++;
+ DEBUG_Printf(DBG_CHN_MESG, "Syntax Error (%s)\n", yytext); }
+ }
%%
#ifndef yywrap
@@ -206,7 +202,7 @@
for (;;)
{
- flush_symbols();
+ DEBUG_FlushSymbols();
line = readline ("Wine-dbg>");
if (!line)
{
@@ -226,7 +222,7 @@
add_history( line );
strncpy( last_line, line, 255 );
last_line[255] = '\0';
- }
+ }
free( line );
line = last_line;
@@ -249,14 +245,15 @@
static char *local_symbols[30];
static int next_symbol;
-static char * make_symbol(char * symbol)
+static char * DEBUG_MakeSymbol(char * symbol)
{
- return local_symbols[next_symbol++] = DBG_strdup(symbol);
+ assert(0 <= next_symbol && next_symbol < (sizeof(local_symbols) / sizeof(local_symbols[0])));
+ return local_symbols[next_symbol++] = DBG_strdup(symbol);
}
-void flush_symbols(void)
+void DEBUG_FlushSymbols(void)
{
- while(--next_symbol>= 0) DBG_free(local_symbols[next_symbol]);
+ while(--next_symbol >= 0) DBG_free(local_symbols[next_symbol]);
next_symbol = 0;
}