* 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)
{
return pp;
}
+void rx_set_template(rx_t *rx, const char *tpl)
+{
+ const char *p = tpl;
+
+ m_strreplace(&rx->template, tpl);
+ rx->nmatch = 0;
+
+ while ((p = strchr(p, '%'))) {
+ if (isdigit(*++p)) {
+ int n = strtol(p, (char **)&p, 10);
+ rx->nmatch = MAX(n, rx->nmatch);
+ } else {
+ if (*p == '%')
+ p++;
+ }
+ }
+
+ rx->nmatch++; /* match 0 is always the whole expr */
+}
+
void rx_delete(rx_t **p)
{
p_delete(&(*p)->pattern);
regfree((*p)->rx);
p_delete(&(*p)->rx);
+ p_delete(&(*p)->template);
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)
{
- int i;
+ if (!pat || !*pat)
+ return NULL;
- if (!pat || !*pat || list_empty(l))
- return -1;
+ 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)
+{
+ while (*src) {
+ if (n <= 1)
+ break;
+
+ /* 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;
}