[sr-dev] git:master: core/xavp: Consolidate duplicate code. No changes to public interfaces.

Alex Hermann alex at speakup.nl
Fri Apr 22 18:49:40 CEST 2011


Module: sip-router
Branch: master
Commit: 14fb4aac10bf9b6cf70d9b7bf6384f3eec2dd639
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=14fb4aac10bf9b6cf70d9b7bf6384f3eec2dd639

Author: Alex Hermann <alex at speakup.nl>
Committer: Alex Hermann <alex at speakup.nl>
Date:   Fri Mar 25 12:17:46 2011 +0100

core/xavp: Consolidate duplicate code. No changes to public interfaces.

---

 xavp.c |  241 +++++++++++++++++++++++++---------------------------------------
 1 files changed, 93 insertions(+), 148 deletions(-)

diff --git a/xavp.c b/xavp.c
index aac6d21..265729e 100644
--- a/xavp.c
+++ b/xavp.c
@@ -37,6 +37,11 @@ static sr_xavp_t *_xavp_list_head = 0;
 /*! Pointer to XAVP current list */
 static sr_xavp_t **_xavp_list_crt = &_xavp_list_head;
 
+/*! Helper functions */
+static sr_xavp_t *xavp_get_internal(str *name, sr_xavp_t **list, int idx, sr_xavp_t **prv);
+static int xavp_rm_internal(str *name, sr_xavp_t **head, int idx);
+
+
 void xavp_shm_free(void *p)
 {
 	shm_free(p);
@@ -74,13 +79,15 @@ void xavp_free_unsafe(sr_xavp_t *xa)
 	shm_free_unsafe(xa);
 }
 
-sr_xavp_t *xavp_add_value(str *name, sr_xval_t *val, sr_xavp_t **list)
+static sr_xavp_t *xavp_new_value(str *name, sr_xval_t *val)
 {
-	sr_xavp_t *avp=0;
+	sr_xavp_t *avp;
 	int size;
+	unsigned int id;
 
 	if(name==NULL || name->s==NULL || val==NULL)
 		return NULL;
+	id = get_hash1_raw(name->s, name->len);
 
 	size = sizeof(sr_xavp_t) + name->len + 1;
 	if(val->type == SR_XTYPE_STR)
@@ -89,7 +96,7 @@ sr_xavp_t *xavp_add_value(str *name, sr_xval_t *val, sr_xavp_t **list)
 	if(avp==NULL)
 		return NULL;
 	memset(avp, 0, size);
-	avp->id = get_hash1_raw(name->s, name->len);
+	avp->id = id;
 	avp->name.s = (char*)avp + sizeof(sr_xavp_t);
 	memcpy(avp->name.s, name->s, name->len);
 	avp->name.s[name->len] = '\0';
@@ -102,6 +109,19 @@ sr_xavp_t *xavp_add_value(str *name, sr_xval_t *val, sr_xavp_t **list)
 		avp->val.v.s.s[val->v.s.len] = '\0';
 		avp->val.v.s.len = val->v.s.len;
 	}
+
+	return avp;
+}
+
+sr_xavp_t *xavp_add_value(str *name, sr_xval_t *val, sr_xavp_t **list)
+{
+	sr_xavp_t *avp=0;
+
+	avp = xavp_new_value(name, val);
+	if (avp==NULL)
+		return NULL;
+
+	/* Prepend new value to the list */
 	if(list) {
 		avp->next = *list;
 		*list = avp;
@@ -115,99 +135,39 @@ sr_xavp_t *xavp_add_value(str *name, sr_xval_t *val, sr_xavp_t **list)
 
 sr_xavp_t *xavp_set_value(str *name, int idx, sr_xval_t *val, sr_xavp_t **list)
 {
-	sr_xavp_t *avp=0;
+	sr_xavp_t *avp;
+	sr_xavp_t *cur;
 	sr_xavp_t *prv=0;
-	sr_xavp_t *tmp=0;
-	unsigned int id;
-	int size;
-	int n=0;
 
-	if(name==NULL || name->s==NULL || val==NULL)
+	if(val==NULL)
 		return NULL;
 
-	id = get_hash1_raw(name->s, name->len);
-	if(list)
-		avp = *list;
-	else
-		avp=*_xavp_list_crt;
-	while(avp)
-	{
-		if(avp->id==id && avp->name.len==name->len
-				&& strncmp(avp->name.s, name->s, name->len)==0)
-		{
-			if(idx==n)
-				break;
-			n++;
-		}
-		prv = avp;
-		avp=avp->next;
-	}
-	if(avp==NULL)
+	/* Find the current value */
+	cur = xavp_get_internal(name, list, idx, &prv);
+	if(cur==NULL)
 		return NULL;
-	tmp = avp;
 
-	size = sizeof(sr_xavp_t) + name->len + 1;
-	if(val->type == SR_XTYPE_STR)
-		size += val->v.s.len + 1;
-	avp = (sr_xavp_t*)shm_malloc(size);
-	if(avp==NULL)
+	avp = xavp_new_value(name, val);
+	if (avp==NULL)
 		return NULL;
-	memset(avp, 0, size);
-	avp->id = get_hash1_raw(name->s, name->len);
-	avp->name.s = (char*)avp + sizeof(sr_xavp_t);
-	memcpy(avp->name.s, name->s, name->len);
-	avp->name.s[name->len] = '\0';
-	avp->name.len = name->len;
-	memcpy(&avp->val, val, sizeof(sr_xval_t));
-	if(val->type == SR_XTYPE_STR)
-	{
-		avp->val.v.s.s = avp->name.s + avp->name.len + 1;
-		memcpy(avp->val.v.s.s, val->v.s.s, val->v.s.len);
-		avp->val.v.s.s[val->v.s.len] = '\0';
-		avp->val.v.s.len = val->v.s.len;
-	}
-	avp->next = tmp->next;
-	if(prv) {
-		prv->next = avp;
-	} else {
-		if(list) {
-			*list = avp;
-		} else {
-			*_xavp_list_crt = avp;
-		}
-	}
-	xavp_free(tmp);
-
-	return avp;
-}
-
-sr_xavp_t *xavp_get(str *name, sr_xavp_t *start)
-{
-	sr_xavp_t *avp=0;
-	unsigned int id;
 
-	if(name==NULL || name->s==NULL)
-		return NULL;
-	id = get_hash1_raw(name->s, name->len);
-	
-	if(start)
-		avp = start;
+	/* Replace the current value with the new */
+	avp->next = cur->next;
+	if(prv)
+		prv->next = avp;
+	else if(list)
+		*list = avp;
 	else
-		avp=*_xavp_list_crt;
-	while(avp)
-	{
-		if(avp->id==id && avp->name.len==name->len
-				&& strncmp(avp->name.s, name->s, name->len)==0)
-			return avp;
-		avp=avp->next;
-	}
+		*_xavp_list_crt = avp;
 
-	return NULL;
+	xavp_free(cur);
+
+	return avp;
 }
 
-sr_xavp_t *xavp_get_by_index(str *name, int idx, sr_xavp_t **start)
+static sr_xavp_t *xavp_get_internal(str *name, sr_xavp_t **list, int idx, sr_xavp_t **prv)
 {
-	sr_xavp_t *avp=0;
+	sr_xavp_t *avp;
 	unsigned int id;
 	int n = 0;
 
@@ -215,10 +175,10 @@ sr_xavp_t *xavp_get_by_index(str *name, int idx, sr_xavp_t **start)
 		return NULL;
 	id = get_hash1_raw(name->s, name->len);
 	
-	if(start)
-		avp = *start;
+	if(list && *list)
+		avp = *list;
 	else
-		avp=*_xavp_list_crt;
+		avp = *_xavp_list_crt;
 	while(avp)
 	{
 		if(avp->id==id && avp->name.len==name->len
@@ -228,16 +188,26 @@ sr_xavp_t *xavp_get_by_index(str *name, int idx, sr_xavp_t **start)
 				return avp;
 			n++;
 		}
-		avp=avp->next;
+		if(prv)
+			*prv = avp;
+		avp = avp->next;
 	}
-
 	return NULL;
 }
 
+sr_xavp_t *xavp_get(str *name, sr_xavp_t *start)
+{
+	return xavp_get_internal(name, &start, 0, NULL);
+}
+
+sr_xavp_t *xavp_get_by_index(str *name, int idx, sr_xavp_t **start)
+{
+	return xavp_get_internal(name, start, idx, NULL);
+}
 
 sr_xavp_t *xavp_get_next(sr_xavp_t *start)
 {
-	sr_xavp_t *avp=0;
+	sr_xavp_t *avp;
 
 	if(start==NULL)
 		return NULL;
@@ -257,7 +227,7 @@ sr_xavp_t *xavp_get_next(sr_xavp_t *start)
 
 int xavp_rm(sr_xavp_t *xa, sr_xavp_t **head)
 {
-	sr_xavp_t *avp=0;
+	sr_xavp_t *avp;
 	sr_xavp_t *prv=0;
 
 	if(head!=NULL)
@@ -271,11 +241,10 @@ int xavp_rm(sr_xavp_t *xa, sr_xavp_t **head)
 		{
 			if(prv)
 				prv->next=avp->next;
+			else if(head!=NULL)
+				*head = avp->next;
 			else
-				if(head!=NULL)
-					*head = avp->next;
-				else
-					*_xavp_list_crt = avp->next;
+				*_xavp_list_crt = avp->next;
 			xavp_free(avp);
 			return 1;
 		}
@@ -284,14 +253,19 @@ int xavp_rm(sr_xavp_t *xa, sr_xavp_t **head)
 	return 0;
 }
 
-
-int xavp_rm_by_name(str *name, int all, sr_xavp_t **head)
+/* Remove xavps
+ * idx: <0 remove all xavps with the same name
+ *      >=0 remove only the specified index xavp
+ * Returns number of xavps that were deleted
+ */
+static int xavp_rm_internal(str *name, sr_xavp_t **head, int idx)
 {
-	sr_xavp_t *avp=0;
-	sr_xavp_t *foo=0;
+	sr_xavp_t *avp;
+	sr_xavp_t *foo;
 	sr_xavp_t *prv=0;
-	unsigned int id = 0;
+	unsigned int id;
 	int n=0;
+	int count=0;
 
 	if(name==NULL || name->s==NULL)
 		return 0;
@@ -300,7 +274,7 @@ int xavp_rm_by_name(str *name, int all, sr_xavp_t **head)
 	if(head!=NULL)
 		avp = *head;
 	else
-		avp=*_xavp_list_crt;
+		avp = *_xavp_list_crt;
 	while(avp)
 	{
 		foo = avp;
@@ -308,72 +282,43 @@ int xavp_rm_by_name(str *name, int all, sr_xavp_t **head)
 		if(foo->id==id && foo->name.len==name->len
 				&& strncmp(foo->name.s, name->s, name->len)==0)
 		{
-			if(prv!=NULL)
-				prv->next=foo->next;
-			else
-				if(head!=NULL)
+			if(idx<0 || idx==n)
+			{
+				if(prv!=NULL)
+					prv->next=foo->next;
+				else if(head!=NULL)
 					*head = foo->next;
 				else
 					*_xavp_list_crt = foo->next;
-			xavp_free(foo);
+				xavp_free(foo);
+				if(idx>=0)
+					return 1;
+				count++;
+			}
 			n++;
-			if(all==0)
-				return n;
 		} else {
 			prv = foo;
 		}
 	}
-	return n;
+	return count;
 }
 
-int xavp_rm_by_index(str *name, int idx, sr_xavp_t **head)
+int xavp_rm_by_name(str *name, int all, sr_xavp_t **head)
 {
-	sr_xavp_t *avp=0;
-	sr_xavp_t *foo=0;
-	sr_xavp_t *prv=0;
-	unsigned int id = 0;
-	int n=0;
+	return xavp_rm_internal(name, head, -1*all);
+}
 
-	if(name==NULL || name->s==NULL)
-		return 0;
-	if(idx<0)
+int xavp_rm_by_index(str *name, int idx, sr_xavp_t **head)
+{
+	if (idx<0)
 		return 0;
-
-	id = get_hash1_raw(name->s, name->len);
-	if(head!=NULL)
-		avp = *head;
-	else
-		avp=*_xavp_list_crt;
-	while(avp)
-	{
-		foo = avp;
-		avp=avp->next;
-		if(foo->id==id && foo->name.len==name->len
-				&& strncmp(foo->name.s, name->s, name->len)==0)
-		{
-			if(idx==n)
-			{
-				if(prv!=NULL)
-					prv->next=foo->next;
-				else
-					if(head!=NULL)
-						*head = foo->next;
-					else
-						*_xavp_list_crt = foo->next;
-				xavp_free(foo);
-				return 1;
-			}
-			n++;
-		}
-		prv = foo;
-	}
-	return 0;
+	return xavp_rm_internal(name, head, idx);
 }
 
 
 int xavp_count(str *name, sr_xavp_t **start)
 {
-	sr_xavp_t *avp=0;
+	sr_xavp_t *avp;
 	unsigned int id;
 	int n = 0;
 




More information about the sr-dev mailing list