dbg_init() no longer sets sCommands to NULL - variables in the BSS are

always zeroed anyway.
cmd_help() is now able to print out help about the specified command
only - it will also print out all aliases of that command. Reduced
the distance between the command name and its description; NULL
descriptions are now also allowed.
There is now a find_command() function that's used throughout the
module. Like in the Be debugger, it will now also accept partial
matches, i.e. "co" will most probably match "continue" (as long as
there is no new "co*" command added by another component). It will
first try to find an exact match, and only if that failed it will
search for a partial match.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5307 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2003-11-11 03:47:14 +00:00
parent 545d6e9c8d
commit b196064201
1 changed files with 43 additions and 20 deletions

View File

@ -26,12 +26,12 @@
#include <ctype.h>
struct debugger_command {
typedef struct debugger_command {
struct debugger_command *next;
int (*func)(int, char **);
const char *name;
const char *description;
};
} debugger_command;
int dbg_register_file[2][14]; /* XXXmpetit -- must be made generic */
@ -53,6 +53,30 @@ static char *args[MAX_ARGS] = { NULL, };
#define distance(a, b) ((a) < (b) ? (b) - (a) : (a) - (b))
static debugger_command *
find_command(char *name)
{
debugger_command *command;
int length;
// search command by full name
for (command = sCommands; command != NULL; command = command->next) {
if (strcmp(name, command->name) == 0)
return command;
}
// if it couldn't be found, search for a partial match
length = strlen(name);
for (command = sCommands; command != NULL; command = command->next) {
if (strncmp(name, command->name, length) == 0)
return command;
}
}
static int
debug_read_line(char *buf, int max_len)
{
@ -222,15 +246,8 @@ kernel_debugger_loop(void)
debugger_on_cpu = smp_get_current_cpu();
if (argc > 0) {
// search command by name
cmd = sCommands;
while (cmd != NULL) {
if (strcmp(args[0], cmd->name) == 0)
break;
cmd = cmd->next;
}
}
if (argc > 0)
cmd = find_command(args[0]);
if (cmd == NULL)
dprintf("unknown command, enter \"help\" to get a list of all supported commands\n");
@ -290,20 +307,28 @@ static int
cmd_reboot(int argc, char **argv)
{
reboot();
return 0; // I'll be really suprised if this line ever run! ;-)
return 0;
// I'll be really suprised if this line ever run! ;-)
}
static int
cmd_help(int argc, char **argv)
{
struct debugger_command *cmd;
debugger_command *command, *specified = NULL;
dprintf("debugger commands:\n");
cmd = sCommands;
while (cmd != NULL) {
dprintf(" %-32s\t\t%s\n", cmd->name, cmd->description ? cmd->description : "");
cmd = cmd->next;
if (argc > 1) {
// only print out the help of the specified command (and all of its aliases)
specified = find_command(argv[1]);
dprintf("debugger command for \"%s\" and aliases:\n", specified->name);
} else
dprintf("debugger commands:\n");
for (command = sCommands; command != NULL; command = command->next) {
if (specified && command->func != specified->func)
continue;
dprintf(" %-20s\t\t%s\n", command->name, command->description ? command->description : "-");
}
return 0;
@ -320,8 +345,6 @@ cmd_continue(int argc, char **argv)
int
dbg_init(kernel_args *ka)
{
sCommands = NULL;
return arch_dbg_con_init(ka);
}