make mutt_match_spam_list a generic rx function: rx_list_match2 that does
[apps/madmutt.git] / lib-lib / rx.c
index 8604ad5..21cbd33 100644 (file)
@@ -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)