Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Dec 2005 22:08:41 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 88150 for review
Message-ID:  <200512132208.jBDM8fNW089485@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=88150

Change 88150 by jhb@jhb_slimer on 2005/12/13 22:07:42

	- Add a notion of a command_table to ddb where a table contains not just
	  an array of commands, but also an optional linker set of additional
	  commands.
	- Add a helper function db_match_cmd() to cut down on code duplication
	  in db_cmd_search().  Fix a bug that could cause some added commands
	  in a linker set to be ignored.

Affected files ...

.. //depot/projects/smpng/sys/ddb/db_command.c#26 edit
.. //depot/projects/smpng/sys/ddb/ddb.h#19 edit

Differences ...

==== //depot/projects/smpng/sys/ddb/db_command.c#26 (text+ko) ====

@@ -83,15 +83,25 @@
 	{ (char *)0 }
 };
 
+static struct command_table db_show_all_table = {
+	db_show_all_cmds
+};
+
 static struct command db_show_cmds[] = {
-	{ "all",	0,			0,	db_show_all_cmds },
+	{ "all",	0,			0,	&db_show_all_table },
 	{ "registers",	db_show_regs,		0,	0 },
 	{ "breaks",	db_listbreak_cmd, 	0,	0 },
 	{ "threads",	db_show_threads,	0,	0 },
 	{ (char *)0, }
 };
 
-static struct command db_command_table[] = {
+static struct command_table db_show_table = {
+	db_show_cmds,
+	SET_BEGIN(db_show_cmd_set),
+	SET_LIMIT(db_show_cmd_set)
+};
+	
+static struct command db_commands[] = {
 	{ "print",	db_print_cmd,		0,	0 },
 	{ "p",		db_print_cmd,		0,	0 },
 	{ "examine",	db_examine_cmd,		CS_SET_DOT, 0 },
@@ -119,7 +129,7 @@
 	{ "where",	db_stack_trace,		CS_OWN,	0 },
 	{ "bt",		db_stack_trace,		CS_OWN,	0 },
 	{ "call",	db_fncall,		CS_OWN,	0 },
-	{ "show",	0,			0,	db_show_cmds },
+	{ "show",	0,			0,	&db_show_table },
 	{ "ps",		db_ps,			0,	0 },
 	{ "gdb",	db_gdb,			0,	0 },
 	{ "reset",	db_reset,		0,	0 },
@@ -129,6 +139,12 @@
 	{ (char *)0, }
 };
 
+static struct command_table db_command_table = {
+	db_commands,
+	SET_BEGIN(db_cmd_set),
+	SET_LIMIT(db_cmd_set)
+};
+
 static struct command	*db_last_command = 0;
 
 /*
@@ -159,94 +175,81 @@
 #define	CMD_AMBIGUOUS	3
 #define	CMD_HELP	4
 
-static void	db_cmd_list(struct command *table, struct command **aux_tablep,
-		    struct command **aux_tablep_end);
-static int	db_cmd_search(char *name, struct command *table,
-		    struct command **aux_tablep,
-		    struct command **aux_tablep_end, struct command **cmdp);
+static void	db_cmd_match(char *name, struct command *cmd,
+		    struct command **cmdp, int *resultp);
+static void	db_cmd_list(struct command_table *table);
+static int	db_cmd_search(char *name, struct command_table *table,
+		    struct command **cmdp);
 static void	db_command(struct command **last_cmdp,
-		    struct command *cmd_table, struct command **aux_cmd_tablep,
-		    struct command **aux_cmd_tablep_end);
+		    struct command_table *cmd_table);
 
 /*
- * Search for command prefix.
+ * Helper function to match a single command.
  */
-static int
-db_cmd_search(name, table, aux_tablep, aux_tablep_end, cmdp)
+static void
+db_cmd_match(name, cmd, cmdp, resultp)
 	char *		name;
-	struct command	*table;
-	struct command	**aux_tablep;
-	struct command	**aux_tablep_end;
+	struct command	*cmd;
 	struct command	**cmdp;	/* out */
+	int *		resultp;
 {
-	struct command	*cmd;
-	struct command	**aux_cmdp;
-	int		result = CMD_NONE;
+	char *lp, *rp;
+	int c;
 
-	for (cmd = table; cmd->name != 0; cmd++) {
-	    register char *lp;
-	    register char *rp;
-	    register int  c;
-
-	    lp = name;
-	    rp = cmd->name;
-	    while ((c = *lp) == *rp) {
+	lp = name;
+	rp = cmd->name;
+	while ((c = *lp) == *rp) {
 		if (c == 0) {
-		    /* complete match */
-		    *cmdp = cmd;
-		    return (CMD_UNIQUE);
+			/* complete match */
+			*cmdp = cmd;
+			*resultp = CMD_UNIQUE;
+			return;
 		}
 		lp++;
 		rp++;
-	    }
-	    if (c == 0) {
+	}
+	if (c == 0) {
 		/* end of name, not end of command -
 		   partial match */
-		if (result == CMD_FOUND) {
-		    result = CMD_AMBIGUOUS;
-		    /* but keep looking for a full match -
-		       this lets us match single letters */
+		if (*resultp == CMD_FOUND) {
+			*resultp = CMD_AMBIGUOUS;
+			/* but keep looking for a full match -
+			   this lets us match single letters */
+		} else {
+			*cmdp = cmd;
+			*resultp = CMD_FOUND;
 		}
-		else {
-		    *cmdp = cmd;
-		    result = CMD_FOUND;
-		}
-	    }
 	}
-	if (result == CMD_NONE && aux_tablep != 0)
-	    /* XXX repeat too much code. */
-	    for (aux_cmdp = aux_tablep; aux_cmdp < aux_tablep_end; aux_cmdp++) {
-		register char *lp;
-		register char *rp;
-		register int  c;
+}
+
+/*
+ * Search for command prefix.
+ */
+static int
+db_cmd_search(name, table, cmdp)
+	char *		name;
+	struct command_table *table;
+	struct command	**cmdp;	/* out */
+{
+	struct command	*cmd;
+	struct command	**aux_cmdp;
+	int		result = CMD_NONE;
 
-		lp = name;
-		rp = (*aux_cmdp)->name;
-		while ((c = *lp) == *rp) {
-		    if (c == 0) {
-			/* complete match */
-			*cmdp = *aux_cmdp;
+	for (cmd = table->table; cmd->name != 0; cmd++) {
+		db_cmd_match(name, cmd, cmdp, &result);
+		if (result == CMD_UNIQUE)
 			return (CMD_UNIQUE);
-		    }
-		    lp++;
-		    rp++;
+	}
+	if (table->aux_tablep != NULL)
+		for (aux_cmdp = table->aux_tablep;
+		     aux_cmdp < table->aux_tablep_end;
+		     aux_cmdp++) {
+			db_cmd_match(name, *aux_cmdp, cmdp, &result);
+			if (result == CMD_UNIQUE)
+				return (CMD_UNIQUE);
 		}
-		if (c == 0) {
-		    /* end of name, not end of command -
-		       partial match */
-		    if (result == CMD_FOUND) {
-			result = CMD_AMBIGUOUS;
-			/* but keep looking for a full match -
-			   this lets us match single letters */
-		    }
-		    else {
-			*cmdp = *aux_cmdp;
-			result = CMD_FOUND;
-		    }
-		}
-	    }
 	if (result == CMD_NONE) {
-	    /* check for 'help' */
+		/* check for 'help' */
 		if (name[0] == 'h' && name[1] == 'e'
 		    && name[2] == 'l' && name[3] == 'p')
 			result = CMD_HELP;
@@ -255,32 +258,29 @@
 }
 
 static void
-db_cmd_list(table, aux_tablep, aux_tablep_end)
-	struct command *table;
-	struct command **aux_tablep;
-	struct command **aux_tablep_end;
+db_cmd_list(table)
+	struct command_table *table;
 {
 	register struct command *cmd;
 	register struct command **aux_cmdp;
 
-	for (cmd = table; cmd->name != 0; cmd++) {
+	for (cmd = table->table; cmd->name != 0; cmd++) {
 	    db_printf("%-12s", cmd->name);
 	    db_end_line();
 	}
-	if (aux_tablep == 0)
+	if (table->aux_tablep == NULL)
 	    return;
-	for (aux_cmdp = aux_tablep; aux_cmdp < aux_tablep_end; aux_cmdp++) {
+	for (aux_cmdp = table->aux_tablep; aux_cmdp < table->aux_tablep_end;
+	     aux_cmdp++) {
 	    db_printf("%-12s", (*aux_cmdp)->name);
 	    db_end_line();
 	}
 }
 
 static void
-db_command(last_cmdp, cmd_table, aux_cmd_tablep, aux_cmd_tablep_end)
+db_command(last_cmdp, cmd_table)
 	struct command	**last_cmdp;	/* IN_OUT */
-	struct command	*cmd_table;
-	struct command	**aux_cmd_tablep;
-	struct command	**aux_cmd_tablep_end;
+	struct command_table *cmd_table;
 {
 	struct command	*cmd;
 	int		t;
@@ -314,8 +314,6 @@
 	    while (cmd_table) {
 		result = db_cmd_search(db_tok_string,
 				       cmd_table,
-				       aux_cmd_tablep,
-				       aux_cmd_tablep_end,
 				       &cmd);
 		switch (result) {
 		    case CMD_NONE:
@@ -327,23 +325,16 @@
 			db_flush_lex();
 			return;
 		    case CMD_HELP:
-			db_cmd_list(cmd_table, aux_cmd_tablep, aux_cmd_tablep_end);
+			db_cmd_list(cmd_table);
 			db_flush_lex();
 			return;
 		    default:
 			break;
 		}
-		if ((cmd_table = cmd->more) != 0) {
-		    /* XXX usually no more aux's. */
-		    aux_cmd_tablep = 0;
-		    if (cmd_table == db_show_cmds) {
-			aux_cmd_tablep = SET_BEGIN(db_show_cmd_set);
-			aux_cmd_tablep_end = SET_LIMIT(db_show_cmd_set);
-		    }
-
+		if ((cmd_table = cmd->more) != NULL) {
 		    t = db_read_token();
 		    if (t != tIDENT) {
-			db_cmd_list(cmd_table, aux_cmd_tablep, aux_cmd_tablep_end);
+			db_cmd_list(cmd_table);
 			db_flush_lex();
 			return;
 		    }
@@ -452,8 +443,7 @@
 	    db_printf("db> ");
 	    (void) db_read_line();
 
-	    db_command(&db_last_command, db_command_table,
-		       SET_BEGIN(db_cmd_set), SET_LIMIT(db_cmd_set));
+	    db_command(&db_last_command, &db_command_table);
 	}
 }
 

==== //depot/projects/smpng/sys/ddb/ddb.h#19 (text+ko) ====

@@ -152,6 +152,14 @@
 /*
  * Command table.
  */
+struct command;
+
+struct command_table {
+	struct command *table;
+	struct command **aux_tablep;
+	struct command **aux_tablep_end;
+};
+
 struct command {
 	char *	name;		/* command name */
 	db_cmdfcn_t *fcn;	/* function to call */
@@ -160,7 +168,7 @@
 #define	CS_MORE		0x2	/* standard syntax, but may have other words
 				 * at end */
 #define	CS_SET_DOT	0x100	/* set dot after command */
-	struct command *more;	/* another level of command */
+	struct command_table *more; /* another level of command */
 };
 
 #endif /* !_DDB_DDB_H_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200512132208.jBDM8fNW089485>