diff options
author | Richard Mudgett <rmudgett@digium.com> | 2013-02-09 20:58:53 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2013-02-09 20:58:53 +0000 |
commit | 0e442112ada90d53cf8991b63bd3970cfaa7cc7a (patch) | |
tree | 0fae9915fe648a9103d54f1407f8ab1bba6cfe4d /main | |
parent | 1e65035d17b9774a959219e7ba68ff608639ba99 (diff) |
pbx: Fix regression caused by taking advantage of the function name sort.
Taking advantage of the sorted order of the registered functions container
requires that they are actually inserted in the expected sort order.
* Insert the registered functions into the container in case sensitive
position. As a result, only the complete_functions() routine needs to
search the entire container because it does a case insensitive search for
convenience.
Caught by the unit tests.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@381118 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r-- | main/pbx.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/main/pbx.c b/main/pbx.c index fa71488c6..1c58973c7 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -3814,11 +3814,14 @@ static char *complete_functions(const char *word, int pos, int state) wordlen = strlen(word); AST_RWLIST_RDLOCK(&acf_root); AST_RWLIST_TRAVERSE(&acf_root, cur, acflist) { - /* case-insensitive for convenience in this 'complete' function */ + /* + * Do a case-insensitive search for convenience in this + * 'complete' function. + * + * We must search the entire container because the functions are + * sorted and normally found case sensitively. + */ cmp = strncasecmp(word, cur->name, wordlen); - if (cmp > 0) { - continue; - } if (!cmp) { /* Found match. */ if (++which <= state) { @@ -3828,8 +3831,6 @@ static char *complete_functions(const char *word, int pos, int state) ret = ast_strdup(cur->name); break; } - /* Not in container. */ - break; } AST_RWLIST_UNLOCK(&acf_root); @@ -4066,7 +4067,7 @@ int __ast_custom_function_register(struct ast_custom_function *acf, struct ast_m /* Store in alphabetical order */ AST_RWLIST_TRAVERSE_SAFE_BEGIN(&acf_root, cur, acflist) { - if (strcasecmp(acf->name, cur->name) < 0) { + if (strcmp(acf->name, cur->name) < 0) { AST_RWLIST_INSERT_BEFORE_CURRENT(acf, acflist); break; } |