[svn-commits] tilghman: trunk r181027 - /trunk/main/pbx.c
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Tue Mar 10 19:28:31 CDT 2009
Author: tilghman
Date: Tue Mar 10 19:28:28 2009
New Revision: 181027
URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=181027
Log:
Spacing changes only
Modified:
trunk/main/pbx.c
Modified: trunk/main/pbx.c
URL: http://svn.digium.com/svn-view/asterisk/trunk/main/pbx.c?view=diff&rev=181027&r1=181026&r2=181027
==============================================================================
--- trunk/main/pbx.c (original)
+++ trunk/main/pbx.c Tue Mar 10 19:28:28 2009
@@ -76,13 +76,13 @@
*
* A new algorithm to do searching based on a 'compiled' pattern tree is introduced
* here, and shows a fairly flat (constant) search time, even for over
- * 10000 patterns.
+ * 10000 patterns.
*
* Also, using a hash table for context/priority name lookup can help prevent
- * the find_extension routines from absorbing exponential cpu cycles as the number
- * of contexts/priorities grow. I've previously tested find_extension with red-black trees,
- * which have O(log2(n)) speed. Right now, I'm using hash tables, which do
- * searches (ideally) in O(1) time. While these techniques do not yield much
+ * the find_extension routines from absorbing exponential cpu cycles as the number
+ * of contexts/priorities grow. I've previously tested find_extension with red-black trees,
+ * which have O(log2(n)) speed. Right now, I'm using hash tables, which do
+ * searches (ideally) in O(1) time. While these techniques do not yield much
* speed in small dialplans, they are worth the trouble in large dialplans.
*
*/
@@ -142,7 +142,7 @@
<parameter name="context">
<para>This is the dialplan context that this application will use when exiting
to a dialed extension.</para>
- </parameter>
+ </parameter>
</syntax>
<description>
<para>This application will play the given list of files <emphasis>(do not put extension)</emphasis>
@@ -773,7 +773,7 @@
int priority; /*!< Priority */
const char *label; /*!< Label */
struct ast_context *parent; /*!< The context this extension belongs to */
- const char *app; /*!< Application to execute */
+ const char *app; /*!< Application to execute */
struct ast_app *cached_app; /*!< Cached location of application */
void *data; /*!< Data to use (arguments) */
void (*datad)(void *); /*!< Data destructor */
@@ -838,10 +838,10 @@
/*! \brief ast_context: An extension context */
struct ast_context {
- ast_rwlock_t lock; /*!< A lock to prevent multiple threads from clobbering the context */
+ ast_rwlock_t lock; /*!< A lock to prevent multiple threads from clobbering the context */
struct ast_exten *root; /*!< The root of the list of extensions */
struct ast_hashtab *root_table; /*!< For exact matches on the extensions in the pattern tree, and for traversals of the pattern_tree */
- struct match_char *pattern_tree; /*!< A tree to speed up extension pattern matching */
+ struct match_char *pattern_tree; /*!< A tree to speed up extension pattern matching */
struct ast_context *next; /*!< Link them together */
struct ast_include *includes; /*!< Include other contexts */
struct ast_ignorepat *ignorepats; /*!< Patterns for which to continue playing dialtone */
@@ -879,12 +879,12 @@
/*! \brief Structure for dial plan hints
\note Hints are pointers from an extension in the dialplan to one or
- more devices (tech/name)
+ more devices (tech/name)
- See \ref AstExtState
*/
struct ast_hint {
struct ast_exten *exten; /*!< Extension */
- int laststate; /*!< Last known state */
+ int laststate; /*!< Last known state */
AST_LIST_HEAD_NOLOCK(, ast_state_cb) callbacks; /*!< Callback list for this extension */
AST_RWLIST_ENTRY(ast_hint) list;/*!< Pointer to next hint in list */
};
@@ -945,15 +945,15 @@
void log_match_char_tree(struct match_char *node, char *prefix); /* for use anywhere */
int pbx_builtin_setvar_multiple(struct ast_channel *, void *);
static int pbx_builtin_importvar(struct ast_channel *, void *);
-static void set_ext_pri(struct ast_channel *c, const char *exten, int pri);
-static void new_find_extension(const char *str, struct scoreboard *score,
- struct match_char *tree, int length, int spec, const char *callerid,
+static void set_ext_pri(struct ast_channel *c, const char *exten, int pri);
+static void new_find_extension(const char *str, struct scoreboard *score,
+ struct match_char *tree, int length, int spec, const char *callerid,
const char *label, enum ext_match_t action);
static struct match_char *already_in_tree(struct match_char *current, char *pat);
-static struct match_char *add_exten_to_pattern_tree(struct ast_context *con,
+static struct match_char *add_exten_to_pattern_tree(struct ast_context *con,
struct ast_exten *e1, int findonly);
-static struct match_char *add_pattern_node(struct ast_context *con,
- struct match_char *current, char *pattern, int is_pattern,
+static struct match_char *add_pattern_node(struct ast_context *con,
+ struct match_char *current, char *pattern, int is_pattern,
int already, int specificity, struct match_char **parent);
static void create_match_char_tree(struct ast_context *con);
static struct ast_exten *get_canmatch_exten(struct match_char *node);
@@ -1009,7 +1009,7 @@
if (x) { /* if exten names are diff, then return */
return x;
}
-
+
/* but if they are the same, do the cidmatch values match? */
if (ac->matchcid && bc->matchcid) {
return strcmp(ac->cidmatch,bc->cidmatch);
@@ -1119,7 +1119,7 @@
static struct ast_context *contexts;
static struct ast_hashtab *contexts_table = NULL;
-AST_RWLOCK_DEFINE_STATIC(conlock); /*!< Lock for the ast_context list */
+AST_RWLOCK_DEFINE_STATIC(conlock); /*!< Lock for the ast_context list */
static AST_RWLIST_HEAD_STATIC(apps, ast_app);
@@ -1169,10 +1169,10 @@
int found = 0;
struct ast_exten *e1, *e2, *e3;
struct ast_exten ex;
-
+
/* try to find inconsistencies */
/* is every context in the context table in the context list and vice-versa ? */
-
+
if (!contexts_table) {
ast_log(LOG_NOTICE,"Called from: %s:%d: No contexts_table!\n", file, line);
usleep(500000);
@@ -1228,7 +1228,7 @@
check_contexts_trouble();
}
}
-
+
/* is every entry in the root_table also in the root list? */
if (!c2->root_table) {
if (c2->root) {
@@ -1248,40 +1248,40 @@
ast_log(LOG_NOTICE,"Called from: %s:%d: The %s context records the exten %s but it is not in its root_table\n", file, line, c2->name, e2->exten);
check_contexts_trouble();
}
-
+
}
ast_hashtab_end_traversal(t1);
}
}
/* is every priority reflected in the peer_table at the head of the list? */
-
+
/* is every entry in the root list also in the root_table? */
/* are the per-extension peer_tables in the right place? */
for(e1 = c2->root; e1; e1 = e1->next) {
-
+
for(e2=e1;e2;e2=e2->peer) {
ex.priority = e2->priority;
if (e2 != e1 && e2->peer_table) {
ast_log(LOG_NOTICE,"Called from: %s:%d: The %s context, %s exten, %d priority has a peer_table entry, and shouldn't!\n", file, line, c2->name, e1->exten, e2->priority );
check_contexts_trouble();
}
-
+
if (e2 != e1 && e2->peer_label_table) {
ast_log(LOG_NOTICE,"Called from: %s:%d: The %s context, %s exten, %d priority has a peer_label_table entry, and shouldn't!\n", file, line, c2->name, e1->exten, e2->priority );
check_contexts_trouble();
}
-
+
if (e2 == e1 && !e2->peer_table){
ast_log(LOG_NOTICE,"Called from: %s:%d: The %s context, %s exten, %d priority doesn't have a peer_table!\n", file, line, c2->name, e1->exten, e2->priority );
check_contexts_trouble();
}
-
+
if (e2 == e1 && !e2->peer_label_table) {
ast_log(LOG_NOTICE,"Called from: %s:%d: The %s context, %s exten, %d priority doesn't have a peer_label_table!\n", file, line, c2->name, e1->exten, e2->priority );
check_contexts_trouble();
}
-
+
e3 = ast_hashtab_lookup(e1->peer_table, &ex);
if (!e3) {
@@ -1289,13 +1289,13 @@
check_contexts_trouble();
}
}
-
+
if (!e1->peer_table){
ast_log(LOG_NOTICE,"Called from: %s:%d: No e1->peer_table!\n", file, line);
usleep(500000);
}
-
- /* is every entry in the peer_table also in the peer list? */
+
+ /* is every entry in the peer_table also in the peer list? */
t1 = ast_hashtab_start_traversal(e1->peer_table);
while( (e2 = ast_hashtab_next(t1)) ) {
for(e3=e1;e3;e3=e3->peer) {
@@ -1319,9 +1319,9 @@
/*
\note This function is special. It saves the stack so that no matter
how many times it is called, it returns to the same place */
-int pbx_exec(struct ast_channel *c, /*!< Channel */
- struct ast_app *app, /*!< Application */
- void *data) /*!< Data for execution */
+int pbx_exec(struct ast_channel *c, /*!< Channel */
+ struct ast_app *app, /*!< Application */
+ void *data) /*!< Data for execution */
{
int res;
struct ast_module_user *u = NULL;
@@ -1395,30 +1395,30 @@
ast_free(p);
}
-/* form a tree that fully describes all the patterns in a context's extensions
+/* form a tree that fully describes all the patterns in a context's extensions
* in this tree, a "node" represents an individual character or character set
- * meant to match the corresponding character in a dial string. The tree
+ * meant to match the corresponding character in a dial string. The tree
* consists of a series of match_char structs linked in a chain
- * via the alt_char pointers. More than one pattern can share the same parts of the
- * tree as other extensions with the same pattern to that point.
+ * via the alt_char pointers. More than one pattern can share the same parts of the
+ * tree as other extensions with the same pattern to that point.
* My first attempt to duplicate the finding of the 'best' pattern was flawed in that
* I misunderstood the general algorithm. I thought that the 'best' pattern
* was the one with lowest total score. This was not true. Thus, if you have
* patterns "1XXXXX" and "X11111", you would be tempted to say that "X11111" is
- * the "best" match because it has fewer X's, and is therefore more specific,
+ * the "best" match because it has fewer X's, and is therefore more specific,
* but this is not how the old algorithm works. It sorts matching patterns
- * in a similar collating sequence as sorting alphabetic strings, from left to
+ * in a similar collating sequence as sorting alphabetic strings, from left to
* right. Thus, "1XXXXX" comes before "X11111", and would be the "better" match,
* because "1" is more specific than "X".
* So, to accomodate this philosophy, I sort the tree branches along the alt_char
* line so they are lowest to highest in specificity numbers. This way, as soon
- * as we encounter our first complete match, we automatically have the "best"
+ * as we encounter our first complete match, we automatically have the "best"
* match and can stop the traversal immediately. Same for CANMATCH/MATCHMORE.
* If anyone would like to resurrect the "wrong" pattern trie searching algorithm,
* they are welcome to revert pbx to before 1 Apr 2008.
* As an example, consider these 4 extensions:
* (a) NXXNXXXXXX
- * (b) 307754XXXX
+ * (b) 307754XXXX
* (c) fax
* (d) NXXXXXXXXX
*
@@ -1450,7 +1450,7 @@
* the previous. The same goes for "CANMATCH" or "MATCHMORE"; the first such match ends the traversal. In both
* these cases, the reason we can stop immediately, is because the first pattern match found will be the "best"
* according to the sort criteria.
- * Hope the limit on stack depth won't be a problem... this routine should
+ * Hope the limit on stack depth won't be a problem... this routine should
* be pretty lean as far a stack usage goes. Any non-match terminates the recursion down a branch.
*
* In the above example, with the number "3077549999" as the pattern, the traversor could match extensions a, b and d. All are
@@ -1488,20 +1488,20 @@
void log_match_char_tree(struct match_char *node, char *prefix)
{
char extenstr[40];
- struct ast_str *my_prefix = ast_str_alloca(1024);
+ struct ast_str *my_prefix = ast_str_alloca(1024);
extenstr[0] = '\0';
if (node && node->exten && node->exten)
snprintf(extenstr, sizeof(extenstr), "(%p)", node->exten);
-
+
if (strlen(node->x) > 1) {
- ast_debug(1, "%s[%s]:%c:%c:%d:%s%s%s\n", prefix, node->x, node->is_pattern ? 'Y':'N',
- node->deleted? 'D':'-', node->specificity, node->exten? "EXTEN:":"",
+ ast_debug(1, "%s[%s]:%c:%c:%d:%s%s%s\n", prefix, node->x, node->is_pattern ? 'Y':'N',
+ node->deleted? 'D':'-', node->specificity, node->exten? "EXTEN:":"",
node->exten ? node->exten->exten : "", extenstr);
} else {
- ast_debug(1, "%s%s:%c:%c:%d:%s%s%s\n", prefix, node->x, node->is_pattern ? 'Y':'N',
- node->deleted? 'D':'-', node->specificity, node->exten? "EXTEN:":"",
+ ast_debug(1, "%s%s:%c:%c:%d:%s%s%s\n", prefix, node->x, node->is_pattern ? 'Y':'N',
+ node->deleted? 'D':'-', node->specificity, node->exten? "EXTEN:":"",
node->exten ? node->exten->exten : "", extenstr);
}
@@ -1518,19 +1518,19 @@
{
char extenstr[40];
struct ast_str *my_prefix = ast_str_alloca(1024);
-
+
extenstr[0] = '\0';
if (node && node->exten && node->exten)
snprintf(extenstr, sizeof(extenstr), "(%p)", node->exten);
-
+
if (strlen(node->x) > 1) {
- ast_cli(fd, "%s[%s]:%c:%c:%d:%s%s%s\n", prefix, node->x, node->is_pattern ? 'Y' : 'N',
- node->deleted ? 'D' : '-', node->specificity, node->exten? "EXTEN:" : "",
+ ast_cli(fd, "%s[%s]:%c:%c:%d:%s%s%s\n", prefix, node->x, node->is_pattern ? 'Y' : 'N',
+ node->deleted ? 'D' : '-', node->specificity, node->exten? "EXTEN:" : "",
node->exten ? node->exten->exten : "", extenstr);
} else {
- ast_cli(fd, "%s%s:%c:%c:%d:%s%s%s\n", prefix, node->x, node->is_pattern ? 'Y' : 'N',
- node->deleted ? 'D' : '-', node->specificity, node->exten? "EXTEN:" : "",
+ ast_cli(fd, "%s%s:%c:%c:%d:%s%s%s\n", prefix, node->x, node->is_pattern ? 'Y' : 'N',
+ node->deleted ? 'D' : '-', node->specificity, node->exten? "EXTEN:" : "",
node->exten ? node->exten->exten : "", extenstr);
}
@@ -1567,28 +1567,34 @@
struct match_char *m3;
struct match_char *m4;
struct ast_exten *e3;
-
- if (node && node->x[0] == '.' && !node->x[1]) /* dot and ! will ALWAYS be next match in a matchmore */
+
+ if (node && node->x[0] == '.' && !node->x[1]) { /* dot and ! will ALWAYS be next match in a matchmore */
return node->exten;
-
- if (node && node->x[0] == '!' && !node->x[1])
+ }
+
+ if (node && node->x[0] == '!' && !node->x[1]) {
return node->exten;
-
- if (!node || !node->next_char)
+ }
+
+ if (!node || !node->next_char) {
return NULL;
-
+ }
+
m3 = node->next_char;
- if (m3->exten)
+ if (m3->exten) {
return m3->exten;
- for(m4=m3->alt_char; m4; m4 = m4->alt_char) {
- if (m4->exten)
+ }
+ for (m4 = m3->alt_char; m4; m4 = m4->alt_char) {
+ if (m4->exten) {
return m4->exten;
- }
- for(m4=m3; m4; m4 = m4->alt_char) {
+ }
+ }
+ for (m4 = m3; m4; m4 = m4->alt_char) {
e3 = trie_find_next_match(m3);
- if (e3)
+ if (e3) {
return e3;
+ }
}
return NULL;
}
@@ -1596,8 +1602,7 @@
#ifdef DEBUG_THIS
static char *action2str(enum ext_match_t action)
{
- switch(action)
- {
+ switch (action) {
case E_MATCH:
return "MATCH";
case E_CANMATCH:
@@ -1625,13 +1630,13 @@
else
ast_log(LOG_NOTICE,"new_find_extension called with %s on (sub)tree NULL action=%s\n", str, action2str(action));
#endif
- for (p=tree; p; p=p->alt_char) {
+ for (p = tree; p; p = p->alt_char) {
if (p->x[0] == 'N') {
if (p->x[1] == 0 && *str >= '2' && *str <= '9' ) {
#define NEW_MATCHER_CHK_MATCH \
- if (p->exten && !(*(str+1))) { /* if a shorter pattern matches along the way, might as well report it */ \
+ if (p->exten && !(*(str + 1))) { /* if a shorter pattern matches along the way, might as well report it */ \
if (action == E_MATCH || action == E_SPAWN || action == E_FINDLABEL) { /* if in CANMATCH/MATCHMORE, don't let matches get in the way */ \
- update_scoreboard(score, length+1, spec+p->specificity, p->exten,0,callerid, p->deleted, p); \
+ update_scoreboard(score, length + 1, spec + p->specificity, p->exten, 0, callerid, p->deleted, p); \
if (!p->deleted) { \
if (action == E_FINDLABEL) { \
if (ast_hashtab_lookup(score->exten->peer_label_table, &pattern)) { \
@@ -1645,33 +1650,33 @@
} \
} \
}
-
+
#define NEW_MATCHER_RECURSE \
- if (p->next_char && ( *(str+1) || (p->next_char->x[0] == '/' && p->next_char->x[1] == 0) \
- || p->next_char->x[0] == '!')) { \
- if (*(str+1) || p->next_char->x[0] == '!') { \
- new_find_extension(str+1, score, p->next_char, length+1, spec+p->specificity, callerid, label, action); \
+ if (p->next_char && ( *(str + 1) || (p->next_char->x[0] == '/' && p->next_char->x[1] == 0) \
+ || p->next_char->x[0] == '!')) { \
+ if (*(str + 1) || p->next_char->x[0] == '!') { \
+ new_find_extension(str + 1, score, p->next_char, length + 1, spec+p->specificity, callerid, label, action); \
if (score->exten) { \
- ast_debug(4,"returning an exact match-- %s\n", score->exten->exten); \
+ ast_debug(4, "returning an exact match-- %s\n", score->exten->exten); \
return; /* the first match is all we need */ \
} \
} else { \
- new_find_extension("/", score, p->next_char, length+1, spec+p->specificity, callerid, label, action); \
+ new_find_extension("/", score, p->next_char, length + 1, spec+p->specificity, callerid, label, action); \
if (score->exten || ((action == E_CANMATCH || action == E_MATCHMORE) && score->canmatch)) { \
ast_debug(4,"returning a (can/more) match--- %s\n", score->exten ? score->exten->exten : \
- "NULL"); \
+ "NULL"); \
return; /* the first match is all we need */ \
} \
} \
- } else if (p->next_char && !*(str+1)) { \
+ } else if (p->next_char && !*(str + 1)) { \
score->canmatch = 1; \
score->canmatch_exten = get_canmatch_exten(p); \
if (action == E_CANMATCH || action == E_MATCHMORE) { \
- ast_debug(4,"returning a canmatch/matchmore--- str=%s\n", str); \
+ ast_debug(4, "returning a canmatch/matchmore--- str=%s\n", str); \
return; \
} \
}
-
+
NEW_MATCHER_CHK_MATCH;
NEW_MATCHER_RECURSE;
}
@@ -1680,7 +1685,7 @@
NEW_MATCHER_CHK_MATCH;
NEW_MATCHER_RECURSE;
}
- } else if (p->x[0] == 'X') {
+ } else if (p->x[0] == 'X') {
if (p->x[1] == 0 && *str >= '0' && *str <= '9' ) {
NEW_MATCHER_CHK_MATCH;
NEW_MATCHER_RECURSE;
@@ -1703,7 +1708,7 @@
if (p->next_char && p->next_char->x[0] == '/' && p->next_char->x[1] == 0) {
new_find_extension("/", score, p->next_char, length+i, spec+(p->specificity*i), callerid, label, action);
if (score->exten || ((action == E_CANMATCH || action == E_MATCHMORE) && score->canmatch)) {
- ast_debug(4,"return because scoreboard has exact match OR CANMATCH/MATCHMORE & canmatch set--- %s\n", score->exten ? score->exten->exten : "NULL");
+ ast_debug(4, "return because scoreboard has exact match OR CANMATCH/MATCHMORE & canmatch set--- %s\n", score->exten ? score->exten->exten : "NULL");
return; /* the first match is all we need */
}
}
@@ -1716,14 +1721,14 @@
i++;
}
if (p->exten && *str2 != '/') {
- update_scoreboard(score, length+1, spec+(p->specificity*i), p->exten, '!', callerid, p->deleted, p);
+ update_scoreboard(score, length + 1, spec+(p->specificity * i), p->exten, '!', callerid, p->deleted, p);
if (score->exten) {
- ast_debug(4,"return because scoreboard has a '!' match--- %s\n", score->exten->exten);
+ ast_debug(4, "return because scoreboard has a '!' match--- %s\n", score->exten->exten);
return; /* the first match is all we need */
}
}
if (p->next_char && p->next_char->x[0] == '/' && p->next_char->x[1] == 0) {
- new_find_extension("/", score, p->next_char, length+i, spec+(p->specificity*i), callerid, label, action);
+ new_find_extension("/", score, p->next_char, length + i, spec + (p->specificity * i), callerid, label, action);
if (score->exten || ((action == E_CANMATCH || action == E_MATCHMORE) && score->canmatch)) {
ast_debug(4,"return because scoreboard has exact match OR CANMATCH/MATCHMORE & canmatch set with '/' and '!'--- %s\n", score->exten ? score->exten->exten : "NULL");
return; /* the first match is all we need */
@@ -1734,7 +1739,7 @@
if (p->next_char && callerid && *callerid) {
new_find_extension(callerid, score, p->next_char, length+1, spec, callerid, label, action);
if (score->exten || ((action == E_CANMATCH || action == E_MATCHMORE) && score->canmatch)) {
- ast_debug(4,"return because scoreboard has exact match OR CANMATCH/MATCHMORE & canmatch set with '/'--- %s\n", score->exten ? score->exten->exten : "NULL");
+ ast_debug(4, "return because scoreboard has exact match OR CANMATCH/MATCHMORE & canmatch set with '/'--- %s\n", score->exten ? score->exten->exten : "NULL");
return; /* the first match is all we need */
}
}
@@ -1744,16 +1749,16 @@
NEW_MATCHER_RECURSE;
}
}
- ast_debug(4,"return at end of func\n");
-}
-
-/* the algorithm for forming the extension pattern tree is also a bit simple; you
+ ast_debug(4, "return at end of func\n");
+}
+
+/* the algorithm for forming the extension pattern tree is also a bit simple; you
* traverse all the extensions in a context, and for each char of the extension,
* you see if it exists in the tree; if it doesn't, you add it at the appropriate
* spot. What more can I say? At the end of each exten, you cap it off by adding the
* address of the extension involved. Duplicate patterns will be complained about.
*
- * Ideally, this would be done for each context after it is created and fully
+ * Ideally, this would be done for each context after it is created and fully
* filled. It could be done as a finishing step after extensions.conf or .ael is
* loaded, or it could be done when the first search is encountered. It should only
* have to be done once, until the next unload or reload.
@@ -1768,37 +1773,39 @@
{
struct match_char *t;
- if (!current)
+ if (!current) {
return 0;
+ }
for (t = current; t; t = t->alt_char) {
- if (!strcmp(pat, t->x)) /* uh, we may want to sort exploded [] contents to make matching easy */
+ if (!strcmp(pat, t->x)) { /* uh, we may want to sort exploded [] contents to make matching easy */
return t;
+ }
}
return 0;
}
-/* The first arg is the location of the tree ptr, or the
+/* The first arg is the location of the tree ptr, or the
address of the next_char ptr in the node, so we can mess
with it, if we need to insert at the beginning of the list */
static void insert_in_next_chars_alt_char_list(struct match_char **parent_ptr, struct match_char *node)
{
struct match_char *curr, *lcurr;
-
+
/* insert node into the tree at "current", so the alt_char list from current is
sorted in increasing value as you go to the leaves */
if (!(*parent_ptr)) {
*parent_ptr = node;
} else {
- if ((*parent_ptr)->specificity > node->specificity){
+ if ((*parent_ptr)->specificity > node->specificity) {
/* insert at head */
node->alt_char = (*parent_ptr);
*parent_ptr = node;
} else {
lcurr = *parent_ptr;
- for (curr=(*parent_ptr)->alt_char; curr; curr = curr->alt_char) {
+ for (curr = (*parent_ptr)->alt_char; curr; curr = curr->alt_char) {
if (curr->specificity > node->specificity) {
node->alt_char = curr;
lcurr->alt_char = node;
@@ -1818,9 +1825,10 @@
static struct match_char *add_pattern_node(struct ast_context *con, struct match_char *current, char *pattern, int is_pattern, int already, int specificity, struct match_char **nextcharptr)
{
struct match_char *m;
-
- if (!(m = ast_calloc(1, sizeof(*m))))
+
+ if (!(m = ast_calloc(1, sizeof(*m)))) {
return NULL;
+ }
if (!(m->x = ast_strdup(pattern))) {
ast_free(m);
@@ -1842,7 +1850,7 @@
m->specificity = 0x20000;
else
m->specificity = specificity;
-
+
if (!con->pattern_tree) {
insert_in_next_chars_alt_char_list(&con->pattern_tree, m);
} else {
@@ -1866,19 +1874,19 @@
char extenbuf[512];
char *s1 = extenbuf;
int l1 = strlen(e1->exten) + strlen(e1->cidmatch) + 2;
-
+
ast_copy_string(extenbuf, e1->exten, sizeof(extenbuf));
if (e1->matchcid && l1 <= sizeof(extenbuf)) {
- strcat(extenbuf,"/");
- strcat(extenbuf,e1->cidmatch);
+ strcat(extenbuf, "/");
+ strcat(extenbuf, e1->cidmatch);
} else if (l1 > sizeof(extenbuf)) {
- ast_log(LOG_ERROR,"The pattern %s/%s is too big to deal with: it will be ignored! Disaster!\n", e1->exten, e1->cidmatch);
+ ast_log(LOG_ERROR, "The pattern %s/%s is too big to deal with: it will be ignored! Disaster!\n", e1->exten, e1->cidmatch);
return 0;
}
#ifdef NEED_DEBUG
- ast_log(LOG_DEBUG,"Adding exten %s%c%s to tree\n", s1, e1->matchcid? '/':' ', e1->matchcid? e1->cidmatch : "");
+ ast_log(LOG_DEBUG, "Adding exten %s%c%s to tree\n", s1, e1->matchcid ? '/' : ' ', e1->matchcid ? e1->cidmatch : "");
#endif
m1 = con->pattern_tree; /* each pattern starts over at the root of the pattern tree */
m0 = &con->pattern_tree;
@@ -1893,24 +1901,24 @@
char *s2 = buf;
buf[0] = 0;
s1++; /* get past the '[' */
- while (*s1 != ']' && *(s1-1) != '\\' ) {
+ while (*s1 != ']' && *(s1 - 1) != '\\' ) {
if (*s1 == '\\') {
- if (*(s1+1) == ']') {
+ if (*(s1 + 1) == ']') {
*s2++ = ']';
- s1++;s1++;
- } else if (*(s1+1) == '\\') {
+ s1++; s1++;
+ } else if (*(s1 + 1) == '\\') {
*s2++ = '\\';
- s1++;s1++;
- } else if (*(s1+1) == '-') {
+ s1++; s1++;
+ } else if (*(s1 + 1) == '-') {
*s2++ = '-';
s1++; s1++;
- } else if (*(s1+1) == '[') {
+ } else if (*(s1 + 1) == '[') {
*s2++ = '[';
s1++; s1++;
}
} else if (*s1 == '-') { /* remember to add some error checking to all this! */
- char s3 = *(s1-1);
- char s4 = *(s1+1);
+ char s3 = *(s1 - 1);
+ char s4 = *(s1 + 1);
for (s3++; s3 <= s4; s3++) {
*s2++ = s3;
}
@@ -1930,7 +1938,7 @@
specif <<= 8;
specif += buf[0];
} else {
-
+
if (*s1 == '\\') {
s1++;
buf[0] = *s1;
@@ -1949,9 +1957,9 @@
specif = 1;
}
m2 = 0;
- if (already && (m2=already_in_tree(m1,buf)) && m2->next_char) {
- if (!(*(s1+1))) { /* if this is the end of the pattern, but not the end of the tree, then mark this node with the exten...
- a shorter pattern might win if the longer one doesn't match */
+ if (already && (m2 = already_in_tree(m1,buf)) && m2->next_char) {
+ if (!(*(s1 + 1))) { /* if this is the end of the pattern, but not the end of the tree, then mark this node with the exten...
+ * a shorter pattern might win if the longer one doesn't match */
m2->exten = e1;
m2->deleted = 0;
}
@@ -1959,21 +1967,23 @@
m0 = &m2->next_char; /* m0 points to the ptr that points to m1 */
} else { /* not already OR not m2 OR nor m2->next_char */
if (m2) {
- if (findonly)
+ if (findonly) {
return m2;
+ }
m1 = m2; /* while m0 stays the same */
} else {
- if (findonly)
+ if (findonly) {
return m1;
+ }
m1 = add_pattern_node(con, m1, buf, pattern, already,specif, m0); /* m1 is the node just added */
m0 = &m1->next_char;
}
-
- if (!(*(s1+1))) {
+
+ if (!(*(s1 + 1))) {
m1->deleted = 0;
m1->exten = e1;
}
-
+
already = 0;
}
s1++; /* advance to next char */
@@ -1987,18 +1997,19 @@
struct ast_exten *e1;
#ifdef NEED_DEBUG
int biggest_bucket, resizes, numobjs, numbucks;
-
+
ast_log(LOG_DEBUG,"Creating Extension Trie for context %s\n", con->name);
ast_hashtab_get_stats(con->root_table, &biggest_bucket, &resizes, &numobjs, &numbucks);
ast_log(LOG_DEBUG,"This tree has %d objects in %d bucket lists, longest list=%d objects, and has resized %d times\n",
numobjs, numbucks, biggest_bucket, resizes);
#endif
t1 = ast_hashtab_start_traversal(con->root_table);
- while( (e1 = ast_hashtab_next(t1)) ) {
- if (e1->exten)
+ while ((e1 = ast_hashtab_next(t1))) {
+ if (e1->exten) {
add_exten_to_pattern_tree(con, e1, 0);
- else
- ast_log(LOG_ERROR,"Attempt to create extension with no extension name.\n");
+ } else {
+ ast_log(LOG_ERROR, "Attempt to create extension with no extension name.\n");
+ }
}
ast_hashtab_end_traversal(t1);
}
@@ -2016,8 +2027,9 @@
pattern_tree->next_char = 0;
}
pattern_tree->exten = 0; /* never hurts to make sure there's no pointers laying around */
- if (pattern_tree->x)
+ if (pattern_tree->x) {
free(pattern_tree->x);
+ }
free(pattern_tree);
}
@@ -2062,12 +2074,12 @@
* This way more specific patterns (smaller cardinality) appear first.
* Wildcards have a special value, so that we can directly compare them to
* sets by subtracting the two values. In particular:
- * 0x000xx one character, xx
- * 0x0yyxx yy character set starting with xx
- * 0x10000 '.' (one or more of anything)
- * 0x20000 '!' (zero or more of anything)
- * 0x30000 NUL (end of string)
- * 0x40000 error in set.
+ * 0x000xx one character, xx
+ * 0x0yyxx yy character set starting with xx
+ * 0x10000 '.' (one or more of anything)
+ * 0x20000 '!' (zero or more of anything)
+ * 0x30000 NUL (end of string)
+ * 0x40000 error in set.
* The pointer to the string is advanced according to needs.
* NOTES:
* 1. the empty set is equivalent to NUL.
@@ -2114,7 +2126,7 @@
break;
}
/* locate end of set */
- end = strchr(*p, ']');
+ end = strchr(*p, ']');
if (end == NULL) {
ast_log(LOG_WARNING, "Wrong usage of [] in the extension\n");
@@ -2192,11 +2204,11 @@
static int _extension_match_core(const char *pattern, const char *data, enum ext_match_t mode)
{
mode &= E_MATCH_MASK; /* only consider the relevant bits */
-
+
#ifdef NEED_DEBUG_HERE
ast_log(LOG_NOTICE,"match core: pat: '%s', dat: '%s', mode=%d\n", pattern, data, (int)mode);
#endif
-
+
if ( (mode == E_MATCH) && (pattern[0] == '_') && (!strcasecmp(pattern,data)) ) { /* note: if this test is left out, then _x. will not match _x. !!! */
#ifdef NEED_DEBUG_HERE
ast_log(LOG_NOTICE,"return (1) - pattern matches pattern\n");
@@ -2206,7 +2218,7 @@
if (pattern[0] != '_') { /* not a pattern, try exact or partial match */
int ld = strlen(data), lp = strlen(pattern);
-
+
if (lp < ld) { /* pattern too short, cannot match */
#ifdef NEED_DEBUG_HERE
ast_log(LOG_NOTICE,"return (0) - pattern too short, cannot match\n");
@@ -2219,7 +2231,7 @@
ast_log(LOG_NOTICE,"return (!strcmp(%s,%s) when mode== E_MATCH)\n", pattern, data);
#endif
return !strcmp(pattern, data); /* 1 on match, 0 on fail */
- }
+ }
if (ld == 0 || !strncasecmp(pattern, data, ld)) { /* partial or full match */
#ifdef NEED_DEBUG_HERE
ast_log(LOG_NOTICE,"return (mode(%d) == E_MATCHMORE ? lp(%d) > ld(%d) : 1)\n", mode, lp, ld);
@@ -2296,12 +2308,12 @@
break;
case '.': /* Must match, even with more digits */
#ifdef NEED_DEBUG_HERE
- ast_log(LOG_NOTICE,"return (1) when '.' is matched\n");
+ ast_log(LOG_NOTICE, "return (1) when '.' is matched\n");
#endif
return 1;
case '!': /* Early match */
#ifdef NEED_DEBUG_HERE
- ast_log(LOG_NOTICE,"return (2) when '!' is matched\n");
+ ast_log(LOG_NOTICE, "return (2) when '!' is matched\n");
#endif
return 2;
case ' ':
@@ -2311,39 +2323,38 @@
default:
if (*data != *pattern) {
#ifdef NEED_DEBUG_HERE
- ast_log(LOG_NOTICE,"return (0) when *data(%c) != *pattern(%c)\n", *data, *pattern);
+ ast_log(LOG_NOTICE, "return (0) when *data(%c) != *pattern(%c)\n", *data, *pattern);
#endif
return 0;
}
-
}
data++;
pattern++;
}
if (*data) /* data longer than pattern, no match */ {
#ifdef NEED_DEBUG_HERE
- ast_log(LOG_NOTICE,"return (0) when data longer than pattern\n");
+ ast_log(LOG_NOTICE, "return (0) when data longer than pattern\n");
#endif
return 0;
}
-
+
/*
* match so far, but ran off the end of the data.
* Depending on what is next, determine match or not.
*/
if (*pattern == '\0' || *pattern == '/') { /* exact match */
#ifdef NEED_DEBUG_HERE
- ast_log(LOG_NOTICE,"at end, return (%d) in 'exact match'\n", (mode==E_MATCHMORE) ? 0 : 1);
+ ast_log(LOG_NOTICE, "at end, return (%d) in 'exact match'\n", (mode==E_MATCHMORE) ? 0 : 1);
#endif
return (mode == E_MATCHMORE) ? 0 : 1; /* this is a failure for E_MATCHMORE */
} else if (*pattern == '!') { /* early match */
#ifdef NEED_DEBUG_HERE
- ast_log(LOG_NOTICE,"at end, return (2) when '!' is matched\n");
+ ast_log(LOG_NOTICE, "at end, return (2) when '!' is matched\n");
#endif
return 2;
} else { /* partial match */
#ifdef NEED_DEBUG_HERE
- ast_log(LOG_NOTICE,"at end, return (%d) which deps on E_MATCH\n", (mode == E_MATCH) ? 0 : 1);
+ ast_log(LOG_NOTICE, "at end, return (%d) which deps on E_MATCH\n", (mode == E_MATCH) ? 0 : 1);
#endif
return (mode == E_MATCH) ? 0 : 1; /* this is a failure for E_MATCH */
}
@@ -2357,8 +2368,9 @@
{
int i;
static int prof_id = -2; /* marker for 'unallocated' id */
- if (prof_id == -2)
+ if (prof_id == -2) {
prof_id = ast_add_profile("ext_match", 0);
+ }
ast_mark(prof_id, 1);
i = _extension_match_core(pattern, data, mode);
ast_mark(prof_id, 0);
@@ -2379,18 +2391,18 @@
struct fake_context /* this struct is purely for matching in the hashtab */
{
- ast_rwlock_t lock;
- struct ast_exten *root;
- struct ast_hashtab *root_table;
- struct match_char *pattern_tree;
- struct ast_context *next;
- struct ast_include *includes;
- struct ast_ignorepat *ignorepats;
+ ast_rwlock_t lock;
+ struct ast_exten *root;
+ struct ast_hashtab *root_table;
+ struct match_char *pattern_tree;
+ struct ast_context *next;
+ struct ast_include *includes;
+ struct ast_ignorepat *ignorepats;
const char *registrar;
int refcount;
- AST_LIST_HEAD_NOLOCK(, ast_sw) alts;
- ast_mutex_t macrolock;
- char name[256];
+ AST_LIST_HEAD_NOLOCK(, ast_sw) alts;
+ ast_mutex_t macrolock;
+ char name[256];
};
struct ast_context *ast_context_find(const char *name)
@@ -2405,8 +2417,9 @@
tmp = ast_hashtab_lookup(contexts_table,&item);
} else {
while ( (tmp = ast_walk_contexts(tmp)) ) {
- if (!name || !strcasecmp(name, tmp->name))
+ if (!name || !strcasecmp(name, tmp->name)) {
break;
+ }
}
}
ast_unlock_contexts();
@@ -2424,8 +2437,9 @@
/* If the Caller*ID pattern is empty, then we're matching NO Caller*ID, so
failing to get a number should count as a match, otherwise not */
- if (ast_strlen_zero(callerid))
+ if (ast_strlen_zero(callerid)) {
return ast_strlen_zero(cidpattern) ? 1 : 0;
+ }
return ast_extension_match(cidpattern, callerid);
}
@@ -2447,7 +2461,7 @@
pattern.label = label;
pattern.priority = priority;
#ifdef NEED_DEBUG_HERE
- ast_log(LOG_NOTICE,"Looking for cont/ext/prio/label/action = %s/%s/%d/%s/%d\n", context, exten, priority, label, (int)action);
+ ast_log(LOG_NOTICE, "Looking for cont/ext/prio/label/action = %s/%s/%d/%s/%d\n", context, exten, priority, label, (int) action);
#endif
/* Initialize status if appropriate */
@@ -2467,9 +2481,9 @@
return NULL;
}
- if (bypass) /* bypass means we only look there */
+ if (bypass) { /* bypass means we only look there */
tmp = bypass;
- else { /* look in contexts */
+ } else { /* look in contexts */
struct fake_context item;
ast_copy_string(item.name, context, sizeof(item.name));
@@ -2478,34 +2492,34 @@
#ifdef NOTNOW
tmp = NULL;
while ((tmp = ast_walk_contexts(tmp)) ) {
- if (!strcmp(tmp->name, context))
+ if (!strcmp(tmp->name, context)) {
break;
+ }
}
#endif
- if (!tmp)
+ if (!tmp) {
return NULL;
-
+ }
}
if (q->status < STATUS_NO_EXTENSION)
q->status = STATUS_NO_EXTENSION;
-
+
/* Do a search for matching extension */
eroot = NULL;
score.total_specificity = 0;
score.exten = 0;
score.total_length = 0;
- if (!tmp->pattern_tree && tmp->root_table)
- {
+ if (!tmp->pattern_tree && tmp->root_table) {
create_match_char_tree(tmp);
#ifdef NEED_DEBUG
- ast_log(LOG_DEBUG,"Tree Created in context %s:\n", context);
+ ast_log(LOG_DEBUG, "Tree Created in context %s:\n", context);
log_match_char_tree(tmp->pattern_tree," ");
#endif
}
#ifdef NEED_DEBUG
- ast_log(LOG_NOTICE,"The Trie we are searching in:\n");
+ ast_log(LOG_NOTICE, "The Trie we are searching in:\n");
log_match_char_tree(tmp->pattern_tree, ":: ");
#endif
@@ -2571,7 +2585,7 @@
if (extenpatternmatchnew) {
new_find_extension(exten, &score, tmp->pattern_tree, 0, 0, callerid, label, action);
eroot = score.exten;
-
+
if (score.last_char == '!' && action == E_MATCHMORE) {
/* We match an extension ending in '!'.
* The decision in this case is final and is NULL (no match).
@@ -2581,7 +2595,7 @@
#endif
return NULL;
}
-
+
if (!eroot && (action == E_CANMATCH || action == E_MATCHMORE) && score.canmatch_exten) {
q->status = STATUS_SUCCESS;
#ifdef NEED_DEBUG_HERE
@@ -2589,7 +2603,7 @@
#endif
return score.canmatch_exten;
}
-
+
if ((action == E_MATCHMORE || action == E_CANMATCH) && eroot) {
if (score.node) {
struct ast_exten *z = trie_find_next_match(score.node);
@@ -2612,11 +2626,11 @@
return z;
}
#ifdef NEED_DEBUG_HERE
- ast_log(LOG_NOTICE,"Returning CANMATCH/MATCHMORE NULL (no next_match)\n");
[... 1106 lines stripped ...]
More information about the svn-commits
mailing list