Module: sip-router Branch: master Commit: 14fb4aac10bf9b6cf70d9b7bf6384f3eec2dd639 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=14fb4aac...
Author: Alex Hermann alex@speakup.nl Committer: Alex Hermann alex@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;