pbx: Fix regression caused by taking advantage of the function name sort.
authorRichard Mudgett <rmudgett@digium.com>
Sat, 9 Feb 2013 20:58:53 +0000 (20:58 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Sat, 9 Feb 2013 20:58:53 +0000 (20:58 +0000)
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

main/pbx.c

index fa71488..1c58973 100644 (file)
@@ -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;
                }