From f2d7ef29459c3e89d0a86c32761ef9bac84dfd95 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Mon, 5 Oct 2015 22:56:08 -0400 Subject: [PATCH] regex iterate --- c/mapping/lrec_evaluator.h | 2 +- c/mapping/mlr_val.c | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/c/mapping/lrec_evaluator.h b/c/mapping/lrec_evaluator.h index 0db8ef650..36fe2ebd2 100644 --- a/c/mapping/lrec_evaluator.h +++ b/c/mapping/lrec_evaluator.h @@ -9,8 +9,8 @@ typedef mv_t lrec_evaluator_func_t(lrec_t* prec, context_t* pctx, void* pvstate) typedef struct _lrec_evaluator_t { void* pvstate; - // xxx needs a pfree_func too lrec_evaluator_func_t* pevaluator_func; + // xxx needs a pfree_func too } lrec_evaluator_t; #endif // LREC_EVALUATOR_H diff --git a/c/mapping/mlr_val.c b/c/mapping/mlr_val.c index a9e622c98..1ab2ab4ea 100644 --- a/c/mapping/mlr_val.c +++ b/c/mapping/mlr_val.c @@ -847,6 +847,7 @@ mv_t ge_op_func(mv_t* pval1, mv_t* pval2) { return (ge_dispositions[pval1->type] mv_t lt_op_func(mv_t* pval1, mv_t* pval2) { return (lt_dispositions[pval1->type][pval2->type])(pval1, pval2); } mv_t le_op_func(mv_t* pval1, mv_t* pval2) { return (le_dispositions[pval1->type][pval2->type])(pval1, pval2); } +// ---------------------------------------------------------------- mv_t matches_op_func(mv_t* pval1, mv_t* pval2) { char* s1 = pval1->u.strv; char* s2 = pval2->u.strv; @@ -855,7 +856,7 @@ mv_t matches_op_func(mv_t* pval1, mv_t* pval2) { regex_t reg; char* sstr = s1; char* sregex = s2; - int cflags = REG_EXTENDED; // also support REG_ICASE somehow + int cflags = REG_EXTENDED | REG_NOSUB; // xxx also support REG_ICASE somehow regmatch_t pmatch[1]; int eflags = 0; int rc; @@ -870,16 +871,18 @@ mv_t matches_op_func(mv_t* pval1, mv_t* pval2) { } rc = regexec(®, sstr, 1, pmatch, eflags); - regfree(®); if (rc == 0) { + regfree(®); return (mv_t) {.type = MT_BOOL, .u.boolv = TRUE}; } else if (rc == REG_NOMATCH) { + regfree(®); return (mv_t) {.type = MT_BOOL, .u.boolv = FALSE}; } else { size_t nbytes = regerror(rc, ®, NULL, 0); char* errbuf = malloc(nbytes); (void)regerror(rc, ®, errbuf, nbytes); printf("regexec failure: %s\n", errbuf); + regfree(®); exit(1); } }