MCPcopy Create free account
hub / github.com/OpenSIPS/opensips / eval_expr

Function eval_expr

route.c:1124–1172  ·  view source on GitHub ↗

! \return ret= 0/1 (false/true) , -1 on error or EXPR_DROP (-127) */

Source from the content-addressed store, hash-verified

1122
1123/*! \return ret= 0/1 (false/true) , -1 on error or EXPR_DROP (-127) */
1124int eval_expr(struct expr* e, struct sip_msg* msg, pv_value_t *val)
1125{
1126 static int rec_lev=0;
1127 int ret;
1128
1129 rec_lev++;
1130 if (rec_lev>MAX_REC_LEV){
1131 LM_CRIT("too many expressions (%d)\n", rec_lev);
1132 ret=-1;
1133 goto skip;
1134 }
1135
1136 if (e->type==ELEM_T){
1137 ret=eval_elem(e, msg, val);
1138 }else if (e->type==EXP_T){
1139 switch(e->op){
1140 case AND_OP:
1141 ret=eval_expr(e->left.v.expr, msg, val);
1142 /* if error or false stop evaluating the rest */
1143 if (ret!=1) break;
1144 ret=eval_expr(e->right.v.expr, msg, val); /*ret1 is 1*/
1145 break;
1146 case OR_OP:
1147 ret=eval_expr(e->left.v.expr, msg, val);
1148 /* if true or error stop evaluating the rest */
1149 if (ret!=0) break;
1150 ret=eval_expr(e->right.v.expr, msg, val); /* ret1 is 0 */
1151 break;
1152 case NOT_OP:
1153 ret=eval_expr(e->left.v.expr, msg, val);
1154 if (ret<0) break;
1155 ret= ! ret;
1156 break;
1157 case EVAL_OP:
1158 ret=eval_expr(e->left.v.expr, msg, val);
1159 break;
1160 default:
1161 LM_CRIT("unknown op %d\n", e->op);
1162 ret=-1;
1163 }
1164 }else{
1165 LM_CRIT("unknown type %d\n", e->type);
1166 ret=-1;
1167 }
1168
1169skip:
1170 rec_lev--;
1171 return ret;
1172}
1173
1174
1175int run_startup_route(void)

Callers 3

do_assignFunction · 0.85
do_actionFunction · 0.85
eval_elemFunction · 0.85

Calls 1

eval_elemFunction · 0.85

Tested by

no test coverage detected