diff --git a/src/idnode.c b/src/idnode.c index f79c1378..4727bee1 100644 --- a/src/idnode.c +++ b/src/idnode.c @@ -502,7 +502,9 @@ idnode_filter return 1; break; case IC_RE: - break; // TODO: not yet supported + if (regexec(&f->u.re, str, 0, NULL, 0)) + return 1; + break; } } else if (f->type == IF_NUM || f->type == IF_BOOL) { uint32_t u32; @@ -542,7 +544,13 @@ idnode_filter_add_str ele->key = strdup(key); ele->type = IF_STR; ele->comp = comp; - ele->u.s = strdup(val); + if (comp == IC_RE) { + if (regcomp(&ele->u.re, val, REG_ICASE | REG_EXTENDED | REG_NOSUB)) { + free(ele); + return; + } + } else + ele->u.s = strdup(val); LIST_INSERT_HEAD(filt, ele, link); } @@ -577,8 +585,12 @@ idnode_filter_clear idnode_filter_ele_t *ele; while ((ele = LIST_FIRST(filt))) { LIST_REMOVE(ele, link); - if (ele->type == IF_STR) - free(ele->u.s); + if (ele->type == IF_STR) { + if (ele->comp == IC_RE) + regfree(&ele->u.re); + else + free(ele->u.s); + } free(ele); } } diff --git a/src/idnode.h b/src/idnode.h index edee14bf..b065955e 100644 --- a/src/idnode.h +++ b/src/idnode.h @@ -3,6 +3,8 @@ #include "tvheadend.h" #include "prop.h" +#include + struct htsmsg; struct idnode; @@ -46,6 +48,7 @@ typedef struct idnode_filter_ele int b; char *s; int64_t n; + regex_t re; } u; enum { IC_EQ, // Equals