! \return ret= 0/1 (false/true) , -1 on error or EXPR_DROP (-127) */
| 1122 | |
| 1123 | /*! \return ret= 0/1 (false/true) , -1 on error or EXPR_DROP (-127) */ |
| 1124 | int 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 | |
| 1169 | skip: |
| 1170 | rec_lev--; |
| 1171 | return ret; |
| 1172 | } |
| 1173 | |
| 1174 | |
| 1175 | int run_startup_route(void) |