Module: sip-router Branch: andrei/type_conversion Commit: 298512a2b79ff3bd9405a63c5d05030b5ec21de3 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=298512a2...
Author: Andrei Pelinescu-Onciul andrei@iptel.org Committer: Andrei Pelinescu-Onciul andrei@iptel.org Date: Tue Apr 28 19:48:11 2009 +0200
core: new script operators: eq, ne, ieq, ine
Added operators for: - string == and string != : eq, ne - integer == and integer!= : ieq, ine They are almost equivalent to == or !=, but they force the conversion of their operands (eq to string and ieq to int), allowing among other things better type checking on startup and more optimizations. Non equiv. examples: 0 == "" (true) is not equivalent to 0 eq "" (false: it evaluates to "0" eq ""). "a" ieq "b" (true: (int)"a" is 0 and (int)"b" is 0) is not equivalent to "a" == "b" (false).
Note: the names are not final, they are mostly for testing. Future releases might replace ==/!= with ieq/ine and use eq/ne for strings.
---
cfg.lex | 8 ++++++++ cfg.y | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/cfg.lex b/cfg.lex index b1f9c55..768f3e9 100644 --- a/cfg.lex +++ b/cfg.lex @@ -248,6 +248,10 @@ MINUS "-" STRLEN "strlen" STREMPTY "strempty" DEFINED "defined" +STREQ eq +INTEQ ieq +STRDIFF ne +INTDIFF ine
/* Attribute specification */ ATTR_MARK "%" @@ -772,6 +776,10 @@ EAT_ABLE [\ \t\b\r] <INITIAL>{STRLEN} { count(); return STRLEN; } <INITIAL>{STREMPTY} { count(); return STREMPTY; } <INITIAL>{DEFINED} { count(); return DEFINED; } +<INITIAL>{STREQ} { count(); return STREQ; } +<INITIAL>{INTEQ} { count(); return INTEQ; } +<INITIAL>{STRDIFF} { count(); return STRDIFF; } +<INITIAL>{INTDIFF} { count(); return INTDIFF; }
<INITIAL>{SELECT_MARK} { count(); state = SELECT_S; BEGIN(SELECT); return SELECT_MARK; } <SELECT>{ID} { count(); addstr(&s_buf, yytext, yyleng); diff --git a/cfg.y b/cfg.y index a281052..df3056d 100644 --- a/cfg.y +++ b/cfg.y @@ -484,7 +484,7 @@ static int case_check_default(struct case_stms* stms); %left LOG_AND %left BIN_OR %left BIN_AND -%left EQUAL_T DIFF MATCH +%left EQUAL_T DIFF MATCH INTEQ INTDIFF STREQ STRDIFF %left GT LT GTE LTE %left PLUS MINUS %left STAR SLASH @@ -1580,6 +1580,8 @@ exp: rval_expr equalop: EQUAL_T {$$=EQUAL_OP; } | DIFF {$$=DIFF_OP; } + | STREQ {$$=EQUAL_OP; } /* for expr. elems equiv. to EQUAL_T*/ + | STRDIFF {$$=DIFF_OP; } /* for expr. elems. equiv. to DIFF */ ; cmpop: GT {$$=GT_OP; } @@ -1597,6 +1599,10 @@ strop: rve_equalop: EQUAL_T {$$=RVE_EQ_OP; } | DIFF {$$=RVE_DIFF_OP; } + | INTEQ {$$=RVE_IEQ_OP; } + | INTDIFF {$$=RVE_IDIFF_OP; } + | STREQ {$$=RVE_STREQ_OP; } + | STRDIFF {$$=RVE_STRDIFF_OP; } ; rve_cmpop: GT {$$=RVE_GT_OP; }