| 3989 | } |
| 3990 | |
| 3991 | int pv_parse_index(pv_spec_p sp, const str *in) |
| 3992 | { |
| 3993 | char *p; |
| 3994 | char *s; |
| 3995 | int sign; |
| 3996 | pv_spec_p nsp = 0; |
| 3997 | |
| 3998 | if(in==NULL || in->s==NULL || sp==NULL) |
| 3999 | return -1; |
| 4000 | p = in->s; |
| 4001 | if(*p==PV_MARKER) |
| 4002 | { |
| 4003 | nsp = (pv_spec_p)pkg_malloc(sizeof(pv_spec_t)); |
| 4004 | if(nsp==NULL) |
| 4005 | { |
| 4006 | LM_ERR("no more memory\n"); |
| 4007 | return -1; |
| 4008 | } |
| 4009 | memset(nsp, 0, sizeof(pv_spec_t)); |
| 4010 | s = pv_parse_spec(in, nsp); |
| 4011 | if(s==NULL) |
| 4012 | { |
| 4013 | LM_ERR("invalid index [%.*s]\n", in->len, in->s); |
| 4014 | pv_spec_free(nsp); |
| 4015 | return -1; |
| 4016 | } |
| 4017 | sp->pvp.pvi.type = PV_IDX_PVAR; |
| 4018 | sp->pvp.pvi.u.dval = (void*)nsp; |
| 4019 | return 0; |
| 4020 | } |
| 4021 | if(*p=='*' && in->len==1) |
| 4022 | { |
| 4023 | sp->pvp.pvi.type = PV_IDX_ALL; |
| 4024 | return 0; |
| 4025 | } |
| 4026 | sign = 1; |
| 4027 | if(*p=='-') |
| 4028 | { |
| 4029 | sign = -1; |
| 4030 | p++; |
| 4031 | } |
| 4032 | sp->pvp.pvi.u.ival = 0; |
| 4033 | while(p<in->s+in->len && *p>='0' && *p<='9') |
| 4034 | { |
| 4035 | sp->pvp.pvi.u.ival = sp->pvp.pvi.u.ival * 10 + *p - '0'; |
| 4036 | p++; |
| 4037 | } |
| 4038 | if(p!=in->s+in->len) |
| 4039 | { |
| 4040 | LM_ERR("invalid index [%.*s]\n", in->len, in->s); |
| 4041 | return -1; |
| 4042 | } |
| 4043 | sp->pvp.pvi.u.ival *= sign; |
| 4044 | sp->pvp.pvi.type = PV_IDX_INT; |
| 4045 | |
| 4046 | return 0; |
| 4047 | } |
| 4048 |
no test coverage detected