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);
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;
{
const char *p = tpl;
- m_strreplace(&rx->template, tpl);
+ m_strreplace(&rx->tpl, tpl);
rx->nmatch = 0;
+ if (m_strisempty(rx->tpl))
+ return;
while ((p = strchr(p, '%'))) {
if (isdigit(*++p)) {
p_delete(&rx->pattern);
regfree(rx->rx);
p_delete(&rx->rx);
- p_delete(&rx->template);
+ p_delete(&rx->tpl);
}
int rx_list_match(rx_t *l, const char *s)
if (regexec(l->rx, s, l->nmatch, pmatch, 0) == 0) {
/* Copy template into dst, with substitutions. */
- const char *p = l->template, *q;
+ const char *p = l->tpl, *q;
for (q = strchr(p, '%'); q; q = strchr(p + 1, '%')) {
int n;
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)