X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mm.c;h=4ed72ad861384fa556a1e9a98b06929de6a6d82e;hp=0130cbcb81510f0d71a4b63c3e2f568aaa54670b;hb=08aa4b386c981292aec04fc35fe37133047fb946;hpb=9242741b62d726e7b673a3b10c62bbc8509a75ef diff --git a/mm.c b/mm.c index 0130cbcb..4ed72ad8 100644 --- a/mm.c +++ b/mm.c @@ -71,6 +71,67 @@ static int compare_int32(int32_t a, int32_t b, enum mood_comparator_id id) return res? 100 : -100; } +static int mm_regex_parser(int argc, char **argv, void **private) +{ + regex_t *preg; + int ret; + + if (argc != 1) + return -E_MOOD_SYNTAX; + preg = para_malloc(sizeof(*preg)); + ret = para_regcomp(preg, argv[1], REG_EXTENDED | REG_NOSUB); + if (ret < 0) { + free(preg); + return ret; + } + *private = preg; + return 1; +} + +static int mm_regex_score_function(const regex_t *preg, const char *pattern) +{ + return regexec(preg, pattern, 0, NULL, 0) == 0? 100 : -100; +} + +static void mm_regex_cleanup(void *private) +{ + regex_t *preg = private; + regfree(preg); + free(preg); +} + +static int mm_artist_matches_score_function(__a_unused const char *path, + __a_unused const struct afs_info *afsi, + const struct afh_info *afhi, + const void *private) +{ + return mm_regex_score_function(private, afhi->tags.artist); +} + +static int mm_title_matches_score_function(__a_unused const char *path, + __a_unused const struct afs_info *afsi, + const struct afh_info *afhi, + const void *private) +{ + return mm_regex_score_function(private, afhi->tags.title); +} + +static int mm_album_matches_score_function(__a_unused const char *path, + __a_unused const struct afs_info *afsi, + const struct afh_info *afhi, + const void *private) +{ + return mm_regex_score_function(private, afhi->tags.album); +} + +static int mm_comment_matches_score_function(__a_unused const char *path, + __a_unused const struct afs_info *afsi, + const struct afh_info *afhi, + const void *private) +{ + return mm_regex_score_function(private, afhi->tags.comment); +} + struct mm_year_data { /** The year given at the mood line. */ int32_t year; @@ -209,11 +270,20 @@ static int mm_is_set_score_function(__a_unused const char *path, DEFINE_MOOD_METHOD(_name), \ .cleanup = mm_ ## _name ## _cleanup +#define DEFINE_REGEX_MOOD_METHOD(_name) \ + .name = #_name, \ + .parser = mm_regex_parser, \ + .score_function = mm_ ## _name ## _score_function, \ + .cleanup = mm_regex_cleanup + const struct mood_method mood_methods[] = { {DEFINE_MOOD_METHOD(no_attributes_set)}, {DEFINE_MOOD_METHOD(is_set)}, {DEFINE_MOOD_METHOD_WITH_CLEANUP(path_matches)}, {DEFINE_MOOD_METHOD_WITH_CLEANUP(year)}, + {DEFINE_REGEX_MOOD_METHOD(artist_matches)}, + {DEFINE_REGEX_MOOD_METHOD(title_matches)}, + {DEFINE_REGEX_MOOD_METHOD(album_matches)}, + {DEFINE_REGEX_MOOD_METHOD(comment_matches)}, {.parser = NULL} }; -