[Freeswitch-svn] [commit] r10227 - in freeswitch/trunk/src: . include

Freeswitch SVN anthm at freeswitch.org
Mon Nov 3 15:08:44 EST 2008


Author: anthm
Date: Mon Nov  3 15:08:44 2008
New Revision: 10227

Modified:
   freeswitch/trunk/src/include/switch_apr.h
   freeswitch/trunk/src/include/switch_event.h
   freeswitch/trunk/src/include/switch_utils.h
   freeswitch/trunk/src/switch_apr.c
   freeswitch/trunk/src/switch_event.c

Log:
add hashing to event header lookup

Modified: freeswitch/trunk/src/include/switch_apr.h
==============================================================================
--- freeswitch/trunk/src/include/switch_apr.h	(original)
+++ freeswitch/trunk/src/include/switch_apr.h	Mon Nov  3 15:08:44 2008
@@ -202,6 +202,8 @@
  */
 SWITCH_DECLARE(unsigned int) switch_hashfunc_default(const char *key, switch_ssize_t *klen);
 
+SWITCH_DECLARE(unsigned int) switch_ci_hashfunc_default(const char *char_key, switch_ssize_t *klen);
+
 
  /**
  * @defgroup switch_time Time Routines

Modified: freeswitch/trunk/src/include/switch_event.h
==============================================================================
--- freeswitch/trunk/src/include/switch_event.h	(original)
+++ freeswitch/trunk/src/include/switch_event.h	Mon Nov  3 15:08:44 2008
@@ -67,6 +67,8 @@
 	char *name;
 	/*! the header value */
 	char *value;
+	/*! hash of the header name */
+	unsigned long hash;
 	struct switch_event_header *next;
 };
 

Modified: freeswitch/trunk/src/include/switch_utils.h
==============================================================================
--- freeswitch/trunk/src/include/switch_utils.h	(original)
+++ freeswitch/trunk/src/include/switch_utils.h	Mon Nov  3 15:08:44 2008
@@ -295,6 +295,40 @@
 }
 
 
+static inline char *switch_lc_strdup(const char *it) 
+{
+	char *dup;
+	char *p;
+
+	if (it) {
+		dup = strdup(it);
+		for(p = dup; p && *p; p++) {
+			*p = tolower(*p);
+		}
+		return dup;
+	}
+
+	return NULL;
+}
+
+
+static inline char *switch_uc_strdup(const char *it) 
+{
+	char *dup;
+	char *p;
+
+	if (it) {
+		dup = strdup(it);
+		for(p = dup; p && *p; p++) {
+			*p = toupper(*p);
+		}
+		return dup;
+	}
+
+	return NULL;
+}
+
+
 /*!
   \brief Test if one string is inside another with extra case checking
   \param s the inner string

Modified: freeswitch/trunk/src/switch_apr.c
==============================================================================
--- freeswitch/trunk/src/switch_apr.c	(original)
+++ freeswitch/trunk/src/switch_apr.c	Mon Nov  3 15:08:44 2008
@@ -74,6 +74,30 @@
 	apr_pool_clear(p);
 }
 
+SWITCH_DECLARE(unsigned int) switch_ci_hashfunc_default(const char *char_key, switch_ssize_t *klen)
+														
+{
+    unsigned int hash = 0;
+    const unsigned char *key = (const unsigned char *)char_key;
+    const unsigned char *p;
+    apr_ssize_t i;
+    
+    if (*klen == APR_HASH_KEY_STRING) {
+        for (p = key; *p; p++) {
+            hash = hash * 33 + tolower(*p);
+        }
+        *klen = p - key;
+    }
+    else {
+        for (p = key, i = *klen; i; i--, p++) {
+            hash = hash * 33 + tolower(*p);
+        }
+    }
+
+    return hash;
+}
+
+
 SWITCH_DECLARE(unsigned int) switch_hashfunc_default(const char *key, switch_ssize_t *klen)
 {
 	return apr_hashfunc_default(key, klen);

Modified: freeswitch/trunk/src/switch_event.c
==============================================================================
--- freeswitch/trunk/src/switch_event.c	(original)
+++ freeswitch/trunk/src/switch_event.c	Mon Nov  3 15:08:44 2008
@@ -586,12 +586,17 @@
 SWITCH_DECLARE(char *) switch_event_get_header(switch_event_t *event, const char *header_name)
 {
 	switch_event_header_t *hp;
+	switch_ssize_t hlen = -1;
+	unsigned long hash = 0;
+
 	switch_assert(event);
-	if (!header_name)
-		return NULL;
 
+	if (!header_name) return NULL;
+	
+	hash = switch_ci_hashfunc_default(header_name, &hlen);
+	
 	for (hp = event->headers; hp; hp = hp->next) {
-		if (!strcasecmp(hp->name, header_name)) {
+		if ((!hp->hash || hash == hp->hash) && !strcasecmp(hp->name, header_name) ) {
 			return hp->value;
 		}
 	}
@@ -608,6 +613,9 @@
 	switch_event_header_t *hp, *lp = NULL, *tp;
 	switch_status_t status = SWITCH_STATUS_FALSE;
 	int x = 0;
+	switch_ssize_t hlen = -1;
+	unsigned long hash = 0;
+
 	tp = event->headers;
 	while (tp) {
 		hp = tp;
@@ -615,7 +623,9 @@
 		
 		x++;
 		switch_assert(x < 1000);
-		if (!strcasecmp(header_name, hp->name)) {
+		hash = switch_ci_hashfunc_default(header_name, &hlen);
+
+		if ((!hp->hash || hash == hp->hash) && !strcasecmp(header_name, hp->name)) {
 			if (lp) {
 				lp->next = hp->next;
 			} else {
@@ -642,6 +652,7 @@
 switch_status_t switch_event_base_add_header(switch_event_t *event, switch_stack_t stack, const char *header_name, char *data)
 {
 	switch_event_header_t *header;
+	switch_ssize_t hlen = -1;
 	void *pop;
 
 	if (switch_queue_trypop(EVENT_HEADER_RECYCLE_QUEUE, &pop) == SWITCH_STATUS_SUCCESS) {
@@ -655,7 +666,8 @@
 
 	header->name = DUP(header_name);
 	header->value = data;
-
+	header->hash = switch_ci_hashfunc_default(header->name, &hlen);
+	
 	if (stack == SWITCH_STACK_TOP) {
 		header->next = event->headers;
 		event->headers = header;



More information about the Freeswitch-svn mailing list