⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avpops_parse.c

📁 性能优秀的SIP Proxy
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -