X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-lib%2Frx.c;fp=lib-lib%2Frx.c;h=21cbd332e882fdb4c005f3ebbdad2bc296e9d0a0;hp=8604ad5412292188fe3511998b31bd6ed27ca98d;hb=6c292f6b369f019cc9a72a0ee65d60e172ee3370;hpb=8336b26fc23c7943bf6681ba2c290bb5cd2c54b8 diff --git a/lib-lib/rx.c b/lib-lib/rx.c index 8604ad5..21cbd33 100644 --- a/lib-lib/rx.c +++ b/lib-lib/rx.c @@ -67,13 +67,13 @@ void rx_delete(rx_t **p) p_delete(p); } -int rx_list_match(rx_t *l, const char *pat) +int rx_list_match(rx_t *l, const char *s) { - if (!pat || !*pat) + if (m_strisempty(s)) return 0; while (l) { - if (!REGEXEC(l->rx, pat)) + if (!REGEXEC(l->rx, s)) return 1; l = l->next; } @@ -81,6 +81,48 @@ int rx_list_match(rx_t *l, const char *pat) return 0; } +int rx_list_match2(rx_t *l, const char *s, char *dst, int dlen) +{ + static regmatch_t *pmatch = NULL; + static int nmatch = 0; + int pos = 0; + + if (m_strisempty(s)) + return 0; + + for (; l; l = l->next) { + if (l->nmatch > nmatch) { + p_realloc(&pmatch, l->nmatch); + nmatch = l->nmatch; + } + + if (regexec(l->rx, s, l->nmatch, pmatch, 0) == 0) { + /* Copy template into dst, with substitutions. */ + const char *p = l->template, *q; + + for (q = strchr(p, '%'); q; q = strchr(p + 1, '%')) { + int n; + + pos += m_strncpy(dst + pos, dlen - pos, p, q - p); + + if (!isdigit((unsigned char)q[1])) { + p = q + (q[1] == '%'); + continue; + } + + n = strtol(q + 1, (char **)&p, 10); /* find pmatch index */ + pos += m_strncpy(dst + pos, dlen - pos, s + pmatch[n].rm_so, + pmatch[n].rm_eo - pmatch[n].rm_so); + } + + pos += m_strcpy(dst + pos, dlen - pos, p); + return 1; + } + } + + return 0; +} + rx_t **rx_lookup(rx_t **l, const char *pat) { if (!pat || !*pat)