/*! * \brief Destroy transformation including eventual parameter * \param t transformation */ void tr_destroy(trans_t *t) { tr_param_t *tp; tr_param_t *tp0; if(t==NULL) return; tp = t->params; while(tp) { tp0 = tp; tp = tp->next; tr_param_free(tp0); } memset(t, 0, sizeof(trans_t)); }
/*! * \brief Helper fuction to parse a kazoo transformation * \param in parsed string * \param t transformation * \return pointer to the end of the transformation in the string - '}', null on error */ char* kz_tr_parse(str* in, trans_t *t) { char *p; char *p0; char *ps; str name; str s; pv_spec_t *spec = NULL; tr_param_t *tp = NULL; if(in==NULL || t==NULL) return NULL; p = in->s; name.s = in->s; t->type = TR_KAZOO; t->trf = kz_tr_eval; /* find next token */ while(is_in_str(p, in) && *p!=TR_PARAM_MARKER && *p!=TR_RBRACKET) p++; if(*p=='\0') { LM_ERR("invalid transformation: %.*s\n", in->len, in->s); goto error; } name.len = p - name.s; trim(&name); if(name.len==6 && strncasecmp(name.s, "encode", 6)==0) { t->subtype = TR_KAZOO_ENCODE; goto done; } else if(name.len==4 && strncasecmp(name.s, "json", 4)==0) { t->subtype = TR_KAZOO_JSON; if(*p!=TR_PARAM_MARKER) { LM_ERR("invalid json transformation: %.*s!\n", in->len, in->s); goto error; } p++; _kz_tr_parse_sparam(p, p0, tp, spec, ps, in, s); t->params = tp; tp = 0; while(*p && (*p==' ' || *p=='\t' || *p=='\n')) p++; if(*p!=TR_RBRACKET) { LM_ERR("invalid json transformation: %.*s!!\n", in->len, in->s); goto error; } goto done; } LM_ERR("unknown kazoo transformation: %.*s/%.*s/%d!\n", in->len, in->s, name.len, name.s, name.len); error: if(tp) tr_param_free(tp); if(spec) pv_spec_free(spec); return NULL; done: t->name = name; return p; }