X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-lib%2Frx.c;h=58e943c22f75b7b13bc4885f0c1c533e5a37fa26;hp=79ec5b83873793e44ea9d6ebaef22c6642c6c29b;hb=2b9f5916b3aebd8d34903d420ce8160121171534;hpb=20392fc3c433909de76c676c235524acd96bec60 diff --git a/lib-lib/rx.c b/lib-lib/rx.c index 79ec5b8..58e943c 100644 --- a/lib-lib/rx.c +++ b/lib-lib/rx.c @@ -29,7 +29,8 @@ rx_t *rx_compile(const char *s, int flags) rx_t *pp = p_new(rx_t, 1); pp->pattern = m_strdup(s); - pp->rx = p_new(regex_t, 1); + pp->rx = p_new(regex_t, 1); + pp->flags = flags; if (REGCOMP(pp->rx, NONULL(s), flags) != 0) { rx_delete(&pp); @@ -38,6 +39,14 @@ rx_t *rx_compile(const char *s, int flags) return pp; } +rx_t *rx_dup(rx_t *r) +{ + rx_t *res = rx_compile(r->pattern, r->flags); + res->neg = r->neg; + rx_set_template(res, r->tpl); + return res; +} + int rx_validate(const char *s, char *errbuf, ssize_t errlen) { regex_t re; @@ -59,6 +68,8 @@ void rx_set_template(rx_t *rx, const char *tpl) m_strreplace(&rx->tpl, tpl); rx->nmatch = 0; + if (m_strisempty(rx->tpl)) + return; while ((p = strchr(p, '%'))) { if (isdigit(*++p)) { @@ -148,7 +159,40 @@ rx_t **rx_lookup(rx_t **l, const char *pat) l = &(*l)->next; } - return NULL; + return l; +} + +void rx_list_add(rx_t **l, rx_t *rxp) +{ + l = rx_lookup(l, rxp->pattern); + if (*l) { + rx_t *r = rx_list_pop(l); + rx_delete(&r); + } + rx_list_push(l, rxp); +} + +void rx_list_add2(rx_t **l, rx_t **rxp) +{ + l = rx_lookup(l, (*rxp)->pattern); + if (*l) { + rx_t *r = rx_list_pop(l); + rx_delete(&r); + } + if (m_strisempty((*rxp)->tpl)) { + rx_delete(rxp); + } else { + rx_list_push(l, *rxp); + } +} + +void rx_list_remove(rx_t **l, const rx_t *r) +{ + l = rx_lookup(l, r->pattern); + if (*l) { + rx_t *tmp = rx_list_pop(l); + rx_delete(&tmp); + } } int rx_sanitize_string(char *dst, ssize_t n, const char *src)