📄 avpops_parse.c
字号:
p = s; /*parse the name */ while (*p && isspace((int)*p)) p++; foo.s = p; while (*p && *p!=':' && !isspace((int)*p)) p++; if (foo.s==p || *p==0) /* missing name or empty scheme */ goto parse_error; foo.len = p - foo.s; /* dulicate it */ duplicate_str( scheme->name, foo, error); /* parse the ':' separator */ while (*p && isspace((int)*p)) p++; if (*p!=':') goto parse_error; p++; while (*p && isspace((int)*p)) p++; if (*p==0) goto parse_error; /* set as default value type string */ scheme->db_flags = AVP_VAL_STR; /* parse the attributes */ while (*p) { /* get the attribute name */ foo.s = p; while (*p && *p!='=' && !isspace((int)*p)) p++; if (p==foo.s || *p==0) /* missing attribute name */ goto parse_error; foo.len = p - foo.s; /* parse the '=' separator */ while (*p && isspace((int)*p)) p++; if (*p!='=') goto parse_error; p++; while (*p && isspace((int)*p)) p++; if (*p==0) goto parse_error; /* parse the attribute value */ bar.s = p; while (*p && *p!=';' && !isspace((int)*p)) p++; if (p==bar.s) /* missing attribute value */ goto parse_error; bar.len = p - bar.s; /* parse the ';' separator, if any */ while (*p && isspace((int)*p)) p++; if (*p!=0 && *p!=';') goto parse_error; if (*p==';') p++; while (*p && isspace((int)*p)) p++; /* identify the attribute */ if ( foo.len==SCHEME_UUID_COL_LEN && !strncasecmp( foo.s, SCHEME_UUID_COL, foo.len) ) { duplicate_str( scheme->uuid_col, bar, error); } else if ( foo.len==SCHEME_USERNAME_COL_LEN && !strncasecmp( foo.s, SCHEME_USERNAME_COL, foo.len) ) { duplicate_str( scheme->username_col, bar, error); } else if ( foo.len==SCHEME_DOMAIN_COL_LEN && !strncasecmp( foo.s, SCHEME_DOMAIN_COL, foo.len) ) { duplicate_str( scheme->domain_col, bar, error); } else if ( foo.len==SCHEME_VALUE_COL_LEN && !strncasecmp( foo.s, SCHEME_VALUE_COL, foo.len) ) { duplicate_str( scheme->value_col, bar, error); } else if ( foo.len==SCHEME_TABLE_LEN && !strncasecmp( foo.s, SCHEME_TABLE, foo.len) ) { duplicate_str( scheme->table, bar, error); } else if ( foo.len==SCHEME_VAL_TYPE_LEN && !strncasecmp( foo.s, SCHEME_VAL_TYPE, foo.len) ) { if ( bar.len==SCHEME_INT_TYPE_LEN && !strncasecmp( bar.s, SCHEME_INT_TYPE, bar.len) ) scheme->db_flags &= (~AVP_VAL_STR); else if ( bar.len==SCHEME_STR_TYPE_LEN && !strncasecmp( bar.s, SCHEME_STR_TYPE, bar.len) ) scheme->db_flags = AVP_VAL_STR; else { LOG(L_ERR,"ERROR:avpops:parse_avp_sb_scheme: unknown " "value type <%.*s>\n",bar.len,bar.s); goto error; } } else { LOG(L_ERR,"ERROR:avpops:parse_avp_sb_scheme: unknown " "attribute <%.*s>\n",foo.len,foo.s); goto error; } } /* end while */ return 0;parse_error: LOG(L_ERR,"ERROR:avpops:parse_avp_sb_scheme: parse error in <%s> " "around %ld\n", s, (long)(p-s));error: return -1;}struct fis_param* parse_check_value(char *s){ struct fis_param *vp; int ops; int opd; char *p; char *t; int len; ops = 0; opd = 0; vp = 0; if ( (p=strchr(s,'/'))==0 || (p-s!=2&&p-s!=3) ) goto parse_error; /* get the operation */ if (strncasecmp(s,"eq",2)==0) { ops |= AVPOPS_OP_EQ; } else if (strncasecmp(s,"ne",2)==0) { ops |= AVPOPS_OP_NE; } else if (strncasecmp(s,"lt",2)==0) { ops |= AVPOPS_OP_LT; } else if (strncasecmp(s,"le",2)==0) { ops |= AVPOPS_OP_LE; } else if (strncasecmp(s,"gt",2)==0) { ops |= AVPOPS_OP_GT; } else if (strncasecmp(s,"ge",2)==0) { ops |= AVPOPS_OP_GE; } else if (strncasecmp(s,"re",2)==0) { ops |= AVPOPS_OP_RE; } else if (strncasecmp(s,"fm",2)==0) { ops |= AVPOPS_OP_FM; } else if (strncasecmp(s,"and",3)==0) { ops |= AVPOPS_OP_BAND; } else if (strncasecmp(s,"or",2)==0) { ops |= AVPOPS_OP_BOR; } else if (strncasecmp(s,"xor",3)==0) { ops |= AVPOPS_OP_BXOR; } else { LOG(L_ERR,"ERROR:avpops:parse_check_value: unknown operation " "<%.*s>\n",2,s); goto error; } /* get the value */ if (*(++p)==0) goto parse_error; if ( (t=strchr(p,'/'))==0) len = strlen(p); else len = t-p; if (*p=='$') { /* is variable */ vp = avpops_parse_pvar(p, XL_THROW_ERROR|XL_DISABLE_COLORS); if (vp==0) { LOG(L_ERR,"ERROR:avpops:parse_check_value: unable to get" " pseudo-variable\n"); goto error; } if (vp->sval.type==XL_NULL) { LOG(L_ERR,"ERROR:avops:parse_check_value: bad param; " "expected : $pseudo-variable or int/str value\n"); goto error; } opd |= AVPOPS_VAL_PVAR; DBG("flag==%d/%d\n", opd, ops); } else { /* value is explicitly given */ if ( (vp=parse_intstr_value(p,len))==0) { LOG(L_ERR,"ERROR:avpops:parse_check_value: unable to " "parse value\n"); goto error; } } p = t; /* any flags */ if (p!=NULL && *p!=0) { if (*p!='/' || *(++p)==0) goto parse_error; while (*p) { switch (*p) { case 'g': case 'G': ops|=AVPOPS_FLAG_ALL; break; case 'i': case 'I': ops|=AVPOPS_FLAG_CI; break; default: LOG(L_ERR,"ERROR:avpops:parse_check_value: unknown flag " "<%c>\n",*p); goto error; } p++; } } vp->ops |= ops; vp->opd |= opd; return vp;parse_error: LOG(L_ERR,"ERROR:avpops:parse_check_value: parse error in <%s> pos %ld\n", s,(long)(p-s));error: if (vp) pkg_free(vp); return 0;}struct fis_param* parse_op_value(char *s){ struct fis_param *vp; int ops; int opd; char *p; char *t; int len; ops = 0; opd = 0; vp = 0; if ( (p=strchr(s,'/'))==0 || (p-s!=2&&p-s!=3) ) goto parse_error; /* get the operation */ if (strncasecmp(s,"add",3)==0) { ops |= AVPOPS_OP_ADD; } else if (strncasecmp(s,"sub",3)==0) { ops |= AVPOPS_OP_SUB; } else if (strncasecmp(s,"mul",3)==0) { ops |= AVPOPS_OP_MUL; } else if (strncasecmp(s,"div",3)==0) { ops |= AVPOPS_OP_DIV; ops |= AVPOPS_OP_FM; } else if (strncasecmp(s,"and",3)==0) { ops |= AVPOPS_OP_BAND; } else if (strncasecmp(s,"or",2)==0) { ops |= AVPOPS_OP_BOR; } else if (strncasecmp(s,"xor",3)==0) { ops |= AVPOPS_OP_BXOR; } else if (strncasecmp(s,"not",3)==0) { ops |= AVPOPS_OP_BNOT; } else { LOG(L_ERR,"ERROR:avpops:parse_op_value: unknown operation " "<%.*s>\n",2,s); goto error; } /* get the value */ if (*(++p)==0) goto parse_error; if ( (t=strchr(p,'/'))==0) len = strlen(p); else len = t-p; if (*p=='$') { /* is variable */ vp = avpops_parse_pvar(p, XL_THROW_ERROR|XL_DISABLE_COLORS); if (vp==0) { LOG(L_ERR,"ERROR:avpops:parse_op_value: unable to get" " pseudo-variable\n"); goto error; } if (vp->sval.type==XL_NULL) { LOG(L_ERR,"ERROR:avops:parse_op_value: bad param; " "expected : $pseudo-variable or int/str value\n"); goto error; } opd |= AVPOPS_VAL_PVAR; DBG("avops:parse_op_value: flag==%d/%d\n", opd, ops); } else { /* value is explicitly given */ if ( (vp=parse_intstr_value(p,len))==0) { LOG(L_ERR,"ERROR:avpops:parse_op_value: unable to parse value\n"); goto error; } if((vp->opd&AVPOPS_VAL_INT)==0) { LOG(L_ERR,"ERROR:avpops:parse_op_value: value must be int\n"); goto error; } } /* any flags */ p = t; if (p!=0 && *p!=0 ) { if (*p!='/' || *(++p)==0) goto parse_error; while (*p) { switch (*p) { case 'g': case 'G': ops|=AVPOPS_FLAG_ALL; break; case 'd': case 'D': ops|=AVPOPS_FLAG_DELETE; break; default: LOG(L_ERR,"ERROR:avpops:parse_op_value: unknown flag " "<%c>\n",*p); goto error; } p++; } } vp->ops |= ops; vp->opd |= opd; return vp;parse_error: LOG(L_ERR,"ERROR:avpops:parse_op_value: parse error in <%s> pos %ld\n", s,(long)(p-s));error: if (vp) pkg_free(vp); return 0;}avpname_list_t* parse_avpname_list(char *s){ avpname_list_t* head = NULL; avpname_list_t* al = NULL; char *p; xl_spec_t spec; if(s==NULL) { LOG(L_ERR, "avpops:parse_avpname_list: error - bad parameters\n"); return NULL; } p = s; while(*p) { while(*p && (*p==' '||*p=='\t'||*p==','||*p==';')) p++; if(*p=='\0') { if(head==NULL) LOG(L_ERR, "avpops:parse_avpname_list: error - wrong avp name list [%s]\n", s); return head; } p = xl_parse_spec(p, &spec, XL_THROW_ERROR|XL_DISABLE_MULTI|XL_DISABLE_COLORS); if(p==NULL || spec.type!=XL_AVP) { LOG(L_ERR, "avpops:parse_avpname_list: error - wrong avp name list [%s]!\n", s); goto error; } al = (avpname_list_t*)pkg_malloc(sizeof(avpname_list_t)); if(al==NULL) { LOG(L_ERR, "avpops:parse_avpname_list: error - no more memory!\n"); goto error; } memset(al, 0, sizeof(avpname_list_t)); memcpy(&al->sname, &spec, sizeof(xl_spec_t)); if(head==NULL) head = al; else { al->next = head; head = al; } } return head;error: while(head) { al = head; head=head->next; pkg_free(al); } return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -