char* pv_xavp_fill_ni(str *in, pv_xavp_name_t *xname) { char *p; str idx; int n; if(in->s==NULL || in->len<=0 || xname==NULL) return NULL; p = in->s; /* eat ws */ while(p<in->s+in->len && (*p==' ' || *p=='\t' || *p=='\n' || *p=='\r')) p++; if(p>in->s+in->len || *p=='\0') goto error; xname->name.s = p; while(p < in->s + in->len) { if(*p=='=' || *p==' ' || *p=='\t' || *p=='\n' || *p=='\r' || *p=='[') break; p++; } xname->name.len = p - xname->name.s; if(p>in->s+in->len || *p=='\0') return p; /* eat ws */ while(p<in->s+in->len && (*p==' ' || *p=='\t' || *p=='\n' || *p=='\r')) p++; if(p>in->s+in->len || *p=='\0') return p; if(*p!='[') return p; /* there is index */ p++; idx.s = p; n = 0; while(p<in->s+in->len && *p!='\0') { if(*p==']') { if(n==0) break; n--; } if(*p == '[') n++; p++; } if(p>in->s+in->len || *p=='\0') goto error; if(p==idx.s) { LM_ERR("xavp [\"%.*s\"] does not get empty index param\n", in->len, in->s); goto error; } idx.len = p - idx.s; if(pv_parse_index(&xname->index, &idx)!=0) { LM_ERR("idx \"%.*s\" has an invalid index param [%.*s]\n", in->len, in->s, idx.len, idx.s); goto error; } xname->index.type = PVT_EXTRA; p++; return p; error: return NULL; }
int pv_xbuff_parse_name(pv_spec_t *sp, str *in) { char *p; str idx; str name; str attr; int l; if (in->s == NULL || in->len <= 0) return -1; p = in->s; name.s = p; while (is_in_str(p, in)) { if (*p == '[' || *p== '=') break; if (!is_pv_xbuff_valid_char(*p)) { l = p-in->s; LM_ERR("invalid character in var name %.*s at %d\n",STR_FMT(in),l); goto error; } p++; } /* from in->s to p */ name.len = p - in->s; if (pv_parse_avp_name(sp,&name)) goto error; if (is_in_str(p,in) && *p =='[') { idx.s=++p; while (is_in_str(p,in)) { if (*p == ']' || *p == '=') break; p++; } if (is_in_str(p,in) && *p==']') { idx.len = p - idx.s; if (pv_parse_index(sp,&idx)) goto error; } p++; } else { xbuff_set_attr_flag(sp->pvp.pvi.type,XBUFF_NO_IDX); } if (is_in_str(p,in) && *p =='=') { p++; if (!is_in_str(p,in) || *p!='>') { l = p-in->s; LM_ERR("invalid operator (expected =>) for accessing attribute in token %.*s at position %d\n",STR_FMT(in),l); goto error; } attr.s = ++p; while (is_in_str(p,in)) { if (!is_pv_xbuff_valid_char(*p)) { l = p-in->s; LM_ERR("invalid character in attribute name in token %.*s at %d\n",STR_FMT(in),l); goto error; } p++; } attr.len = p - attr.s; if (attr.len > 0 ) { if (STR_EQ(attr,xbuff_attr_name(XBUFF_ATTR_TYPE))) { xbuff_set_attr_flag(sp->pvp.pvi.type,XBUFF_ATTR_TYPE); } else if (STR_EQ(attr,xbuff_attr_name(XBUFF_ATTR_FORMAT))) { xbuff_set_attr_flag(sp->pvp.pvi.type,XBUFF_ATTR_FORMAT); } else if (STR_EQ(attr,xbuff_attr_name(XBUFF_ATTR_LENGTH))) { xbuff_set_attr_flag(sp->pvp.pvi.type,XBUFF_ATTR_LENGTH); } else { LM_ERR("unknown attribute %.*s\n",STR_FMT(&attr)); goto error; } if (sp->pvp.pvi.type & PV_IDX_ALL) { LM_ERR("index [*] (all) isn't compatible with attribute %.*s\n",STR_FMT(&attr)); goto error; } } } if (p < in->s + in->len) { l = p-in->s; LM_ERR("unexpected token in %.*s at %d\n",STR_FMT(in),l); goto error; } return 0; error: return -1; }