summaryrefslogtreecommitdiffstats
path: root/grammar
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2011-07-07 16:35:51 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2011-07-07 16:35:51 +0200
commit8a9e0cc68e3314b02065dcd3424201f25f176dfb (patch)
treee354a33f34575afc7eef45981902b8ae8c2fdbb8 /grammar
parent5710b413963d2fde9d062127ed72672b8a58a07e (diff)
downloadrsyslog-8a9e0cc68e3314b02065dcd3424201f25f176dfb.tar.gz
rsyslog-8a9e0cc68e3314b02065dcd3424201f25f176dfb.tar.xz
rsyslog-8a9e0cc68e3314b02065dcd3424201f25f176dfb.zip
milestone/[PARTWORK]: obtaining msg vars integrated, "==" works for strings
Diffstat (limited to 'grammar')
-rw-r--r--grammar/parserif.h1
-rw-r--r--grammar/rainerscript.c68
-rw-r--r--grammar/rainerscript.h4
-rw-r--r--grammar/testdriver.c8
4 files changed, 61 insertions, 20 deletions
diff --git a/grammar/parserif.h b/grammar/parserif.h
index a04abb0c..bebb1dfb 100644
--- a/grammar/parserif.h
+++ b/grammar/parserif.h
@@ -16,4 +16,5 @@ void cnfDoRule(struct cnfrule *rule);
void cnfDoCfsysline(char *ln);
void cnfDoBSDTag(char *ln);
void cnfDoBSDHost(char *ln);
+es_str_t *cnfGetVar(char *name, void *usrptr);
#endif
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index 801a52b2..ea23dc1a 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -291,8 +291,9 @@ done:
static inline long long
exprret2Number(struct exprret *r)
{
+ long long n;
if(r->datatype == 'S') {
- dbgprintf("toNumber CONVERSION MISSING\n"); abort();
+ n = es_str2num(r->d.estr);
}
return r->d.n;
}
@@ -301,22 +302,24 @@ exprret2Number(struct exprret *r)
* emit error message and set number to 0.
*/
static inline es_str_t *
-exprret2String(struct exprret *r)
+exprret2String(struct exprret *r, int *bMustFree)
{
if(r->datatype == 'N') {
- dbgprintf("toString CONVERSION MISSING\n"); abort();
+ *bMustFree = 1;
+ return es_newStrFromNumber(r->d.n);
}
+ *bMustFree = 0;
return r->d.estr;
}
#define COMP_NUM_BINOP(x) \
- cnfexprEval(expr->l, &l); \
- cnfexprEval(expr->r, &r); \
+ cnfexprEval(expr->l, &l, usrptr); \
+ cnfexprEval(expr->r, &r, usrptr); \
ret->datatype = 'N'; \
ret->d.n = exprret2Number(&l) x exprret2Number(&r)
/* evaluate an expression.
- * Note that we try to avoid malloc whenever possible (because on
+ * Note that we try to avoid malloc whenever possible (because of
* the large overhead it has, especially on highly threaded programs).
* As such, the each caller level must provide buffer space for the
* result on its stack during recursion. This permits the callee to store
@@ -326,14 +329,35 @@ exprret2String(struct exprret *r)
* simply is no case where full evaluation would make any sense at all.
*/
void
-cnfexprEval(struct cnfexpr *expr, struct exprret *ret)
+cnfexprEval(struct cnfexpr *expr, struct exprret *ret, void* usrptr)
{
struct exprret r, l; /* memory for subexpression results */
+ es_str_t *estr;
+ int bMustFree;
//dbgprintf("eval expr %p, type '%c'(%u)\n", expr, expr->nodetype, expr->nodetype);
switch(expr->nodetype) {
case CMP_EQ:
- COMP_NUM_BINOP(==);
+ cnfexprEval(expr->l, &l, usrptr);
+ cnfexprEval(expr->r, &r, usrptr);
+ ret->datatype = 'N';
+ if(l.datatype == 'S') {
+ if(r.datatype == 'S') {
+ ret->d.n = !es_strcmp(l.d.estr, r.d.estr);
+ } else {
+ estr = exprret2String(&r, &bMustFree);
+ ret->d.n = !es_strcmp(l.d.estr, estr);
+ if(bMustFree) es_deleteStr(estr);
+ }
+ } else {
+ if(r.datatype == 'S') {
+ estr = exprret2String(&l, &bMustFree);
+ ret->d.n = !es_strcmp(r.d.estr, estr);
+ if(bMustFree) es_deleteStr(estr);
+ } else {
+ ret->d.n = (l.d.n == r.d.n);
+ }
+ }
break;
case CMP_NE:
COMP_NUM_BINOP(!=);
@@ -351,12 +375,12 @@ cnfexprEval(struct cnfexpr *expr, struct exprret *ret)
COMP_NUM_BINOP(>);
break;
case OR:
- cnfexprEval(expr->l, &l);
+ cnfexprEval(expr->l, &l, usrptr);
ret->datatype = 'N';
if(exprret2Number(&l)) {
ret->d.n = 1ll;
} else {
- cnfexprEval(expr->r, &r);
+ cnfexprEval(expr->r, &r, usrptr);
if(exprret2Number(&r))
ret->d.n = 1ll;
else
@@ -364,10 +388,10 @@ cnfexprEval(struct cnfexpr *expr, struct exprret *ret)
}
break;
case AND:
- cnfexprEval(expr->l, &l);
+ cnfexprEval(expr->l, &l, usrptr);
ret->datatype = 'N';
if(exprret2Number(&l)) {
- cnfexprEval(expr->r, &r);
+ cnfexprEval(expr->r, &r, usrptr);
if(exprret2Number(&r))
ret->d.n = 1ll;
else
@@ -377,7 +401,7 @@ cnfexprEval(struct cnfexpr *expr, struct exprret *ret)
}
break;
case NOT:
- cnfexprEval(expr->r, &r);
+ cnfexprEval(expr->r, &r, usrptr);
ret->datatype = 'N';
ret->d.n = !exprret2Number(&r);
break;
@@ -385,6 +409,14 @@ cnfexprEval(struct cnfexpr *expr, struct exprret *ret)
ret->datatype = 'N';
ret->d.n = ((struct cnfnumval*)expr)->val;
break;
+ case 'S':
+ ret->datatype = 'S';
+ ret->d.estr = es_strdup(((struct cnfstringval*)expr)->estr);
+ break;
+ case 'V':
+ ret->datatype = 'S';
+ ret->d.estr = cnfGetVar(((struct cnfvar*)expr)->name, usrptr);
+ break;
case '+':
COMP_NUM_BINOP(+);
break;
@@ -401,15 +433,15 @@ cnfexprEval(struct cnfexpr *expr, struct exprret *ret)
COMP_NUM_BINOP(%);
break;
case 'M':
- cnfexprEval(expr->r, &r);
+ cnfexprEval(expr->r, &r, usrptr);
ret->datatype = 'N';
ret->d.n = -exprret2Number(&r);
break;
default:
ret->datatype = 'N';
ret->d.n = 0ll;
- dbgprintf("eval error: unknown nodetype %u\n",
- (unsigned) expr->nodetype);
+ dbgprintf("eval error: unknown nodetype %u['%c']\n",
+ (unsigned) expr->nodetype, (char) expr->nodetype);
break;
}
}
@@ -419,10 +451,10 @@ cnfexprEval(struct cnfexpr *expr, struct exprret *ret)
* important.
*/
int
-cnfexprEvalBool(struct cnfexpr *expr)
+cnfexprEvalBool(struct cnfexpr *expr, void *usrptr)
{
struct exprret ret;
- cnfexprEval(expr, &ret);
+ cnfexprEval(expr, &ret, usrptr);
return exprret2Number(&ret);
}
diff --git a/grammar/rainerscript.h b/grammar/rainerscript.h
index bab7e602..8b5c36de 100644
--- a/grammar/rainerscript.h
+++ b/grammar/rainerscript.h
@@ -161,8 +161,8 @@ struct cnfactlst* cnfactlstAddSysline(struct cnfactlst* actlst, char *line);
struct cnfactlst* cnfactlstReverse(struct cnfactlst *actlst);
struct cnfexpr* cnfexprNew(unsigned nodetype, struct cnfexpr *l, struct cnfexpr *r);
void cnfexprPrint(struct cnfexpr *expr, int indent);
-void cnfexprEval(struct cnfexpr *expr, struct exprret *ret);
-int cnfexprEvalBool(struct cnfexpr *expr);
+void cnfexprEval(struct cnfexpr *expr, struct exprret *ret, void *pusr);
+int cnfexprEvalBool(struct cnfexpr *expr, void *usrptr);
struct cnfnumval* cnfnumvalNew(long long val);
struct cnfstringval* cnfstringvalNew(es_str_t *estr);
struct cnfrule * cnfruleNew(enum cnfFiltType filttype, struct cnfactlst *actlst);
diff --git a/grammar/testdriver.c b/grammar/testdriver.c
index 52d2d0c7..3e161d38 100644
--- a/grammar/testdriver.c
+++ b/grammar/testdriver.c
@@ -86,6 +86,14 @@ void cnfDoBSDHost(char *ln)
dbgprintf("global:BSD host: %s\n", ln);
}
+es_str_t*
+cnfGetVar(char *name, void *usrptr)
+{
+ es_str_t *estr;
+ estr = es_newStrFromCStr("", 1);
+ return estr;
+}
+
int
main(int argc, char *argv[])
{