Module: sip-router Branch: master Commit: 288e2739da28251e12086b52358c3a0d18e91fa5 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=288e2739da28251e12086b52358c3a0d18e91fa5
Author: Victor Seva <[email protected]> Committer: Daniel-Constantin Mierla <[email protected]> Date: Mon Apr 22 10:46:17 2013 +0200 core[xavp]: Added helper function to get a list of keys from a xavp variable. --- xavp.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ xavp.h | 2 ++ 2 files changed, 64 insertions(+), 0 deletions(-) diff --git a/xavp.c b/xavp.c index 6c8566d..adce5d1 100644 --- a/xavp.c +++ b/xavp.c @@ -27,6 +27,7 @@ #include <stdio.h> #include <string.h> +#include "mem/mem.h" #include "mem/shm_mem.h" #include "dprint.h" #include "hashes.h" @@ -538,6 +539,67 @@ void xavp_print_list(sr_xavp_t **head) } /** + * returns a list of str with key names. + * Example: + * If we have this structure + * $xavp(test=>one) = 1 + * $xavp(test[0]=>two) = "2" + * $xavp(test[0]=>three) = 3 + * $xavp(test[0]=>four) = $xavp(whatever) + * + * xavp_get_list_keys_names(test[0]) returns + * {"one", "two", "three", "four"} + */ +struct str_list *xavp_get_list_key_names(sr_xavp_t *xavp) +{ + sr_xavp_t *avp = NULL; + struct str_list *result = NULL; + struct str_list *r = NULL; + int total = 0; + + if(xavp==NULL){ + LM_ERR("xavp is NULL\n"); + return 0; + } + + if(xavp->val.type!=SR_XTYPE_XAVP){ + LM_ERR("%s not xavp?\n", xavp->name.s); + return 0; + } + + avp = xavp->val.v.xavp; + + if (avp) + { + result = (struct str_list*)pkg_malloc(sizeof(struct str_list)); + if (result==NULL) { + PKG_MEM_ERROR; + return 0; + } + r = result; + r->s.s = avp->name.s; + r->s.len = avp->name.len; + r->next = NULL; + avp = avp->next; + } + + while(avp) + { + r = append_str_list(avp->name.s, avp->name.len, &r, &total); + if(r==NULL){ + while(result){ + r = result; + result = result->next; + pkg_free(r); + } + return 0; + } + avp = avp->next; + } + return result; +} + +/** * clone the xavp without values that are custom data * - only one list level is cloned, other sublists are ignored */ diff --git a/xavp.h b/xavp.h index b581c08..7d5d517 100644 --- a/xavp.h +++ b/xavp.h @@ -29,6 +29,7 @@ #include <time.h> #include "str.h" +#include "str_list.h" struct _sr_xavp; @@ -95,6 +96,7 @@ void xavp_destroy_list(sr_xavp_t **head); void xavp_reset_list(void); sr_xavp_t **xavp_set_list(sr_xavp_t **head); sr_xavp_t **xavp_get_crt_list(void); +struct str_list *xavp_get_list_key_names(sr_xavp_t *xavp); int xavp_insert(sr_xavp_t *xavp, int idx, sr_xavp_t **list); sr_xavp_t *xavp_extract(str *name, sr_xavp_t **list); _______________________________________________ sr-dev mailing list [email protected] http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
