From 8e28b45846ed1a0dbb5196302d17e35cf7fc8104 Mon Sep 17 00:00:00 2001
From: Russell Bryant <russell@russellbryant.com>
Date: Tue, 29 Nov 2005 04:25:28 +0000
Subject: [PATCH] Add a minor optimization to CLI tab completion functions for
 channels. Also, clean up some formatting and coding guidelines issues.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7214 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 cli.c | 107 +++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 65 insertions(+), 42 deletions(-)

diff --git a/cli.c b/cli.c
index afba60f220..8ea63ca789 100755
--- a/cli.c
+++ b/cli.c
@@ -675,7 +675,7 @@ static int handle_debugchan(int fd, int argc, char *argv[])
 		if (c == NULL)
 			ast_cli(fd, "No such channel %s\n", argv[2]);
 	}
-	while(c) {
+	while (c) {
 		if (!(c->fin & DEBUGCHAN_FLAG) || !(c->fout & DEBUGCHAN_FLAG)) {
 			c->fin |= DEBUGCHAN_FLAG;
 			c->fout |= DEBUGCHAN_FLAG;
@@ -802,27 +802,38 @@ static char *complete_show_channels(char *line, char *word, int pos, int state)
 	static char *choices[] = { "concise", "verbose" };
 	int match = 0;
 	int x;
+	int wordlen;
+
 	if (pos != 2) 
 		return NULL;
-	for (x=0;x<sizeof(choices) / sizeof(choices[0]);x++) {
-		if (!strncasecmp(word, choices[x], strlen(word))) {
+	
+	wordlen = strlen(word);
+
+	for (x = 0; x < sizeof(choices) / sizeof(choices[0]); x++) {
+		if (!strncasecmp(word, choices[x], wordlen)) {
 			match++;
-			if (match > state) return strdup(choices[x]);
+			if (match > state)
+				return strdup(choices[x]);
 		}
 	}
+
 	return NULL;
 }
 
 static char *complete_ch_helper(char *line, char *word, int pos, int state, int rpos)
 {
 	struct ast_channel *c = NULL;
-	int which=0;
+	int which = 0;
+	int wordlen;
 	char *ret = NULL;
 
 	if (pos != rpos)
 		return NULL;
-	while ( (c = ast_channel_walk_locked(c)) != NULL) {
-		if (!strncasecmp(word, c->name, strlen(word))) {
+
+	wordlen = strlen(word);	
+
+	while ((c = ast_channel_walk_locked(c))) {
+		if (!strncasecmp(word, c->name, wordlen)) {
 			if (++which > state) {
 				ret = strdup(c->name);
 				ast_mutex_unlock(&c->lock);
@@ -831,6 +842,7 @@ static char *complete_ch_helper(char *line, char *word, int pos, int state, int
 		}
 		ast_mutex_unlock(&c->lock);
 	}
+
 	return ret;
 }
 
@@ -858,15 +870,20 @@ static char *complete_fn(char *line, char *word, int pos, int state)
 {
 	char *c;
 	char filename[256];
+
 	if (pos != 1)
 		return NULL;
+	
 	if (word[0] == '/')
 		ast_copy_string(filename, word, sizeof(filename));
 	else
-		snprintf(filename, sizeof(filename), "%s/%s", (char *)ast_config_AST_MODULE_DIR, word);
-	c = (char*)filename_completion_function(filename, state);
+		snprintf(filename, sizeof(filename), "%s/%s", ast_config_AST_MODULE_DIR, word);
+	
+	c = filename_completion_function(filename, state);
+	
 	if (c && word[0] != '/')
-		c += (strlen((char*)ast_config_AST_MODULE_DIR) + 1);
+		c += (strlen(ast_config_AST_MODULE_DIR) + 1);
+	
 	return c ? strdup(c) : c;
 }
 
@@ -1020,15 +1037,17 @@ int ast_cli_register(struct ast_cli_entry *e)
 	struct ast_cli_entry *cur, *l=NULL;
 	char fulle[80] ="", fulltst[80] ="";
 	static int len;
+	
 	ast_mutex_lock(&clilock);
 	join2(fulle, sizeof(fulle), e->cmda);
+	
 	if (find_cli(e->cmda, -1)) {
 		ast_mutex_unlock(&clilock);
 		ast_log(LOG_WARNING, "Command '%s' already registered (or something close enough)\n", fulle);
 		return -1;
 	}
-	cur = helpers;
-	while(cur) {
+	
+	for (cur = helpers; cur; cur = cur->next) {
 		join2(fulltst, sizeof(fulltst), cur->cmda);
 		len = strlen(fulltst);
 		if (strlen(fulle) < len)
@@ -1044,8 +1063,8 @@ int ast_cli_register(struct ast_cli_entry *e)
 			break;
 		}
 		l = cur;
-		cur = cur->next;
 	}
+
 	if (!cur) {
 		if (l)
 			l->next = e;
@@ -1053,7 +1072,9 @@ int ast_cli_register(struct ast_cli_entry *e)
 			helpers = e;
 		e->next = NULL;
 	}
+
 	ast_mutex_unlock(&clilock);
+	
 	return 0;
 }
 
@@ -1064,7 +1085,7 @@ void ast_cli_register_multiple(struct ast_cli_entry *e, int len)
 {
 	int i;
 
-	for (i=0; i < len; i++)
+	for (i = 0; i < len; i++)
 		ast_cli_register(e + i);
 }
 
@@ -1072,7 +1093,7 @@ void ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
 {
 	int i;
 
-	for (i=0; i < len; i++)
+	for (i = 0; i < len; i++)
 		ast_cli_unregister(e + i);
 }
 
@@ -1159,7 +1180,7 @@ static char *parse_args(char *s, int *argc, char *argv[], int max, int *trailing
 		return NULL;
 
 	cur = dup;
-	while (*s) {
+	while (!ast_strlen_zero(s)) {
 		if ((*s == '"') && !escaped) {
 			quoted = !quoted;
 			if (quoted & whitespace) {
@@ -1212,7 +1233,7 @@ int ast_cli_generatornummatches(char *text, char *word)
 	int matches = 0, i = 0;
 	char *buf = NULL, *oldbuf = NULL;
 
-	while ( (buf = ast_cli_generator(text, word, i++)) ) {
+	while ((buf = ast_cli_generator(text, word, i++))) {
 		if (!oldbuf || strcmp(buf,oldbuf))
 			matches++;
 		if (oldbuf)
@@ -1252,7 +1273,7 @@ char **ast_cli_completion_matches(char *text, char *word)
 	}
 
 	retstr = malloc(max_equal + 1);
-	(void) strncpy(retstr, match_list[1], max_equal);
+	strncpy(retstr, match_list[1], max_equal);
 	retstr[max_equal] = '\0';
 	match_list[0] = retstr;
 
@@ -1260,7 +1281,7 @@ char **ast_cli_completion_matches(char *text, char *word)
 		match_list = realloc(match_list, (match_list_len + 1) * sizeof(char *));
 	match_list[matches + 1] = (char *) NULL;
 
-	return (match_list);
+	return match_list;
 }
 
 static char *__ast_cli_generator(char *text, char *word, int state, int lock)
@@ -1352,32 +1373,34 @@ int ast_cli_command(int fd, char *s)
 	char *dup;
 	int tws;
 
-	if ((dup = parse_args(s, &x, argv, sizeof(argv) / sizeof(argv[0]), &tws))) {
-		/* We need at least one entry, or ignore */
-		if (x > 0) {
+	dup = parse_args(s, &x, argv, sizeof(argv) / sizeof(argv[0]), &tws);
+	if (!dup) {
+		ast_log(LOG_ERROR, "Out of Memory!\n");
+		return -1;
+	}
+
+	/* We need at least one entry, or ignore */
+	if (x > 0) {
+		ast_mutex_lock(&clilock);
+		e = find_cli(argv, 0);
+		if (e)
+			e->inuse++;
+		ast_mutex_unlock(&clilock);
+		if (e) {
+			switch(e->handler(fd, x, argv)) {
+			case RESULT_SHOWUSAGE:
+				ast_cli(fd, "%s", e->usage);
+				break;
+			}
+		} else 
+			ast_cli(fd, "No such command '%s' (type 'help' for help)\n", find_best(argv));
+		if (e) {
 			ast_mutex_lock(&clilock);
-			e = find_cli(argv, 0);
-			if (e)
-				e->inuse++;
+			e->inuse--;
 			ast_mutex_unlock(&clilock);
-			if (e) {
-				switch(e->handler(fd, x, argv)) {
-				case RESULT_SHOWUSAGE:
-					ast_cli(fd, "%s", e->usage);
-					break;
-				}
-			} else 
-				ast_cli(fd, "No such command '%s' (type 'help' for help)\n", find_best(argv));
-			if (e) {
-				ast_mutex_lock(&clilock);
-				e->inuse--;
-				ast_mutex_unlock(&clilock);
-			}
 		}
-		free(dup);
-	} else {
-		ast_log(LOG_WARNING, "Out of memory\n");	
-		return -1;
 	}
+	free(dup);
+	
 	return 0;
 }
-- 
GitLab