[Asterisk-cvs] asterisk pbx.c,1.220,1.221

kpfleming at lists.digium.com kpfleming at lists.digium.com
Sun Apr 3 16:39:37 CDT 2005


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv27845

Modified Files:
	pbx.c 
Log Message:
add 'early-match' wildcard for extension patterns (bug #3889)


Index: pbx.c
===================================================================
RCS file: /usr/cvsroot/asterisk/pbx.c,v
retrieving revision 1.220
retrieving revision 1.221
diff -u -d -r1.220 -r1.221
--- pbx.c	1 Apr 2005 19:56:35 -0000	1.220
+++ pbx.c	3 Apr 2005 21:32:33 -0000	1.221
@@ -633,6 +633,9 @@
 		case '.':\
 			/* Must match */\
 			return 1;\
+		case '+':\
+			/* Early match */\
+			return 2;\
 		case ' ':\
 		case '-':\
 			/* Ignore these characters */\
@@ -645,6 +648,9 @@
 		data++;\
 		pattern++;\
 	}\
+	/* If we ran off the end of the data and the pattern ends in '+', match */\
+	if (match && !*data && (*pattern == '+'))\
+		return 2;\
 }
 
 int ast_extension_match(const char *pattern, const char *data)
@@ -673,8 +679,9 @@
 		return 1;
 	}
 	EXTENSION_MATCH_CORE(data,pattern,match);
-	/* If there's more or we don't care about more, return non-zero, otlherwise it's a miss */
-	if (!needmore || *pattern) {
+	/* If there's more or we don't care about more, or if it's a possible early match, 
+	   return non-zero; otherwise it's a miss */
+	if (!needmore || *pattern || match == 2) {
 		return match;
 	} else
 		return 0;
@@ -754,15 +761,23 @@
 	while(tmp) {
 		/* Match context */
 		if (bypass || !strcmp(tmp->name, context)) {
+			struct ast_exten *earlymatch = NULL;
+
 			if (*status < STATUS_NO_EXTENSION)
 				*status = STATUS_NO_EXTENSION;
-			eroot = tmp->root;
-			while(eroot) {
+			for (eroot = tmp->root; eroot; eroot=eroot->next) {
+				int match = 0;
 				/* Match extension */
 				if ((((action != HELPER_MATCHMORE) && ast_extension_match(eroot->exten, exten)) ||
-						((action == HELPER_CANMATCH) && (ast_extension_close(eroot->exten, exten, 0))) ||
-						((action == HELPER_MATCHMORE) && (ast_extension_close(eroot->exten, exten, 1)))) &&
-						(!eroot->matchcid || matchcid(eroot->cidmatch, callerid))) {
+				     ((action == HELPER_CANMATCH) && (ast_extension_close(eroot->exten, exten, 0))) ||
+				     ((action == HELPER_MATCHMORE) && (match = ast_extension_close(eroot->exten, exten, 1)))) &&
+				    (!eroot->matchcid || matchcid(eroot->cidmatch, callerid))) {
+
+					if (action == HELPER_MATCHMORE && match == 2 && !earlymatch) {
+						/* It matched an extension ending in a '+' wildcard
+						   So ignore it for now, unless there's a better match */
+						earlymatch = eroot;
+					} else {
 						e = eroot;
 						if (*status < STATUS_NO_PRIORITY)
 							*status = STATUS_NO_PRIORITY;
@@ -783,8 +798,15 @@
 							}
 							e = e->peer;
 						}
+					}
 				}
-				eroot = eroot->next;
+			}
+			if (earlymatch) {
+				/* Bizarre logic for HELPER_MATCHMORE. We return zero to break out 
+				   of the loop waiting for more digits, and _then_ match (normally)
+				   the extension we ended up with. We got an early-matching wildcard
+				   pattern, so return NULL to break out of the loop. */
+				return NULL;
 			}
 			/* Check alternative switches */
 			sw = tmp->alts;




More information about the svn-commits mailing list