mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
745 lines
19 KiB
745 lines
19 KiB
/* xx_debug\xx_debug.c -- xx_debug DLL. */
|
|
/* Copyright (c) 1992-1994, Jeffery L Hostetler, Inc., All Rights Reserved. */
|
|
|
|
#include "project.h"
|
|
#pragma hdrstop
|
|
|
|
#if defined(WIN32) || defined(UNIX)
|
|
#else
|
|
These_libraries_require_a_host_type.
|
|
#endif
|
|
|
|
|
|
#ifdef WIN32
|
|
#ifndef _MT
|
|
This_code_must_be_compiled_with__MT.
|
|
#endif
|
|
|
|
#ifndef _DLL
|
|
// This_code_is_designed_to_be_a_DLL.
|
|
#endif
|
|
#endif /* WIN32 */
|
|
|
|
#include "xx_dlg.h"
|
|
|
|
#define XX_DEBUG_PRIVATE
|
|
#define XX_DEBUG
|
|
#include "xx_debug.h"
|
|
#include "xx_privi.h"
|
|
#include "xx_proto.h"
|
|
|
|
|
|
#define MAX_DEBUG_MESSAGE_SIZE 64*1024 /* arbitrary */
|
|
|
|
|
|
#ifdef WIN32 /* dialog helper routine */
|
|
/* TextToLONG() -- Convert text to LONG, if possible. Substitute default
|
|
value if text is empty or blanks. Return TRUE if successful.
|
|
We strip leading and trailing blanks, but do not allow embedded blanks. */
|
|
|
|
BOOL TextToLONG(LPCTSTR buf, LPLONG pvalue, LONG dflt, LPTSTR outbuf)
|
|
{
|
|
LONG len;
|
|
LPCTSTR pbuf;
|
|
|
|
if (strlen(buf) != strspn(buf," 0123456789"))
|
|
return (FALSE); /* contains non-numeric or non-white */
|
|
|
|
pbuf = buf;
|
|
while (*pbuf==' ') /* left-trim white */
|
|
pbuf++;
|
|
|
|
if (*pbuf==0)
|
|
{ /* blank (or empty) */
|
|
*pvalue = dflt;
|
|
return (TRUE);
|
|
}
|
|
|
|
len = strspn(pbuf,"0123456789");
|
|
if (pbuf[len])
|
|
{ /* trailing chars */
|
|
if (strlen(pbuf+len) != strspn(pbuf+len," "))
|
|
return (FALSE); /* trailing non-white */
|
|
}
|
|
|
|
strncpy(outbuf,pbuf,len);
|
|
outbuf[len] = 0;
|
|
*pvalue = atol(pbuf);
|
|
return (TRUE);
|
|
}
|
|
#endif /* WIN32 */
|
|
|
|
|
|
#ifdef WIN32
|
|
static struct {
|
|
Tmode mode;
|
|
short console_rows;
|
|
} static_dlg_info; /* valid only while dialog active. */
|
|
#endif /* WIN32 */
|
|
|
|
|
|
Txxd_category XX_mask = XXDC_NONE; /* EXPORTED from DLL */
|
|
unsigned char XX_activated = 0; /* EXPORTED from DLL */
|
|
unsigned char XX_assertions = TRUE; /* EXPORTED from DLL */
|
|
unsigned long XX_auditmask = XX_AUDITMASK_OFF; /* EXPORTED from DLL */
|
|
|
|
|
|
|
|
/* xx_disable() -- turn off interactive debugging messages (and close
|
|
whatever debug device we may have open). */
|
|
|
|
static void xx_disable(void)
|
|
{
|
|
if (!(XX_activated&XXDM_INTERACTIVE_ON))
|
|
return;
|
|
|
|
#ifdef WIN32
|
|
switch (xxd.mode)
|
|
{
|
|
|
|
#ifdef XX_DEBUG_CONSOLE
|
|
case XXDM_CONSOLE:
|
|
xx_disable_console();
|
|
break;
|
|
#endif /* XX_DEBUG_CONSOLE */
|
|
|
|
case XXDM_WINDBG:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
#endif /* WIN32 */
|
|
|
|
XX_activated &= ~XXDM_INTERACTIVE_ON;
|
|
return;
|
|
}
|
|
|
|
#ifdef WIN32 /* dialog helper routine */
|
|
/* xx_enable() -- turn on interactive debugging messages. */
|
|
|
|
static void xx_enable(HWND hDlg)
|
|
{
|
|
Tmode m = 0;
|
|
|
|
if (XX_activated&XXDM_INTERACTIVE_ON)
|
|
return;
|
|
|
|
/* get state of radio buttons representing MODE (output mechanism). */
|
|
|
|
m = XXDM_WINDBG; /* assume win debugging */
|
|
|
|
#ifdef XX_DEBUG_CONSOLE
|
|
if (IsDlgButtonChecked(hDlg,XXM_MODE_CO))
|
|
{
|
|
m = XXDM_CONSOLE;
|
|
xxdco.rows = static_dlg_info.console_rows;
|
|
xx_enable_console();
|
|
}
|
|
#endif /* XX_DEBUG_CONSOLE */
|
|
|
|
xxd.mode = m;
|
|
XX_activated |= XXDM_INTERACTIVE_ON;
|
|
return;
|
|
}
|
|
#endif /* WIN32 */
|
|
|
|
|
|
|
|
PCSTR XX_FormatMessage(PCSTR fmt, ...)
|
|
{
|
|
static unsigned char static_buf[MAX_DEBUG_MESSAGE_SIZE];
|
|
va_list val;
|
|
|
|
va_start(val,fmt);
|
|
vsprintf(static_buf,fmt,val);
|
|
va_end(val);
|
|
|
|
return (static_buf);
|
|
}
|
|
|
|
void XX_AssertionFailure(PCSTR filename, int linenumber, PCSTR condition,
|
|
PCSTR user_message)
|
|
{
|
|
static char buf[MAX_DEBUG_MESSAGE_SIZE];
|
|
|
|
if (user_message)
|
|
sprintf(buf, "%s!%d Assertion \"%s\" failed.\n(%s)\n\n\nBreak into Debugger?",
|
|
filename, linenumber, condition, user_message);
|
|
else
|
|
sprintf(buf, "%s!%d Assertion \"%s\" failed.\n\n\nBreak into Debugger?",
|
|
filename, linenumber, condition);
|
|
|
|
#ifdef WIN32
|
|
if (IDYES == MessageBox(NULL,buf,"XX_DEBUG",MB_YESNOCANCEL|MB_DEFBUTTON2|MB_ICONSTOP))
|
|
DebugBreak();
|
|
#endif /* WIN32 */
|
|
#ifdef UNIX
|
|
/* TODO force a dialog with the message (if desired). */
|
|
#endif /* UNIX */
|
|
|
|
XX_DebugMessage(buf);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
/* XX_DebugMessage() -- generate printf-style message on the appropriate
|
|
debug device. (Caller should test debug category.) */
|
|
|
|
void XX_DebugMessage(const char *msg, ...)
|
|
{
|
|
static unsigned char buf[MAX_DEBUG_MESSAGE_SIZE];
|
|
va_list val;
|
|
|
|
va_start(val,msg);
|
|
vsprintf(buf,msg,val);
|
|
lstrcat(buf, "\r\n");
|
|
va_end(val);
|
|
|
|
// if (XX_activated&XXDM_INTERACTIVE_ON)
|
|
{
|
|
#ifdef WIN32
|
|
switch (xxd.mode)
|
|
{
|
|
#ifdef XX_DEBUG_CONSOLE
|
|
case XXDM_CONSOLE:
|
|
xx_write_console(buf);
|
|
break;
|
|
#endif /* XX_DEBUG_CONSOLE */
|
|
|
|
case XXDM_WINDBG:
|
|
OutputDebugString(buf);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
#endif /* WIN32 */
|
|
#ifdef UNIX
|
|
fprintf(stderr,buf);
|
|
#endif /* UNIX */
|
|
}
|
|
|
|
if (XX_activated&XXDM_LOGFILE_ON)
|
|
{
|
|
unsigned int len = strlen(buf);
|
|
if (fwrite(buf,sizeof(unsigned char),len,xxdlog.log) != len)
|
|
xx_logfile_error();
|
|
}
|
|
}
|
|
|
|
#ifdef WIN32
|
|
|
|
/*****************************************************************
|
|
* XX_DEBUG Dialog
|
|
*****************************************************************/
|
|
|
|
#define FIRST_RADIO XXM_MODE_CO
|
|
#define LAST_RADIO XXM_MODE_WINDBG
|
|
#define ENABLE_RADIO_BUTTONS (!(XX_activated&XXDM_INTERACTIVE_ON))
|
|
|
|
|
|
/* xx_update_int_dlg() -- update gray-ed out options in the INTERACTIVE
|
|
section. */
|
|
|
|
static void xx_update_int_dlg(HWND hDlg)
|
|
{
|
|
#ifdef XX_DEBUG_CONSOLE
|
|
EnableWindow(GetDlgItem(hDlg,XXM_MODE_CO),ENABLE_RADIO_BUTTONS);
|
|
#else
|
|
EnableWindow(GetDlgItem(hDlg,XXM_MODE_CO),FALSE);
|
|
#endif
|
|
EnableWindow(GetDlgItem(hDlg,XXM_MODE_WINDBG),ENABLE_RADIO_BUTTONS);
|
|
|
|
|
|
/* Toggle availability of dialog items under mode radio-button. */
|
|
|
|
#define ENABLE_MODE_SUB_OPT(m) ((ENABLE_RADIO_BUTTONS)&&(static_dlg_info.mode==(m)))
|
|
|
|
/* XXDM_CONSOLE */
|
|
|
|
EnableWindow(GetDlgItem(hDlg,XXM_CO_ROWS),ENABLE_MODE_SUB_OPT(XXDM_CONSOLE));
|
|
|
|
/* XXDM_WINDBG */
|
|
|
|
#undef ENABLE_MODE_SUB_OPT
|
|
|
|
/* Turn-ON and Turn-OFF should only be available when in the other state. */
|
|
|
|
EnableWindow(GetDlgItem(hDlg,XXM_INTERACTIVE_ON_NOW),
|
|
(!(XX_activated&XXDM_INTERACTIVE_ON)));
|
|
EnableWindow(GetDlgItem(hDlg,XXM_INTERACTIVE_OFF_NOW),
|
|
( (XX_activated&XXDM_INTERACTIVE_ON)));
|
|
|
|
EnableWindow(GetDlgItem(hDlg,XXM_ASSERTIONS),TRUE);
|
|
CheckDlgButton(hDlg,XXM_ASSERTIONS,XX_assertions);
|
|
|
|
#ifdef AUDIT
|
|
EnableWindow(GetDlgItem(hDlg,XXM_AUDIT0),TRUE);
|
|
CheckDlgButton(hDlg,XXM_AUDIT0,(XX_auditmask&XX_AUDITMASK_B0)!=0);
|
|
|
|
EnableWindow(GetDlgItem(hDlg,XXM_AUDIT1),TRUE);
|
|
CheckDlgButton(hDlg,XXM_AUDIT1,(XX_auditmask&XX_AUDITMASK_B1)!=0);
|
|
|
|
EnableWindow(GetDlgItem(hDlg,XXM_AUDIT2),TRUE);
|
|
CheckDlgButton(hDlg,XXM_AUDIT2,(XX_auditmask&XX_AUDITMASK_B2)!=0);
|
|
|
|
EnableWindow(GetDlgItem(hDlg,XXM_AUDIT3),TRUE);
|
|
CheckDlgButton(hDlg,XXM_AUDIT3,(XX_auditmask&XX_AUDITMASK_B3)!=0);
|
|
|
|
EnableWindow(GetDlgItem(hDlg,XXM_AUDIT4),TRUE);
|
|
CheckDlgButton(hDlg,XXM_AUDIT4,(XX_auditmask&XX_AUDITMASK_B4)!=0);
|
|
#endif /* AUDIT */
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/* xx_update_log_dlg() -- update gray-ed out options in the LOGFILE
|
|
section. */
|
|
|
|
static void xx_update_log_dlg(HWND hDlg)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg,XXM_LOGFILE_ON_NOW),
|
|
( (!(XX_activated&XXDM_LOGFILE_ON))
|
|
&& (ValidLogFilePathName())));
|
|
EnableWindow(GetDlgItem(hDlg,XXM_LOGFILE_OFF_NOW),
|
|
( (XX_activated&XXDM_LOGFILE_ON)));
|
|
EnableWindow(GetDlgItem(hDlg,XXM_LOGFILE_NEW),
|
|
(!(XX_activated&XXDM_LOGFILE_ON)));
|
|
EnableWindow(GetDlgItem(hDlg,XXM_LOGFILE_APPEND),
|
|
(!(XX_activated&XXDM_LOGFILE_ON)));
|
|
SendMessage(GetDlgItem(hDlg,XXM_LOG_PATH),WM_SETTEXT,
|
|
(WPARAM)0,(LPARAM)xxdlog.pathname);
|
|
return;
|
|
}
|
|
|
|
|
|
/* xx_set_mask_checkboxes() -- check/uncheck all 32 mask checkboxes based
|
|
upon current value in mask. */
|
|
|
|
static void xx_set_mask_checkboxes(HWND hDlg)
|
|
{
|
|
CheckDlgButton(hDlg,XXM_MASK_01, ((XX_mask & 0x00000001) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_02, ((XX_mask & 0x00000002) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_03, ((XX_mask & 0x00000004) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_04, ((XX_mask & 0x00000008) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_05, ((XX_mask & 0x00000010) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_06, ((XX_mask & 0x00000020) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_07, ((XX_mask & 0x00000040) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_08, ((XX_mask & 0x00000080) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_09, ((XX_mask & 0x00000100) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_10, ((XX_mask & 0x00000200) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_11, ((XX_mask & 0x00000400) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_12, ((XX_mask & 0x00000800) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_13, ((XX_mask & 0x00001000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_14, ((XX_mask & 0x00002000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_15, ((XX_mask & 0x00004000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_16, ((XX_mask & 0x00008000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_17, ((XX_mask & 0x00010000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_18, ((XX_mask & 0x00020000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_19, ((XX_mask & 0x00040000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_20, ((XX_mask & 0x00080000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_21, ((XX_mask & 0x00100000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_22, ((XX_mask & 0x00200000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_23, ((XX_mask & 0x00400000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_24, ((XX_mask & 0x00800000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_25, ((XX_mask & 0x01000000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_26, ((XX_mask & 0x02000000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_27, ((XX_mask & 0x04000000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_28, ((XX_mask & 0x08000000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_29, ((XX_mask & 0x10000000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_30, ((XX_mask & 0x20000000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_31, ((XX_mask & 0x40000000) > 0));
|
|
CheckDlgButton(hDlg,XXM_MASK_32, ((XX_mask & 0x80000000) > 0));
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/* xx_initialize_dialog_settings() -- helper routine for dialog procedure */
|
|
|
|
static BOOL xx_initialize_dialog_settings(HWND hDlg)
|
|
{
|
|
BOOL did_we_call_SetFocus = 0;
|
|
|
|
xx_set_mask_checkboxes(hDlg); /* Check/UnCheck flag buttons */
|
|
|
|
/* Select radio button for current mode */
|
|
|
|
static_dlg_info.mode = xxd.mode;
|
|
static_dlg_info.console_rows = xxdco.rows;
|
|
{
|
|
TCHAR buf[32];
|
|
if (static_dlg_info.console_rows)
|
|
wsprintf(buf,"%d",static_dlg_info.console_rows);
|
|
else
|
|
buf[0] = 0;
|
|
(void)SendMessage(GetDlgItem(hDlg,XXM_CO_ROWS),WM_SETTEXT,
|
|
(WPARAM)0,(LPARAM)(LPCTSTR)buf);
|
|
}
|
|
|
|
switch (xxd.mode)
|
|
{
|
|
|
|
#ifdef XX_DEBUG_CONSOLE
|
|
case XXDM_CONSOLE:
|
|
CheckRadioButton(hDlg,FIRST_RADIO,LAST_RADIO,XXM_MODE_CO);
|
|
break;
|
|
#endif
|
|
|
|
case XXDM_WINDBG:
|
|
CheckRadioButton(hDlg,FIRST_RADIO,LAST_RADIO,XXM_MODE_WINDBG);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
xx_update_int_dlg(hDlg);
|
|
xx_update_log_dlg(hDlg);
|
|
return (did_we_call_SetFocus);
|
|
}
|
|
|
|
|
|
#undef FIRST_RADIO
|
|
#undef LAST_RADIO
|
|
#undef ENABLE_ALL_RADIO
|
|
|
|
|
|
|
|
/* xx_copy_settings_from_dialog() -- helper routine for dialog procedure */
|
|
|
|
static void xx_copy_settings_from_dialog(HWND hDlg)
|
|
{
|
|
Txxd_category c = XXDC_NONE;
|
|
|
|
/* get flag values from check boxes. */
|
|
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_01)) c |= 0x00000001;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_02)) c |= 0x00000002;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_03)) c |= 0x00000004;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_04)) c |= 0x00000008;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_05)) c |= 0x00000010;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_06)) c |= 0x00000020;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_07)) c |= 0x00000040;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_08)) c |= 0x00000080;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_09)) c |= 0x00000100;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_10)) c |= 0x00000200;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_11)) c |= 0x00000400;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_12)) c |= 0x00000800;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_13)) c |= 0x00001000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_14)) c |= 0x00002000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_15)) c |= 0x00004000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_16)) c |= 0x00008000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_17)) c |= 0x00010000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_18)) c |= 0x00020000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_19)) c |= 0x00040000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_20)) c |= 0x00080000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_21)) c |= 0x00100000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_22)) c |= 0x00200000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_23)) c |= 0x00400000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_24)) c |= 0x00800000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_25)) c |= 0x01000000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_26)) c |= 0x02000000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_27)) c |= 0x04000000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_28)) c |= 0x08000000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_29)) c |= 0x10000000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_30)) c |= 0x20000000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_31)) c |= 0x40000000;
|
|
if (IsDlgButtonChecked(hDlg,XXM_MASK_32)) c |= 0x80000000;
|
|
|
|
XX_mask = c;
|
|
return;
|
|
}
|
|
|
|
#ifdef AUDIT
|
|
static unsigned long GetAuditMask(HWND hDlg)
|
|
{
|
|
register unsigned long m = XX_AUDITMASK_OFF;
|
|
|
|
if (IsDlgButtonChecked(hDlg,XXM_AUDIT0)) m |= XX_AUDITMASK_B0;
|
|
if (IsDlgButtonChecked(hDlg,XXM_AUDIT1)) m |= XX_AUDITMASK_B1;
|
|
if (IsDlgButtonChecked(hDlg,XXM_AUDIT2)) m |= XX_AUDITMASK_B2;
|
|
if (IsDlgButtonChecked(hDlg,XXM_AUDIT3)) m |= XX_AUDITMASK_B3;
|
|
if (IsDlgButtonChecked(hDlg,XXM_AUDIT4)) m |= XX_AUDITMASK_B4;
|
|
|
|
return (m);
|
|
}
|
|
#endif /* AUDIT */
|
|
|
|
|
|
/* xx_DlgProc() -- dialog procedure for XX_DEBUG_DIALOG dialog box. */
|
|
|
|
static LRESULT CALLBACK xx_DlgProc(HWND hDlg, UINT uMsg,
|
|
WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
return (xx_initialize_dialog_settings(hDlg));
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDOK:
|
|
xx_copy_settings_from_dialog(hDlg);
|
|
XX_assertions = IsDlgButtonChecked(hDlg,XXM_ASSERTIONS);
|
|
#ifdef AUDIT
|
|
XX_auditmask = GetAuditMask(hDlg);
|
|
#endif /* AUDIT */
|
|
EndDialog(hDlg,TRUE);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg,FALSE);
|
|
break;
|
|
|
|
case XXM_INTERACTIVE_ON_NOW:
|
|
xx_enable(hDlg);
|
|
xx_update_int_dlg(hDlg);
|
|
break;
|
|
|
|
case XXM_INTERACTIVE_OFF_NOW:
|
|
xx_disable();
|
|
xx_update_int_dlg(hDlg);
|
|
break;
|
|
|
|
case XXM_ALL_BITS_ON_NOW:
|
|
XX_mask = XXDC_ALL;
|
|
xx_set_mask_checkboxes(hDlg);
|
|
break;
|
|
|
|
case XXM_ALL_BITS_OFF_NOW:
|
|
XX_mask = XXDC_NONE;
|
|
xx_set_mask_checkboxes(hDlg);
|
|
break;
|
|
|
|
#ifdef XX_DEBUG_CONSOLE
|
|
case XXM_MODE_CO:
|
|
if (static_dlg_info.mode != XXDM_CONSOLE)
|
|
{
|
|
static_dlg_info.mode = XXDM_CONSOLE;
|
|
xx_update_int_dlg(hDlg);
|
|
}
|
|
break;
|
|
|
|
case XXM_CO_ROWS:
|
|
switch (HIWORD(wParam))
|
|
{
|
|
case EN_KILLFOCUS:
|
|
{
|
|
TCHAR buf[32];
|
|
TCHAR newbuf[32];
|
|
LONG value;
|
|
HWND hCtl = (HWND)lParam;
|
|
|
|
(void)SendMessage(hCtl,WM_GETTEXT,
|
|
(WPARAM)NrElements(buf),
|
|
(LPARAM)buf);
|
|
newbuf[0] = 0;
|
|
if ( (TextToLONG(buf,&value,DEFAULT_NR_CONSOLE_ROWS,newbuf))
|
|
&& (value >= DEFAULT_NR_CONSOLE_ROWS)
|
|
&& (value <= MAX_NR_CONSOLE_ROWS) )
|
|
{
|
|
static_dlg_info.console_rows = (short)value;
|
|
(void)SendMessage(hCtl,WM_SETTEXT,(WPARAM)0,
|
|
(LPARAM)newbuf); /* normalize field */
|
|
}
|
|
else
|
|
{
|
|
TCHAR msg[128];
|
|
wsprintf(msg,
|
|
"Field must be NUMERIC and between %d and %d.",
|
|
DEFAULT_NR_CONSOLE_ROWS,MAX_NR_CONSOLE_ROWS);
|
|
(void)MessageBox(hDlg,msg,"Error!",MB_OK|MB_ICONINFORMATION);
|
|
/* highlight entire text and warp back. */
|
|
(void)SendMessage(hCtl,EM_SETSEL,(WPARAM)0,(LPARAM)-1);
|
|
(void)SetFocus(hCtl);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case EN_MAXTEXT:
|
|
case EN_ERRSPACE:
|
|
Beep(440,250);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
case XXM_MODE_WINDBG:
|
|
if (static_dlg_info.mode != XXDM_WINDBG)
|
|
{
|
|
static_dlg_info.mode = XXDM_WINDBG;
|
|
xx_update_int_dlg(hDlg);
|
|
}
|
|
break;
|
|
|
|
case XXM_LOGFILE_ON_NOW:
|
|
XX_activated |= XXDM_LOGFILE_ON;
|
|
xx_open_logfile();
|
|
xx_update_log_dlg(hDlg);
|
|
break;
|
|
|
|
case XXM_LOGFILE_OFF_NOW:
|
|
XX_activated &= ~XXDM_LOGFILE_ON;
|
|
xx_close_logfile();
|
|
xx_update_log_dlg(hDlg);
|
|
break;
|
|
|
|
case XXM_LOGFILE_APPEND:
|
|
xx_get_append_pathname(hDlg);
|
|
xx_update_log_dlg(hDlg);
|
|
break;
|
|
|
|
case XXM_LOGFILE_NEW:
|
|
xx_get_new_pathname(hDlg);
|
|
xx_update_log_dlg(hDlg);
|
|
break;
|
|
|
|
default:
|
|
goto DoDefault;
|
|
} /* end switch(LOWORD(wParam)) */
|
|
break; /* end of case WM_COMMAND: */
|
|
|
|
default:
|
|
goto DoDefault;
|
|
} /* end switch(uMsg) */
|
|
return (1); /* we processed the message. */
|
|
|
|
|
|
DoDefault:
|
|
return (0); /* we did nothing, let windows deal with it. */
|
|
}
|
|
|
|
|
|
/* XX_DDlg() -- Shell for dialog box that allows user to specify debug options. */
|
|
|
|
void XX_DDlg(HWND hWnd)
|
|
{
|
|
if (DialogBox(xxd.hInstance,MAKEINTRESOURCE(XX_DEBUG_DIALOG),
|
|
hWnd,xx_DlgProc) < 0)
|
|
(void)MessageBox(NULL,
|
|
"Could not start XX_DEBUG_DIALOG dialog box.",
|
|
"ERROR",
|
|
MB_ICONEXCLAMATION|MB_OK);
|
|
return;
|
|
}
|
|
#endif /* WIN32 */
|
|
|
|
|
|
/*****************************************************************
|
|
* PUBLIC initialization/termination routines -- callable
|
|
* by Win32 or UNIX
|
|
*****************************************************************/
|
|
|
|
void xx_InitFromEnvironment(void)
|
|
{
|
|
char * buf;
|
|
unsigned long tmp;
|
|
|
|
xxd.mode = XXDM_WINDBG;
|
|
|
|
/* allow something like this to be specified in the user's environment:
|
|
*
|
|
* set XX_mode=3 (3=console,4=windbg)
|
|
* set XX_interactive=t
|
|
* set XX_logfileon=t
|
|
* set XX_mask=ffffffff
|
|
* set XX_assertions=t
|
|
* set XX_logfilename=foo.log
|
|
* set XX_logappend=f
|
|
* set XX_consolerows=100
|
|
* set XX_auditmask=001f (see auditmask flags)
|
|
*
|
|
*/
|
|
|
|
#ifdef WIN32
|
|
if ( (buf = getenv("XX_mode")) )
|
|
{
|
|
sscanf(buf,"%x",&tmp);
|
|
xxd.mode = (unsigned char)tmp;
|
|
}
|
|
#endif /* WIN32 */
|
|
|
|
if ( (buf = getenv("XX_interactive")) )
|
|
if ((buf[0]=='t') || (buf[0]=='T'))
|
|
XX_activated |= XXDM_INTERACTIVE_ON;
|
|
|
|
if ( (buf = getenv("XX_logfileon")) )
|
|
if ((buf[0]=='t') || (buf[0]=='T'))
|
|
XX_activated |= XXDM_LOGFILE_ON;
|
|
|
|
if ( (buf = getenv("XX_mask")) )
|
|
{
|
|
sscanf(buf,"%x",&tmp); /* mask is always specified in HEX */
|
|
XX_mask = tmp;
|
|
}
|
|
|
|
if ( (buf = getenv("XX_assertions")) )
|
|
XX_assertions = ((buf[0]=='t') || (buf[0]=='T')); /* flag is 't' or 'f' */
|
|
|
|
if ( (buf = getenv("XX_logfilename")) )
|
|
if (strlen(buf))
|
|
strcpy(xxdlog.pathname,buf);
|
|
else
|
|
xxdlog.pathname[0]=0;
|
|
|
|
if ( (buf = getenv("XX_logappend")) )
|
|
xxdlog.mode = (((buf[0]=='t') || (buf[0]=='T')) ? LOG_APPEND : LOG_NEW);
|
|
|
|
#ifdef WIN32 /* Win32 console support */
|
|
if ( (buf = getenv("XX_consolerows")) )
|
|
{
|
|
sscanf(buf,"%d",&tmp);
|
|
xxdco.rows = (short)tmp;
|
|
}
|
|
else
|
|
{
|
|
xxdco.rows = (short)DEFAULT_NR_CONSOLE_ROWS;
|
|
}
|
|
#endif /* WIN32 */
|
|
|
|
#ifdef WIN32 /* audit trail support */
|
|
if ( (buf = getenv("XX_auditmask")) )
|
|
{
|
|
sscanf(buf,"%x",&tmp);
|
|
XX_auditmask = tmp;
|
|
}
|
|
#endif /* WIN32 */
|
|
|
|
if (XX_activated & XXDM_LOGFILE_ON)
|
|
if (strlen(xxdlog.pathname))
|
|
xx_open_logfile();
|
|
else
|
|
XX_activated &= ~ XXDM_LOGFILE_ON;
|
|
|
|
#ifdef WIN32 /* Win32 console support */
|
|
if ( (XX_activated & XXDM_INTERACTIVE_ON)
|
|
&& (xxd.mode == XXDM_CONSOLE))
|
|
xx_enable_console();
|
|
#endif /* WIN32 */
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void xx_debug_init(void)
|
|
{
|
|
xx_InitFromEnvironment();
|
|
return;
|
|
}
|
|
|
|
void xx_debug_terminate(void)
|
|
{
|
|
if (XX_activated&XXDM_INTERACTIVE_ON)
|
|
xx_disable();
|
|
if (XX_activated&XXDM_LOGFILE_ON)
|
|
xx_close_logfile();
|
|
return;
|
|
}
|