[Freeswitch-svn] [commit] r3329 - freeswitch/branches/knhor/trunk/src

Freeswitch SVN knhor at freeswitch.org
Sun Nov 12 09:50:39 EST 2006


Author: knhor
Date: Sun Nov 12 09:50:39 2006
New Revision: 3329

Modified:
   freeswitch/branches/knhor/trunk/src/switch_ivr.c

Log:
automatically keep the digit collection to a maximum length determined by the largest digit string added to the hash

Modified: freeswitch/branches/knhor/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/switch_ivr.c	(original)
+++ freeswitch/branches/knhor/trunk/src/switch_ivr.c	Sun Nov 12 09:50:39 2006
@@ -3242,6 +3242,7 @@
 	switch_hash_t *hash;
 	char *digits;
 	char terminator;
+	int maxlen;
 };
 
 SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_new(switch_memory_pool_t *pool, switch_ivr_digit_stream_parser_t **parser)
@@ -3306,7 +3307,12 @@
 {	switch_status_t status = SWITCH_STATUS_FALSE;
 
 	if (parser != NULL && digits != NULL && *digits && parser->hash != NULL) {
+		int len;
+
 		status = switch_core_hash_insert_dup(parser->hash,digits,(void *)action);
+		if (status == SWITCH_STATUS_SUCCESS && parser->terminator == '\0' && (len = strlen(digits)) > parser->maxlen) {
+			parser->maxlen = len;
+		}
 	}
 	if (status != SWITCH_STATUS_SUCCESS) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "unable to add hash for '%s' action: %d\n",digits,action);
@@ -3336,10 +3342,22 @@
 		size_t len = (parser->digits != NULL ? strlen(parser->digits) : 0);
 
 		// if it's not a terminator digit, add it to the collected digits
-		if (parser->terminator != digit) {
-			parser->digits = realloc(parser->digits,len+2);
-			*(parser->digits+(len++)) = digit;
-			*(parser->digits+len) = '\0';
+		if (digit != parser->terminator) {
+			// if collected digits length >= the max length of the keys
+			// in the hash table, then left shift the digit string
+			if ( len > 1 && parser->maxlen != 0 && len >= parser->maxlen) {
+				char *src = parser->digits + 1;
+				char *dst = parser->digits;
+
+				while (*src) {
+					*(dst++) = *(src++);
+				}
+				*dst = digit;
+			} else {
+				parser->digits = realloc(parser->digits,len+2);
+				*(parser->digits+(len++)) = digit;
+				*(parser->digits+len) = '\0';
+			}
 		}
 
 		// if we have digits to test
@@ -3374,6 +3392,7 @@
 
 	if (parser != NULL) {
 		parser->terminator = digit;
+		parser->maxlen = 0;
 		status = SWITCH_STATUS_SUCCESS;
 	}
 



More information about the Freeswitch-svn mailing list