[svn-commits] trunk r26723 - /trunk/pbx.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Thu May 11 01:00:35 MST 2006


Author: rizzo
Date: Thu May 11 03:00:35 2006
New Revision: 26723

URL: http://svn.digium.com/view/asterisk?rev=26723&view=rev
Log:
normalize the code to navigate through extensions and priorities
(use the walk_*() routines so we don't use the link fields
directly, and slightly restructure the blocks to reduce
the nesting depth).


Modified:
    trunk/pbx.c

Modified: trunk/pbx.c
URL: http://svn.digium.com/view/asterisk/trunk/pbx.c?rev=26723&r1=26722&r2=26723&view=diff
==============================================================================
--- trunk/pbx.c (original)
+++ trunk/pbx.c Thu May 11 03:00:35 2006
@@ -945,37 +945,38 @@
 		q->status = STATUS_NO_EXTENSION;
 
 	/* scan the list trying to match extension and CID */
-	for (eroot = tmp->root; eroot; eroot = eroot->next) {
+	eroot = NULL;
+	while ( (eroot = ast_walk_context_extensions(tmp, eroot)) ) {
 		int match = extension_match_core(eroot->exten, exten, action);
 		/* 0 on fail, 1 on match, 2 on earlymatch */
 
-		if (match && (!eroot->matchcid || matchcid(eroot->cidmatch, callerid))) {
-			if (match == 2 && action == E_MATCHMORE) {
-				/* We match an extension ending in '!'.
-				 * The decision in this case is final and is NULL (no match).
-				 */
-				return NULL;
-			} else {
-				if (q->status < STATUS_NO_PRIORITY)
-					q->status = STATUS_NO_PRIORITY;
-				/* now look for the right priority */
-				for (e = eroot; e; e = e->peer) {
-					/* Match priority */
-					if (action == E_FINDLABEL) {
-						if (q->status < STATUS_NO_LABEL)
-							q->status = STATUS_NO_LABEL;
-						if (label && e->label && !strcmp(label, e->label)) {
-							q->status = STATUS_SUCCESS;
-							q->foundcontext = context;
-							return e;
-						}
-					} else if (e->priority == priority) {
-						q->status = STATUS_SUCCESS;
-						q->foundcontext = context;
-						return e;
-					}
-				}
-			}
+		if (!match || (eroot->matchcid && matchcid(eroot->cidmatch, callerid)))
+			continue;	/* keep trying */
+		if (match == 2 && action == E_MATCHMORE) {
+			/* We match an extension ending in '!'.
+			 * The decision in this case is final and is NULL (no match).
+			 */
+			return NULL;
+		}
+		/* found entry, now look for the right priority */
+		if (q->status < STATUS_NO_PRIORITY)
+			q->status = STATUS_NO_PRIORITY;
+		e = NULL;
+		while ( (e = ast_walk_extension_priorities(eroot, e)) ) {
+			/* Match label or priority */
+			if (action == E_FINDLABEL) {
+				if (q->status < STATUS_NO_LABEL)
+					q->status = STATUS_NO_LABEL;
+				if (label && e->label && !strcmp(label, e->label))
+					break;	/* found it */
+			} else if (e->priority == priority) {
+				break;	/* found it */
+			} /* else keep searching */
+		}
+		if (e) {	/* found a valid match */
+			q->status = STATUS_SUCCESS;
+			q->foundcontext = context;
+			return e;
 		}
 	}
 	/* Check alternative switches */



More information about the svn-commits mailing list