Merge "CLI: Finish conversion of completion handling to vectors."
This commit is contained in:
commit
ae342a824f
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue