diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2011-07-08 07:13:56 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2011-07-08 07:13:56 +0200 |
commit | 834fe024b4e53f65d9622a176116f232e212e326 (patch) | |
tree | a66e1ed225c9afc4f122d48d0a6914574f10c5e7 /grammar/rainerscript.c | |
parent | 8a9e0cc68e3314b02065dcd3424201f25f176dfb (diff) | |
download | rsyslog-834fe024b4e53f65d9622a176116f232e212e326.tar.gz rsyslog-834fe024b4e53f65d9622a176116f232e212e326.tar.xz rsyslog-834fe024b4e53f65d9622a176116f232e212e326.zip |
milestone/[PARTWORK]: implemented "CONTAINS"
Diffstat (limited to 'grammar/rainerscript.c')
-rw-r--r-- | grammar/rainerscript.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c index ea23dc1a..bcc73af0 100644 --- a/grammar/rainerscript.c +++ b/grammar/rainerscript.c @@ -332,8 +332,9 @@ void cnfexprEval(struct cnfexpr *expr, struct exprret *ret, void* usrptr) { struct exprret r, l; /* memory for subexpression results */ - es_str_t *estr; + es_str_t *estr_r, *estr_l; int bMustFree; + int bMustFree2; //dbgprintf("eval expr %p, type '%c'(%u)\n", expr, expr->nodetype, expr->nodetype); switch(expr->nodetype) { @@ -345,15 +346,15 @@ cnfexprEval(struct cnfexpr *expr, struct exprret *ret, void* usrptr) 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); + estr_r = exprret2String(&r, &bMustFree); + ret->d.n = !es_strcmp(l.d.estr, estr_r); + if(bMustFree) es_deleteStr(estr_r); } } else { if(r.datatype == 'S') { - estr = exprret2String(&l, &bMustFree); - ret->d.n = !es_strcmp(r.d.estr, estr); - if(bMustFree) es_deleteStr(estr); + estr_l = exprret2String(&l, &bMustFree); + ret->d.n = !es_strcmp(r.d.estr, estr_l); + if(bMustFree) es_deleteStr(estr_l); } else { ret->d.n = (l.d.n == r.d.n); } @@ -374,6 +375,17 @@ cnfexprEval(struct cnfexpr *expr, struct exprret *ret, void* usrptr) case CMP_GT: COMP_NUM_BINOP(>); break; + case CMP_CONTAINS: + cnfexprEval(expr->l, &l, usrptr); + cnfexprEval(expr->r, &r, usrptr); + estr_r = exprret2String(&r, &bMustFree); + estr_l = exprret2String(&l, &bMustFree2); + ret->datatype = 'N'; +dbgprintf("ZZZZ: contains ret %d\n", es_strContains(estr_l, estr_r)); + ret->d.n = es_strContains(estr_l, estr_r) != -1; + if(bMustFree) es_deleteStr(estr_r); + if(bMustFree2) es_deleteStr(estr_l); + break; case OR: cnfexprEval(expr->l, &l, usrptr); ret->datatype = 'N'; |