Module: sip-router Branch: master Commit: 7f2853ad287f90736dba35d6bc370922a77fbac7 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7f2853ad...
Author: Andrei Pelinescu-Onciul andrei@iptel.org Committer: Andrei Pelinescu-Onciul andrei@iptel.org Date: Tue May 5 19:19:54 2009 +0200
script parsing: if (non-int) not any longer an error
An if expression that does not evaluate to int is not any longer considered a parse error. It will generate a warning, but sr will start. This allows backward compatible if (@select) or if($avp).
---
cfg.y | 17 ++++++++++------- route.c | 4 ++++ 2 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/cfg.y b/cfg.y index 21e81a1..5897914 100644 --- a/cfg.y +++ b/cfg.y @@ -1858,13 +1858,13 @@ action: ; if_cmd: IF rval_expr stm { - if (rval_expr_int_check($2)==0){ + if (rval_expr_int_check($2)>=0){ warn_ct_rve($2, "if"); } $$=mk_action( IF_T, 3, RVE_ST, $2, ACTIONS_ST, $3, NOSUBTYPE, 0); } | IF rval_expr stm ELSE stm { - if (rval_expr_int_check($2)==0){ + if (rval_expr_int_check($2)>=0){ warn_ct_rve($2, "if"); } $$=mk_action( IF_T, 3, RVE_ST, $2, ACTIONS_ST, $3, ACTIONS_ST, $5); @@ -2806,7 +2806,8 @@ static void warn_at(struct cfg_pos* p, char* format, ...) vsnprintf(s, sizeof(s), format, ap); va_end(ap); if (p->e_line!=p->s_line) - LOG(L_WARN, "warning in config file, from line %d, column %d to line %d, column %d: %s\n", + LOG(L_WARN, "warning in config file, from line %d, column %d to" + " line %d, column %d: %s\n", p->s_line, p->s_col, p->e_line, p->e_col, s); else if (p->s_col!=p->e_col) LOG(L_WARN, "warning in config file, line %d, column %d-%d: %s\n", @@ -2828,7 +2829,8 @@ static void yyerror_at(struct cfg_pos* p, char* format, ...) vsnprintf(s, sizeof(s), format, ap); va_end(ap); if (p->e_line!=p->s_line) - LOG(L_CRIT, "parse error in config file, from line %d, column %d to line %d, column %d: %s\n", + LOG(L_CRIT, "parse error in config file, from line %d, column %d" + " to line %d, column %d: %s\n", p->s_line, p->s_col, p->e_line, p->e_col, s); else if (p->s_col!=p->e_col) LOG(L_CRIT, "parse error in config file, line %d, column %d-%d: %s\n", @@ -2948,7 +2950,7 @@ static struct rval_expr* mk_rve2(enum rval_expr_op op, struct rval_expr* rve1, /** check if the expression is an int. * if the expression does not evaluate to an int return -1 and * log an error. - * @return 0 on success, -1 on error */ + * @return 0 success, no warnings; 1 success but warnings; -1 on error */ static int rval_expr_int_check(struct rval_expr *rve) { struct rval_expr* bad_rve; @@ -2967,8 +2969,9 @@ static int rval_expr_int_check(struct rval_expr *rve) yyerror("BUG: unexpected null "bad" expression\n"); return -1; }else if (type!=RV_INT && type!=RV_NONE){ - yyerror_at(&rve->fpos, "invalid expression type, int expected\n"); - return -1; + warn_at(&rve->fpos, "non-int expression (you might want to use" + " casts)\n"); + return 1; } return 0; } diff --git a/route.c b/route.c index 4ba116a..8d8c7db 100644 --- a/route.c +++ b/route.c @@ -712,12 +712,16 @@ int fix_actions(struct action* a) rve->fpos.s_line, rve->fpos.s_col); return E_UNSPEC; } + /* it's not an error anymore to have non-int in an if, + only a script warning (to allow backward compat. stuff + like if (@ruri) if (rve_type!=RV_INT && rve_type!=RV_NONE){ LOG(L_ERR, "fix_actions: invalid expression (%d,%d):" " bad type, integer expected\n", rve->fpos.s_line, rve->fpos.s_col); return E_UNSPEC; } + */ if ((ret=fix_rval_expr((void**)&rve))<0) return ret; }