- if (arg && *arg)
- PARA_WARNING_LOG("ignored junk at eol: %s\n", arg);
- return 1;
-}
-
-static int mm_no_attributes_set_score_function(__a_unused const char *path,
- const struct afs_info *afsi,
- __a_unused const struct audio_format_info *afhi,
- __a_unused const void *data)
-{
- if (!afsi->attributes)
- return 100;
- return -100;
-}
-
-static int mm_played_rarely_score_function(__a_unused const char *path,
- const struct afs_info *afsi,
- __a_unused const struct audio_format_info *afhi,
- __a_unused const void *data)
-{
- unsigned num;
- int ret = get_num_admissible_files(&num);
-
- if (ret < 0)
- return 0;
- if (statistics.num_played_sum - num * afsi->num_played
- > int_sqrt(statistics.num_played_qd * num))
- return 100;
- return -100;
-}
-
-static int mm_played_rarely_parser(const char *arg, __a_unused void **ignored)
-{
- if (arg && *arg)
- PARA_WARNING_LOG("ignored junk at eol: %s\n", arg);
- return 1;
-}
-
-static int mm_name_like_score_function(const char *path,
- __a_unused const struct afs_info *afsi,
- __a_unused const struct audio_format_info *afhi,
- const void *data)
-{
- if (fnmatch(data, path, 0))
- return -100;
- return 100;
-}
-
-static int mm_name_like_parser(const char *arg, void **data)
-{
- *data = para_strdup(arg);
- return 1;
-}
-
-static void mm_name_like_cleanup(void *data)
-{
- free(data);
-}
-
-static int mm_is_set_parser(const char *arg, void **bitnum)
-{
- unsigned char *c = para_malloc(1);
- int ret = get_attribute_bitnum_by_name(arg, c);
-
- if (ret >= 0)
- *bitnum = c;
- else
- free(c);
- return ret;
-}
-
-static int mm_is_set_score_function(__a_unused const char *path,
- __a_unused const struct afs_info *afsi,
- __a_unused const struct audio_format_info *afhi,
- const void *data)
-{
- const unsigned char *bn = data;
- if (afsi->attributes & (1ULL << *bn))
- return 100;
- return -100;
-}
-
-/* returns 1 if row matches score item, negative otherwise */
-static int add_item_score(const struct osl_row *row, struct mood_item *item, long *score,
- long *score_arg_sum)
-{
- struct afs_info afsi;
- struct audio_format_info afhi;
- char *path;
- int ret;
-
- *score_arg_sum += item->random_score? 100 : PARA_ABS(item->score_arg);
- ret = 100;
- if (item->method) {
- ret = get_afsi_of_row(row, &afsi);
- if (ret< 0)
- return ret;
- ret = get_afhi_of_row(row, &afhi);
- if (ret< 0)
- return ret;
- ret = get_audio_file_path_of_row(row, &path);
- if (ret< 0)
- return ret;
- ret = item->method->score_function(path, &afsi, &afhi,
- item->parser_data);
- if ((ret < 0 && !item->logical_not) || (ret >= 0 && item->logical_not))
- return -1; /* no match */
- }
- if (item->random_score)
- *score += PARA_ABS(ret) * para_random(100);
- else
- *score += PARA_ABS(ret) * item->score_arg;
- return 1;
-}
-
-static int compute_mood_score(const struct osl_row *aft_row, struct mood *m,
- long *result)
-{
- struct mood_item *item;
- int match = 0;
- long score_arg_sum = 0, score = 0;
-