Made the winedbg an external and WineLib program.
Centralized output handling (preparation for console usage).
Fixed a few debug information reading options (stabs and sym).
Started a framework to hold debugger's internal variables.

diff --git a/debugger/memory.c b/debugger/memory.c
index 19466e5..4889ce7 100644
--- a/debugger/memory.c
+++ b/debugger/memory.c
@@ -23,7 +23,7 @@
 
 static	void	DEBUG_Die(const char* msg)
 {
-   fprintf(stderr, msg);
+   DEBUG_Printf(DBG_CHN_MESG, msg);
    exit(1);
 }
 
@@ -118,16 +118,21 @@
 #endif
 }
 
+void	DEBUG_InvalAddr( const DBG_ADDR* addr )
+{
+   DEBUG_Printf(DBG_CHN_MESG,"*** Invalid address ");
+   DEBUG_PrintAddress(addr, DEBUG_CurrThread->dbg_mode, FALSE);
+   DEBUG_Printf(DBG_CHN_MESG,"\n");
+   if (DBG_IVAR(ExtDbgOnInvalidAddress)) DEBUG_ExternalDebugger();
+}
+
 void	DEBUG_InvalLinAddr( void* addr )
 {
    DBG_ADDR address;
 
    address.seg = 0;
    address.off = (unsigned long)addr;
-
-   fprintf(stderr,"*** Invalid address ");
-   DEBUG_PrintAddress(&address, DEBUG_CurrThread->dbg_mode, FALSE);
-   fprintf(stderr,"\n");
+   DEBUG_InvalAddr( &address );
 }
 
 /***********************************************************************
@@ -215,14 +220,14 @@
       }
     else if (!value.addr.seg && !value.addr.off)
     {
-	fprintf(stderr,"Invalid expression\n");
+	DEBUG_Printf(DBG_CHN_MESG,"Invalid expression\n");
 	return;
     }
 
     if (format != 'i' && count > 1)
     {
         DEBUG_PrintAddress( &value.addr, DEBUG_CurrThread->dbg_mode, FALSE );
-        fprintf(stderr,": ");
+        DEBUG_Printf(DBG_CHN_MESG,": ");
     }
 
     pnt = (void*)DEBUG_ToLinear( &value.addr );
@@ -239,7 +244,7 @@
                     pnt += sizeof(wch);
                     fputc( (char)wch, stderr );
                 }
-		fprintf(stderr,"\n");
+		DEBUG_Printf(DBG_CHN_MESG,"\n");
 		return;
 	    }
           case 's': {
@@ -253,31 +258,31 @@
                     pnt++;
                     fputc( ch, stderr );
                 }
-		fprintf(stderr,"\n");
+		DEBUG_Printf(DBG_CHN_MESG,"\n");
 		return;
 	  }
 	case 'i':
 		while (count--)
                 {
                     DEBUG_PrintAddress( &value.addr, DEBUG_CurrThread->dbg_mode, TRUE );
-                    fprintf(stderr,": ");
+                    DEBUG_Printf(DBG_CHN_MESG,": ");
                     DEBUG_Disasm( &value.addr, TRUE );
-                    fprintf(stderr,"\n");
+                    DEBUG_Printf(DBG_CHN_MESG,"\n");
 		}
 		return;
 #define DO_DUMP2(_t,_l,_f,_vv) { \
 	        _t _v; \
 		for(i=0; i<count; i++) { \
                     if (!DEBUG_READ_MEM_VERBOSE(pnt, &_v, sizeof(_t))) break; \
-                    fprintf(stderr,_f,(_vv)); \
+                    DEBUG_Printf(DBG_CHN_MESG,_f,(_vv)); \
                     pnt += sizeof(_t); value.addr.off += sizeof(_t); \
                     if ((i % (_l)) == (_l)-1) { \
-                        fprintf(stderr,"\n"); \
+                        DEBUG_Printf(DBG_CHN_MESG,"\n"); \
                         DEBUG_PrintAddress( &value.addr, DEBUG_CurrThread->dbg_mode, FALSE );\
-                        fprintf(stderr,": ");\
+                        DEBUG_Printf(DBG_CHN_MESG,": ");\
                     } \
 		} \
-		fprintf(stderr,"\n"); \
+		DEBUG_Printf(DBG_CHN_MESG,"\n"); \
         } \
 	return
 #define DO_DUMP(_t,_l,_f) DO_DUMP2(_t,_l,_f,_v)