From 52e35b96bfc726448eeccae7d43e2807c712b7c5 Mon Sep 17 00:00:00 2001
From: Luigi Rizzo <rizzo@icir.org>
Date: Thu, 11 May 2006 08:00:35 +0000
Subject: [PATCH] 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).

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@26723 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 pbx.c | 57 +++++++++++++++++++++++++++++----------------------------
 1 file changed, 29 insertions(+), 28 deletions(-)

diff --git a/pbx.c b/pbx.c
index b458e17426..12229a7b1d 100644
--- a/pbx.c
+++ b/pbx.c
@@ -945,37 +945,38 @@ static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
 		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 */
-- 
GitLab