summaryrefslogtreecommitdiffstats
path: root/grammar
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2012-09-17 16:23:15 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2012-09-17 16:23:15 +0200
commit447f0e6421f2576d57623a398f90b8dd2eb8becf (patch)
tree70ee9ab7a5f665b50a8901d4c6bf8362a129c3a3 /grammar
parent1c68329a62c65244b8492e61aa7bbd5c795f50e6 (diff)
downloadrsyslog-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.y3
-rw-r--r--grammar/lexer.l1
-rw-r--r--grammar/rainerscript.c9
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 '*':