Merge "CLI: Finish conversion of completion handling to vectors."

This commit is contained in:
Jenkins2 2017-11-27 15:13:19 -06:00 committed by Gerrit Code Review
commit ae342a824f
1 changed files with 22 additions and 59 deletions

View File

@ -3001,10 +3001,9 @@ static char *cli_prompt(EditLine *editline)
return ast_str_buffer(prompt);
}
static char **ast_el_strtoarr(char *buf)
static struct ast_vector_string *ast_el_strtoarr(char *buf)
{
char *retstr;
char **match_list;
struct ast_vector_string *vec = ast_calloc(1, sizeof(*vec));
if (!vec) {
@ -3016,8 +3015,14 @@ static char **ast_el_strtoarr(char *buf)
break;
}
/* Older daemons sent duplicates. */
if (AST_VECTOR_GET_CMP(vec, retstr, strcasecmp)) {
continue;
}
retstr = ast_strdup(retstr);
if (!retstr || AST_VECTOR_APPEND(vec, retstr)) {
/* Older daemons sent unsorted. */
if (!retstr || AST_VECTOR_ADD_SORTED(vec, retstr, strcasecmp)) {
ast_free(retstr);
goto vector_cleanup;
}
@ -3027,15 +3032,7 @@ static char **ast_el_strtoarr(char *buf)
goto vector_cleanup;
}
if (AST_VECTOR_APPEND(vec, NULL)) {
/* We failed to NULL terminate the elements */
goto vector_cleanup;
}
match_list = AST_VECTOR_STEAL_ELEMENTS(vec);
AST_VECTOR_PTR_FREE(vec);
return match_list;
return vec;
vector_cleanup:
AST_VECTOR_CALLBACK_VOID(vec, ast_free);
@ -3044,17 +3041,7 @@ vector_cleanup:
return NULL;
}
static int ast_el_sort_compare(const void *i1, const void *i2)
{
char *s1, *s2;
s1 = ((char **)i1)[0];
s2 = ((char **)i2)[0];
return strcasecmp(s1, s2);
}
static void ast_cli_display_match_list(char **matches, int max)
static void ast_cli_display_match_list(struct ast_vector_string *matches, int max)
{
int idx = 1;
/* find out how many entries can be put on one line, with two spaces between strings */
@ -3067,14 +3054,9 @@ static void ast_cli_display_match_list(char **matches, int max)
for (;;) {
int numoutputline;
for (numoutputline = 0; numoutputline < limit && matches[idx]; idx++) {
/* Don't print dupes */
if ( (matches[idx+1] != NULL && strcmp(matches[idx], matches[idx+1]) == 0 ) ) {
continue;
}
for (numoutputline = 0; numoutputline < limit && idx < AST_VECTOR_SIZE(matches); idx++) {
numoutputline++;
fprintf(stdout, "%-*s ", max, matches[idx]);
fprintf(stdout, "%-*s ", max, AST_VECTOR_GET(matches, idx));
}
if (!numoutputline) {
@ -3090,8 +3072,7 @@ static char *cli_complete(EditLine *editline, int ch)
{
int len = 0;
char *ptr;
int nummatches = 0;
char **matches;
struct ast_vector_string *matches;
int retval = CC_ERROR;
char savechr;
int res;
@ -3165,44 +3146,28 @@ static char *cli_complete(EditLine *editline, int ch)
matches = ast_el_strtoarr(mbuf);
ast_free(mbuf);
} else {
matches = ast_cli_completion_matches((char *)lf->buffer,ptr);
matches = ast_cli_completion_vector((char *)lf->buffer, ptr);
}
if (matches) {
int i;
int maxlen, match_len;
const char *best_match = AST_VECTOR_GET(matches, 0);
while (matches[nummatches + 1]) {
nummatches++;
}
if (ast_opt_remote && nummatches > 1) {
qsort(&matches[0], (size_t)(nummatches), sizeof(char *), ast_el_sort_compare);
nummatches = 1;
i = 1;
while (matches[i + 1]) {
if (strcasecmp(matches[i], matches[i + 1])) {
/* don't count duplicates. */
nummatches++;
}
i++;
}
}
if (matches[0][0] != '\0') {
if (!ast_strlen_zero(best_match)) {
el_deletestr(editline, (int) len);
el_insertstr(editline, matches[0]);
el_insertstr(editline, best_match);
retval = CC_REFRESH;
}
if (nummatches == 1) {
if (AST_VECTOR_SIZE(matches) == 2) {
/* Found an exact match */
el_insertstr(editline, " ");
retval = CC_REFRESH;
} else {
/* Must be more than one match */
for (i = 1, maxlen = 0; matches[i]; i++) {
match_len = strlen(matches[i]);
for (i = 1, maxlen = 0; i < AST_VECTOR_SIZE(matches); i++) {
match_len = strlen(AST_VECTOR_GET(matches, i));
if (match_len > maxlen) {
maxlen = match_len;
}
@ -3212,10 +3177,8 @@ static char *cli_complete(EditLine *editline, int ch)
ast_cli_display_match_list(matches, maxlen);
retval = CC_REDISPLAY;
}
for (i = 0; matches[i]; i++) {
ast_free(matches[i]);
}
ast_free(matches);
AST_VECTOR_CALLBACK_VOID(matches, ast_free);
AST_VECTOR_PTR_FREE(matches);
}
*((char *) lf->cursor) = savechr;