diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2012-09-17 16:23:15 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2012-09-17 16:23:15 +0200 |
commit | 447f0e6421f2576d57623a398f90b8dd2eb8becf (patch) | |
tree | 70ee9ab7a5f665b50a8901d4c6bf8362a129c3a3 /grammar | |
parent | 1c68329a62c65244b8492e61aa7bbd5c795f50e6 (diff) | |
download | rsyslog-447f0e6421f2576d57623a398f90b8dd2eb8becf.tar.gz rsyslog-447f0e6421f2576d57623a398f90b8dd2eb8becf.tar.xz rsyslog-447f0e6421f2576d57623a398f90b8dd2eb8becf.zip |
new ruleengine: implement script concatenation (& operator)
Diffstat (limited to 'grammar')
-rw-r--r-- | grammar/grammar.y | 3 | ||||
-rw-r--r-- | grammar/lexer.l | 1 | ||||
-rw-r--r-- | grammar/rainerscript.c | 9 |
3 files changed, 12 insertions, 1 deletions
diff --git a/grammar/grammar.y b/grammar/grammar.y index 074d2abd..ce749807 100644 --- a/grammar/grammar.y +++ b/grammar/grammar.y @@ -110,7 +110,7 @@ extern int yyerror(char*); %left AND OR %left CMP_EQ CMP_NE CMP_LE CMP_GE CMP_LT CMP_GT CMP_CONTAINS CMP_CONTAINSI CMP_STARTSWITH CMP_STARTSWITHI -%left '+' '-' +%left '+' '-' '&' %left '*' '/' '%' %nonassoc UMINUS NOT @@ -178,6 +178,7 @@ expr: expr AND expr { $$ = cnfexprNew(AND, $1, $3); } | expr CMP_CONTAINSI expr { $$ = cnfexprNew(CMP_CONTAINSI, $1, $3); } | expr CMP_STARTSWITH expr { $$ = cnfexprNew(CMP_STARTSWITH, $1, $3); } | expr CMP_STARTSWITHI expr { $$ = cnfexprNew(CMP_STARTSWITHI, $1, $3); } + | expr '&' expr { $$ = cnfexprNew('&', $1, $3); } | expr '+' expr { $$ = cnfexprNew('+', $1, $3); } | expr '-' expr { $$ = cnfexprNew('-', $1, $3); } | expr '*' expr { $$ = cnfexprNew('*', $1, $3); } diff --git a/grammar/lexer.l b/grammar/lexer.l index 657c817f..172d4baf 100644 --- a/grammar/lexer.l +++ b/grammar/lexer.l @@ -106,6 +106,7 @@ int fileno(FILE *stream); <EXPR>"/" | <EXPR>"%" | <EXPR>"+" | +<EXPR>"&" | <EXPR>"-" | <EXPR>"(" | <EXPR>")" { return yytext[0]; } diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c index c7344628..05d489a3 100644 --- a/grammar/rainerscript.c +++ b/grammar/rainerscript.c @@ -1189,6 +1189,14 @@ cnfexprEval(struct cnfexpr *expr, struct var *ret, void* usrptr) ret->datatype = 'S'; ret->d.estr = cnfGetVar(((struct cnfvar*)expr)->name, usrptr); break; + case '&': + /* TODO: think about optimization, should be possible ;) */ + PREP_TWO_STRINGS; + ret->datatype = 'S'; + ret->d.estr = es_strdup(estr_l); + es_addStr(&ret->d.estr, estr_r); + FREE_TWO_STRINGS; + break; case '+': COMP_NUM_BINOP(+); break; @@ -1263,6 +1271,7 @@ cnfexprDestruct(struct cnfexpr *expr) case CMP_CONTAINSI: case OR: case AND: + case '&': case '+': case '-': case '*': |