264 lines
6.2 KiB
C
264 lines
6.2 KiB
C
/*
|
|
* debug.c -- controll the values of x_debug.
|
|
*
|
|
* Written by Jeremy Nelson
|
|
* Copyright 1997 EPIC Software Labs
|
|
* See the COPYRIGHT file for more information
|
|
*/
|
|
|
|
#include "irc.h"
|
|
static char cvsrevision[] = "$Id$";
|
|
CVS_REVISION(debug_c)
|
|
#include "struct.h"
|
|
|
|
#include "ircaux.h"
|
|
#include "output.h"
|
|
#include "misc.h"
|
|
#include "window.h"
|
|
#include "hook.h"
|
|
#include "lastlog.h"
|
|
#include "cset.h"
|
|
#include "screen.h"
|
|
#include "input.h"
|
|
#include "status.h"
|
|
#include "vars.h"
|
|
#define MAIN_SOURCE
|
|
#include "modval.h"
|
|
|
|
unsigned long x_debug = 0;
|
|
unsigned long internal_debug = 0;
|
|
unsigned long alias_debug = 0;
|
|
unsigned int debug_count = 1;
|
|
int in_debug_yell = 0;
|
|
|
|
struct debug_opts
|
|
{
|
|
char *command;
|
|
int flag;
|
|
};
|
|
|
|
static struct debug_opts opts[] =
|
|
{
|
|
{ "LOCAL_VARS", DEBUG_LOCAL_VARS },
|
|
{ "CTCPS", DEBUG_CTCPS },
|
|
{ "DCC_SEARCH", DEBUG_DCC_SEARCH },
|
|
{ "OUTBOUND", DEBUG_OUTBOUND },
|
|
{ "INBOUND", DEBUG_INBOUND },
|
|
{ "DCC_XMIT", DEBUG_DCC_XMIT },
|
|
{ "WAITS", DEBUG_WAITS },
|
|
{ "MEMORY", DEBUG_MEMORY },
|
|
{ "SERVER_CONNECT", DEBUG_SERVER_CONNECT },
|
|
{ "CRASH", DEBUG_CRASH },
|
|
{ "COLOR", DEBUG_COLOR },
|
|
{ "NOTIFY", DEBUG_NOTIFY },
|
|
{ "REGEX", DEBUG_REGEX },
|
|
{ "REGEX_DEBUG", DEBUG_REGEX_DEBUG },
|
|
{ "BROKEN_CLOCK", DEBUG_BROKEN_CLOCK },
|
|
{ "UNKNOWN", DEBUG_UNKNOWN },
|
|
{ "DEBUG", DEBUG_DEBUGGER },
|
|
{ "NEW_MATH", DEBUG_NEW_MATH },
|
|
{ "NEW_MATH_DEBUG", DEBUG_NEW_MATH_DEBUG },
|
|
{ "AUTOKEY", DEBUG_AUTOKEY },
|
|
{ "STRUCTURES", DEBUG_STRUCTURES },
|
|
{ "ALL", DEBUG_ALL },
|
|
{ NULL, 0 },
|
|
};
|
|
|
|
|
|
|
|
BUILT_IN_COMMAND(xdebugcmd)
|
|
{
|
|
int cnt;
|
|
int remove = 0;
|
|
char *this_arg;
|
|
|
|
if (!args || !*args)
|
|
{
|
|
char buffer[540];
|
|
char *q;
|
|
int i = 0;
|
|
|
|
buffer[0] = 0;
|
|
strmcat(buffer, "[-][+][option(s)] ", 511);
|
|
q = &buffer[strlen(buffer)];
|
|
for (i = 0; opts[i].command; i++)
|
|
{
|
|
if (q)
|
|
strmcat(q, ", ", 511);
|
|
strmcat(q, opts[i].command, 511);
|
|
}
|
|
return;
|
|
}
|
|
|
|
while (args && *args)
|
|
{
|
|
this_arg = upper(next_arg(args, &args));
|
|
if (*this_arg == '-')
|
|
remove = 1, this_arg++;
|
|
else if (*this_arg == '+')
|
|
this_arg++;
|
|
|
|
for (cnt = 0; opts[cnt].command; cnt++)
|
|
{
|
|
if (!strncmp(this_arg, opts[cnt].command, strlen(this_arg)))
|
|
{
|
|
if (remove)
|
|
x_debug &= ~opts[cnt].flag;
|
|
else
|
|
x_debug |= opts[cnt].flag;
|
|
break;
|
|
}
|
|
}
|
|
if (!opts[cnt].command)
|
|
say("Unrecognized XDEBUG option '%s'", this_arg);
|
|
}
|
|
}
|
|
|
|
void debugyell(const char *format, ...)
|
|
{
|
|
const char *save_from;
|
|
unsigned long save_level;
|
|
unsigned long old_alias_debug = alias_debug;
|
|
alias_debug = 0;
|
|
save_display_target(&save_from, &save_level);
|
|
set_display_target(NULL, LOG_DEBUG);
|
|
if (format)
|
|
{
|
|
char debugbuf[BIG_BUFFER_SIZE+1];
|
|
va_list args;
|
|
va_start (args, format);
|
|
*debugbuf = 0;
|
|
vsnprintf(debugbuf, BIG_BUFFER_SIZE, format, args);
|
|
va_end(args);
|
|
in_debug_yell = 1;
|
|
if (*debugbuf && do_hook(DEBUG_LIST, "%s", debugbuf))
|
|
put_echo(debugbuf);
|
|
in_debug_yell = 0;
|
|
}
|
|
alias_debug = old_alias_debug;
|
|
reset_display_target();
|
|
restore_display_target(save_from, save_level);
|
|
}
|
|
|
|
int parse_debug(char *value, int nvalue, char **rv)
|
|
{
|
|
char *str1, *str2;
|
|
char *copy;
|
|
char *nv = NULL;
|
|
|
|
if (rv)
|
|
*rv = NULL;
|
|
|
|
if (!value)
|
|
return 0;
|
|
|
|
copy = alloca(strlen(value) + 1);
|
|
strcpy(copy, value);
|
|
|
|
while ((str1 = new_next_arg(copy, ©)))
|
|
{
|
|
while (*str1 && (str2 = next_in_comma_list(str1, &str1)))
|
|
{
|
|
if (!my_strnicmp(str2, "ALL", 3))
|
|
nvalue = (0x7F - (DEBUG_TCL));
|
|
else if (!my_strnicmp(str2, "-ALL", 4))
|
|
nvalue = 0;
|
|
else if (!my_strnicmp(str2, "COMMANDS", 4))
|
|
nvalue |= DEBUG_COMMANDS;
|
|
else if (!my_strnicmp(str2, "-COMMANDS", 4))
|
|
nvalue &= ~(DEBUG_COMMANDS);
|
|
else if (!my_strnicmp(str2, "EXPANSIONS", 4))
|
|
nvalue |= DEBUG_EXPANSIONS;
|
|
else if (!my_strnicmp(str2, "-EXPANSIONS", 4))
|
|
nvalue &= ~(DEBUG_EXPANSIONS);
|
|
else if (!my_strnicmp(str2, "TCL", 3))
|
|
nvalue |= DEBUG_TCL;
|
|
else if (!my_strnicmp(str2, "-TCL", 3))
|
|
nvalue &= ~(DEBUG_TCL);
|
|
else if (!my_strnicmp(str2, "ALIAS", 3))
|
|
nvalue |= DEBUG_CMDALIAS;
|
|
else if (!my_strnicmp(str2, "-ALIAS", 3))
|
|
nvalue &= ~(DEBUG_CMDALIAS);
|
|
else if (!my_strnicmp(str2, "HOOK", 3))
|
|
nvalue |= DEBUG_HOOK;
|
|
else if (!my_strnicmp(str2, "-HOOK", 3))
|
|
nvalue &= ~(DEBUG_HOOK);
|
|
else if (!my_strnicmp(str2, "VARIABLES", 3))
|
|
nvalue |= DEBUG_VARIABLE;
|
|
else if (!my_strnicmp(str2, "-VARIABLES", 3))
|
|
nvalue &= ~(DEBUG_VARIABLE);
|
|
else if (!my_strnicmp(str2, "FUNCTIONS", 3))
|
|
nvalue |= DEBUG_FUNC;
|
|
else if (!my_strnicmp(str2, "-FUNCTIONS", 3))
|
|
nvalue &= ~(DEBUG_FUNC);
|
|
else if (!my_strnicmp(str2, "STRUCTURES", 3))
|
|
nvalue |= DEBUG_STRUCTURES;
|
|
else if (!my_strnicmp(str2, "-STRUCTURES", 3))
|
|
nvalue &= ~(DEBUG_STRUCTURES);
|
|
}
|
|
}
|
|
if (rv)
|
|
{
|
|
if (nvalue & DEBUG_COMMANDS)
|
|
m_s3cat(&nv, comma, "COMMANDS");
|
|
if (nvalue & DEBUG_EXPANSIONS)
|
|
m_s3cat(&nv, comma, "EXPANSIONS");
|
|
if (nvalue & DEBUG_TCL)
|
|
m_s3cat(&nv, comma, "TCL");
|
|
if (nvalue & DEBUG_CMDALIAS)
|
|
m_s3cat(&nv, comma, "ALIAS");
|
|
if (nvalue & DEBUG_HOOK)
|
|
m_s3cat(&nv, comma, "HOOK");
|
|
if (nvalue & DEBUG_VARIABLE)
|
|
m_s3cat(&nv, comma, "VARIABLES");
|
|
if (nvalue & DEBUG_FUNC)
|
|
m_s3cat(&nv, comma, "FUNCTIONS");
|
|
if (nvalue & DEBUG_STRUCTURES)
|
|
m_s3cat(&nv, comma, "STRUCTURES");
|
|
*rv = nv;
|
|
}
|
|
return nvalue;
|
|
}
|
|
|
|
void debug_window(Window *win, char *value, int unused)
|
|
{
|
|
Window *old_win = win;
|
|
char *nv = NULL;
|
|
|
|
internal_debug = parse_debug(value, internal_debug, &nv);
|
|
set_string_var(DEBUG_VAR, nv);
|
|
|
|
if (internal_debug)
|
|
{
|
|
Window *tmp = NULL;
|
|
if (!get_window_by_name("debug") && (tmp = new_window(win->screen)))
|
|
{
|
|
malloc_strcpy(&tmp->name, "debug");
|
|
tmp->double_status = 0;
|
|
hide_window(tmp);
|
|
tmp->window_level = LOG_DEBUG;
|
|
tmp->absolute_size = 1;
|
|
tmp->skip = 1;
|
|
debugging_window = tmp;
|
|
set_wset_string_var(tmp->wset, STATUS_FORMAT1_WSET, DEFAULT_FORMAT_DEBUG_FSET);
|
|
build_status(tmp, NULL, 0);
|
|
update_all_windows();
|
|
set_input_prompt(win, get_string_var(INPUT_PROMPT_VAR), 0);
|
|
cursor_to_input();
|
|
set_screens_current_window(old_win->screen, old_win);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((old_win = get_window_by_name("debug")))
|
|
{
|
|
delete_window(old_win);
|
|
debugging_window = NULL;
|
|
update_all_windows();
|
|
set_input_prompt(current_window, get_string_var(INPUT_PROMPT_VAR), 0);
|
|
cursor_to_input();
|
|
}
|
|
}
|
|
new_free(&nv);
|
|
}
|