dav/scfg.c

changeset 648
fefe4b6f1048
parent 647
8bf1d9688698
child 649
0f4c59ac8c74
--- a/dav/scfg.c	Sat Sep 28 09:24:30 2019 +0200
+++ b/dav/scfg.c	Sun Sep 29 12:57:13 2019 +0200
@@ -164,6 +164,36 @@
     return 0;
 }
 
+Filter* parse_filter(xmlNode *node) {
+    UcxList *include = NULL;
+    UcxList *exclude = NULL;
+    UcxList *tags = NULL;
+    
+    if(scfg_load_filter(node, &include, &exclude, &tags)) {
+        return NULL;
+    }
+    
+    Filter *filter = malloc(sizeof(Filter));
+    filter->include = include;
+    filter->exclude = exclude;
+    filter->tags = tags;
+}
+
+void init_default_filter(Filter *filter) {
+    if(!filter->include) {
+        regex_t *matchall = malloc(sizeof(regex_t));
+        regcomp(matchall, ".*", REG_NOSUB);
+        filter->include = ucx_list_append(NULL, matchall);
+    }
+    /*
+    if(!filter->exclude) {
+        regex_t *matchnothing = malloc(sizeof(regex_t));
+        regcomp(matchnothing, "///", REG_NOSUB);
+        filter->exclude = ucx_list_append(NULL, matchnothing);
+    }
+    */
+}
+
 static TagFormat str2tagformat(const char *str) {
     if(!strcmp(str, "text")) {
         return TAG_FORMAT_TEXT;
@@ -250,19 +280,24 @@
 }
 
 static SplitConfig* parse_split(xmlNode *node) {
-    char *pattern = NULL;
+    Filter *filter = NULL;
     char *minsize = NULL;
     char *blocksize = NULL;
     
     xmlNode *c = node->children;
     while(c) {
-        char *value = util_xml_get_text(c);
-        if(xstreq(c->name, "pattern")) {
-            pattern = value;
+        if(xstreq(c->name, "filter")) {
+            filter = parse_filter(node);
+            if(filter->tags) {
+                fprintf(stderr, "splitconfig: tag filter not supported\n");
+                free_filter(*filter);
+                free(filter);
+                return NULL;
+            }
         } else if(xstreq(c->name, "minsize")) {
-            minsize = value;
+            minsize = util_xml_get_text(c);
         } else if(xstreq(c->name, "blocksize")) {
-            blocksize = value;
+            blocksize = util_xml_get_text(c);
         }
         c = c->next;
     }
@@ -283,8 +318,8 @@
         return NULL;
     }
     
-    if(!pattern && !minsize) {
-        fprintf(stderr, "splitconfig: pattern or minsize must be specified\n");
+    if(!filter && !minsize) {
+        fprintf(stderr, "splitconfig: filter or minsize must be specified\n");
         return NULL;
     }
     
@@ -299,13 +334,8 @@
     }
     
     SplitConfig *sc = calloc(1, sizeof(SplitConfig));
-    if(pattern) {
-        regex_t *regex = malloc(sizeof(regex_t));
-        if (regcomp(regex, pattern, REG_EXTENDED|REG_NOSUB)) {
-            fprintf(stderr, "Invalid regular expression (%s)\n", pattern);
-        } else {
-            sc->pattern = regex;
-        }
+    if(filter) {
+        init_default_filter(filter);
     }
     sc->minsize = minsz;
     sc->blocksize = (size_t)sz;
@@ -609,21 +639,10 @@
         dir->db_settings |= DB_STORE_OWNER;
     }
     
-    if (include) {
-        dir->include = include;
-    } else {
-        regex_t *matchall = malloc(sizeof(regex_t));
-        regcomp(matchall, ".*", REG_NOSUB);
-        dir->include = ucx_list_append(NULL, matchall);
-    }
-    if (exclude) {
-        dir->exclude = exclude;
-    } else {
-        regex_t *matchnothing = malloc(sizeof(regex_t));
-        regcomp(matchnothing, "///", REG_NOSUB);
-        dir->exclude = ucx_list_append(NULL, matchnothing);
-    }
-    dir->tagfilter = tagfilter;
+    dir->filter.include = include;
+    dir->filter.exclude = exclude;
+    dir->filter.tags = tagfilter;
+    init_default_filter(&dir->filter);
     
     if (trash && sstrtrim(sstr(trash)).length > 0) {
         if (trash[0] == '/' || trash[0] == '$') {
@@ -856,6 +875,18 @@
     return dbname;
 }
 
+void free_filter(Filter filter) {
+    UCX_FOREACH(elm, filter.include) {
+        regfree(elm->data);
+        free(elm->data);
+    }
+    ucx_list_free(filter.include);
+    UCX_FOREACH(elm, filter.exclude) {
+        regfree(elm->data);
+        free(elm->data);
+    }
+    ucx_list_free(filter.exclude);
+}
 
 void free_sync_config() {
     if(directories) {
@@ -874,16 +905,7 @@
                 free(dir->trash);
             }
 
-            UCX_FOREACH(elm, dir->include) {
-                regfree(elm->data);
-                free(elm->data);
-            }
-            ucx_list_free(dir->include);
-            UCX_FOREACH(elm, dir->exclude) {
-                regfree(elm->data);
-                free(elm->data);
-            }
-            ucx_list_free(dir->exclude);
+            free_filter(dir->filter);
 
             free(dir);
         }

mercurial