Clean buffy.c and init.c
[apps/madmutt.git] / lib-lib / rx.c
index 6413f69..d0a3942 100644 (file)
  * please see the file GPL in the top level source directory.
  */
 
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <lib-lib/mem.h>
-#include <lib-lib/str.h>
-#include <lib-lib/rx.h>
+#include "lib-lib.h"
 
 rx_t *rx_compile(const char *s, int flags)
 {
@@ -52,32 +46,54 @@ void rx_delete(rx_t **p)
     p_delete(p);
 }
 
-int rx_list_match(list2_t *l, const char *pat)
+int rx_list_match(rx_t *l, const char *pat)
 {
-    int i;
-
-    if (!pat || !*pat || list_empty(l))
+    if (!pat || !*pat)
         return 0;
 
-    for (i = 0; i < l->length; i++) {
-        if (!REGEXEC(((rx_t*)l->data[i])->rx, pat))
+    while (l) {
+        if (!REGEXEC(l->rx, pat))
             return 1;
+        l = l->next;
     }
 
     return 0;
 }
 
-int rx_lookup (list2_t *l, const char *pat)
+rx_t **rx_lookup(rx_t **l, const char *pat)
+{
+    if (!pat || !*pat)
+        return NULL;
+
+    while (*l) {
+        if (!strcmp((*l)->pattern, pat))
+            return l;
+        l = &(*l)->next;
+    }
+
+    return NULL;
+}
+
+int rx_sanitize_string(char *dst, ssize_t n, const char *src)
 {
-    int i;
+    while (*src) {
+        if (n <= 1)
+            break;
 
-    if (!pat || !*pat || list_empty(l))
-        return -1;
+        /* these characters must be escaped in regular expressions */
+        if (strchr("^.[$()|*+?{\\", *src)) {
+            if (n <= 2)
+                break;
 
-    for (i = 0; i < l->length; i++) {
-        if (!strcmp(((rx_t*)l->data[i])->pattern, pat))
-            return i;
+            *dst++ = '\\';
+            n--;
+        }
+
+        *dst++ = *src++;
+        n--;
     }
 
-    return -1;
+    *dst = '\0';
+
+    return *src ? -1 : 0;
 }