--- a/dav/tags.h Fri Jun 01 08:52:05 2018 +0200 +++ b/dav/tags.h Fri Jun 01 09:01:00 2018 +0200 @@ -39,11 +39,33 @@ extern "C" { #endif + +/* OFF must be zero, other constants are arbitrary */ +#define DAV_SYNC_TAGFILTER_OFF 0 +#define DAV_SYNC_TAGFILTER_AND 1 +#define DAV_SYNC_TAGFILTER_OR 2 +#define DAV_SYNC_TAGFILTER_ONE 3 +#define DAV_SYNC_TAGFILTER_NONE 4 + typedef struct DavTag { char *name; char *color; } DavTag; +/** + * filter ::= operator? , (tag_list | ("(" , filter , ")")+) + * tag_list ::= tag , ("," tag)* + * operator ::= "&" | "|" | "1" | "0" + */ +typedef struct SyncTagFilter SyncTagFilter; + +struct SyncTagFilter { + int mode; + UcxList* tags; + size_t subfilter_count; + SyncTagFilter** subfilters; +}; + void free_dav_tag(DavTag* tag); int compare_tagname(DavTag* left, DavTag* right, void* ignorecase); @@ -60,6 +82,14 @@ UcxList* parse_macos_taglist(const char *buf, size_t length); UcxBuffer* create_macos_taglist(UcxList *tags); + +/* ----------- ----------- tag filter ---------------------- */ + +SyncTagFilter* parse_tagfilter_string(const char* filterstring); +void free_tagfilter(SyncTagFilter* filter); + +int matches_tagfilter(UcxList *dav_tags, SyncTagFilter *tagfilter); + #ifdef __cplusplus } #endif