[svn-commits] mmichelson: branch mmichelson/npm_fixes r181015 - /team/mmichelson/npm_fixes/...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Mar 10 18:14:05 CDT 2009


Author: mmichelson
Date: Tue Mar 10 18:14:01 2009
New Revision: 181015

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=181015
Log:
Remove some comments. Change allocation scheme for match_char struct.


Modified:
    team/mmichelson/npm_fixes/main/pbx.c

Modified: team/mmichelson/npm_fixes/main/pbx.c
URL: http://svn.digium.com/svn-view/asterisk/team/mmichelson/npm_fixes/main/pbx.c?view=diff&rev=181015&r1=181014&r2=181015
==============================================================================
--- team/mmichelson/npm_fixes/main/pbx.c (original)
+++ team/mmichelson/npm_fixes/main/pbx.c Tue Mar 10 18:14:01 2009
@@ -818,11 +818,11 @@
 {
 	int is_pattern; /* the pattern started with '_' */
 	int deleted;    /* if this is set, then... don't return it */
-	char *x;       /* the pattern itself-- matches a single char */
 	int specificity; /* simply the strlen of x, or 10 for X, 9 for Z, and 8 for N; and '.' and '!' will add 11 ? */
 	struct match_char *alt_char;
 	struct match_char *next_char;
 	struct ast_exten *exten; /* attached to last char of a pattern for exten */
+	char x[1];       /* the pattern itself-- matches a single char */
 };
 
 struct scoreboard  /* make sure all fields are 0 before calling new_find_extension */
@@ -1825,13 +1825,14 @@
 {
 	struct match_char *m;
 	
-	if (!(m = ast_calloc(1, sizeof(*m))))
+	if (!(m = ast_calloc(1, sizeof(*m) + strlen(pattern)))) {
 		return NULL;
-
-	if (!(m->x = ast_strdup(pattern))) {
-		ast_free(m);
-		return NULL;
-	}
+	}
+
+	/* strcpy is safe here since we know its size and have allocated
+	 * just enough space for when we allocated m
+	 */
+	strcpy(m->x, pattern);
 
 	/* the specificity scores are the same as used in the old
 	   pattern matcher. */
@@ -1956,11 +1957,6 @@
 		}
 		m2 = 0;
 		if (already && (m2=already_in_tree(m1,buf,pattern)) && m2->next_char) {
-			/* XXX MCM - I think it makes sense to check if m2->exten is non-NULL. If it is
-			 * then it means we've found a duplicate extension. In this particular scenario, what
-			 * we do is overwrite what was previously in m2 with what we are now parsing. At least
-			 * this weird logic is consistent (see further down).
-			 */
 			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 (m2->exten) {
@@ -1972,22 +1968,10 @@
 			m1 = m2->next_char; /* m1 points to the node to compare against */
 			m0 = &m2->next_char; /* m0 points to the ptr that points to m1 */
 		} else { /* not already OR not m2 OR nor m2->next_char */
-			/* XXX MCM - if (m2) means that 'already' is true and that this exten already
-			 * exists in the trie. It also means that m2->next_char is NULL, meaning we have
-			 * found a duplicate extension. Logic appears to show that we point the new
-			 * match_char to the existing one. If we're at the end of the current exten, then
-			 * we will end up overwriting the exten currently in m2
-			 */
 			if (m2) {
 				if (findonly)
 					return m2;
 				m1 = m2; /* while m0 stays the same */
-			/* XXX MCM - This else means that m2 is NULL. This could mean that either 'already'
-			 * is false or that m2 did not already exist in the tree. In either case it means
-			 * that we are dealing with a pattern not previously existing in the tree and we
-			 * need to add a new node to the tree. Adding a new node does not necessarily indicate
-			 * that we are adding a new exten.
-			 */
 			} else {
 				if (findonly)
 					return m1;
@@ -2058,8 +2042,6 @@
 		pattern_tree->next_char = 0;
 	}
 	pattern_tree->exten = 0; /* never hurts to make sure there's no pointers laying around */
-	if (pattern_tree->x)
-		free(pattern_tree->x);
 	free(pattern_tree);
 }
 




More information about the svn-commits mailing list