+static int mm_compare_num_parser(int argc, char **argv, void **private)
+{
+ int ret;
+ enum mood_comparator_id id;
+ int32_t arg;
+ struct mm_compare_num_data *cnd;
+ if (argc != 2)
+ return -E_MOOD_SYNTAX;
+ ret = parse_mood_comparator(argv[1]);
+ if (ret < 0)
+ return ret;
+ id = ret;
+ ret = para_atoi32(argv[2], &arg);
+ if (ret < 0)
+ return ret;
+ cnd = para_malloc(sizeof(struct mm_compare_num_data));
+ cnd->id = id;
+ cnd->arg = arg;
+ *private = cnd;
+ return 1;
+}
+
+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);
+}
+
+static int mm_bitrate_score_function(__a_unused const char *path,
+ __a_unused const struct afs_info *afsi,
+ const struct afh_info *afhi,
+ const void *private)
+{
+ return mm_compare_num_score_function(afhi->bitrate, private);
+}
+
+static int mm_frequency_score_function(__a_unused const char *path,
+ __a_unused const struct afs_info *afsi,
+ const struct afh_info *afhi,
+ const void *private)
+{
+ return mm_compare_num_score_function(afhi->frequency, private);
+}
+
+static int mm_channels_score_function(__a_unused const char *path,
+ __a_unused const struct afs_info *afsi,
+ const struct afh_info *afhi,
+ const void *private)
+{
+ return mm_compare_num_score_function(afhi->channels, private);
+}
+
+static int mm_num_played_score_function(__a_unused const char *path,
+ const struct afs_info *afsi,
+ __a_unused const struct afh_info *afhi,
+ const void *private)
+{
+ return mm_compare_num_score_function(afsi->num_played, private);
+}
+