]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 'master' into next
authorAndre Noll <maan@systemlinux.org>
Sun, 6 Sep 2009 20:23:58 +0000 (22:23 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 6 Sep 2009 20:23:58 +0000 (22:23 +0200)
1  2 
filter.c
mood.c

diff --combined filter.c
index 1ea7ac89f259b83fe5da9b0246e7b4215b61cf72,98cef2fa71a0b79fe1d88d8f6463ef00e75a493e..7dbc07851b00c78de96b4889663286f468611398
+++ b/filter.c
@@@ -6,9 -6,8 +6,9 @@@
  
  /** \file filter.c The stand-alone filter program. */
  
 -#include "para.h"
 +#include <regex.h>
  
 +#include "para.h"
  #include "filter.cmdline.h"
  #include "list.h"
  #include "sched.h"
@@@ -187,8 -186,8 +187,8 @@@ int main(int argc, char *argv[]
        sot->input_error = &fc->task.error;
  
        register_task(&sit->task);
-       register_task(&fc->task);
        register_task(&sot->task);
+       register_task(&fc->task);
        s.default_timeout.tv_sec = 1;
        s.default_timeout.tv_usec = 0;
        ret = schedule(&s);
diff --combined mood.c
index b5047d3745056703b8afab1ac85e81777cadaca7,9f1d7745a3589565045b919af94ad02b3f73602d..fe8ee8ad9915cdc3db089a8f8584883537963111
--- 1/mood.c
--- 2/mood.c
+++ b/mood.c
@@@ -6,9 -6,7 +6,9 @@@
  
  /** \file mood.c Paraslash's mood handling functions. */
  
 -#include <fnmatch.h>
 +#include <regex.h>
 +#include <osl.h>
 +
  #include "para.h"
  #include "error.h"
  #include "string.h"
@@@ -16,7 -14,6 +16,7 @@@
  #include "afs.h"
  #include "list.h"
  #include "ipc.h"
 +#include "mm.h"
  
  /**
   * Contains statistical data of the currently admissible audio files.
@@@ -35,7 -32,67 +35,7 @@@ struct afs_statistics 
        /** Number of admissible files */
        unsigned num;
  };
 -struct afs_statistics statistics;
 -
 -/**
 - * Assign scores according to a mood_method.
 - *
 - * Each mood_method has its own mood_score_function. The first three parameters
 - * passed to that function are informations about the audio file whose score is
 - * to be computed. The data argument depends on the mood method this function
 - * is used for. It usually is the argument given at the end of a mood line.
 - *
 - * Mood score functions must return values between -100 and +100 inclusively.
 - * Boolean score functions should always return either -100 or +100.
 - *
 - * \sa struct mood_method, mood_parser.
 - */
 -typedef int mood_score_function(const char *path, const struct afs_info *afsi,
 -              const struct afh_info *afhi, const void *data);
 -
 -/**
 - * Pre-process a mood line.
 - *
 - * The mood_parser of a mood_method is called once at mood open time for each
 - * line of the current mood definition that contains the mood_method's name as
 - * a keyword. The line is passed to the mood_parser as the first argument. The
 - * mood_parser must determine whether the line is syntactically correct and
 - * return a positive value if so and a negative value otherwise.
 - *
 - * Some mood parsers pre-process the data given in the mood line to compute a
 - * structure which depends of the particular mood_method and which is used
 - * later in the mood_score_function of the mood_method. The mood_parser may
 - * store a pointer to its structure via the second argument.
 - *
 - * \sa mood_open(), mood_cleanup_function, mood_score_function.
 - */
 -typedef int mood_parser(const char *, void **);
 -
 -/**
 - * Deallocate resources which were allocated by the mood_parser.
 - *
 - * This optional function of a mood_method is used to free any resources
 - * allocated in mood_open() by the mood_parser. The argument passed is a
 - * pointer to the mood_method specific data structure that was returned by the
 - * mood_parser.
 - *
 - * \sa mood_parser.
 - */
 -typedef void mood_cleanup_function(void *);
 -
 -/**
 - * Used for scoring and to determine whether a file is admissible.
 - */
 -struct mood_method {
 -      /** The name of the method. */
 -      const char *name;
 -      /** Pointer to the mood parser. */
 -      mood_parser *parser;
 -      /** Pointer to the score function */
 -      mood_score_function *score_function;
 -      /** Optional cleanup function. */
 -      mood_cleanup_function *cleanup;
 -};
 +static struct afs_statistics statistics;
  
  /**
   * Each line of the current mood corresponds to a mood_item.
@@@ -107,17 -164,113 +107,17 @@@ static uint64_t int_sqrt(uint64_t x
        return res;
  }
  
 -static int mm_no_attributes_set_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_no_attributes_set_score_function(__a_unused const char *path,
 -              const struct afs_info *afsi,
 -              __a_unused const struct afh_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 afh_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_path_matches_score_function(const char *path,
 -              __a_unused const struct afs_info *afsi,
 -              __a_unused const struct afh_info *afhi,
 -              const void *data)
 -{
 -      if (fnmatch(data, path, 0))
 -              return -100;
 -      return 100;
 -}
 -
 -static int mm_path_matches_parser(const char *arg, void **data)
 +/* returns 1 if row matches score item, 0 if not. */
 +static int get_item_score(struct mood_item *item, const struct afs_info *afsi,
 +              const struct afh_info *afhi, const char *path, long *score,
 +              long *score_arg_sum)
  {
 -      *data = para_strdup(arg);
 -      return 1;
 -}
 -
 -static void mm_path_matches_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 afh_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, 0 if not, negative on errors */
 -static int get_item_score(const struct osl_row *row, struct mood_item *item,
 -              long *score, long *score_arg_sum)
 -{
 -      struct afs_info afsi;
 -      struct afh_info afhi;
 -      char *path;
        int ret, match = 1;
  
        *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;
 -              free(afhi.info_string); /* don't need the tag info */
 -              ret = get_audio_file_path_of_row(row, &path);
 -              if (ret< 0)
 -                      return ret;
 -              ret = item->method->score_function(path, &afsi, &afhi,
 +              ret = item->method->score_function(path, afsi, afhi,
                        item->parser_data);
                if ((ret < 0 && !item->logical_not) || (ret >= 0 && item->logical_not))
                        match = 0; /* no match */
@@@ -136,32 -289,24 +136,32 @@@ static int compute_mood_score(const str
        struct mood_item *item;
        int ret, match = 0;
        long score_arg_sum = 0, score = 0, item_score;
 +      struct afs_info afsi;
 +      struct afh_info afhi;
 +      char *path;
  
        if (!m)
                return -E_NO_MOOD;
 +      ret = get_afsi_of_row(aft_row, &afsi);
 +      if (ret< 0)
 +              return ret;
 +      ret = get_afhi_of_row(aft_row, &afhi);
 +      if (ret< 0)
 +              return ret;
 +      ret = get_audio_file_path_of_row(aft_row, &path);
 +      if (ret< 0)
 +              return ret;
        /* reject audio file if it matches any entry in the deny list */
        list_for_each_entry(item, &m->deny_list, mood_item_node) {
 -              ret = get_item_score(aft_row, item, &item_score,
 +              ret = get_item_score(item, &afsi, &afhi, path, &item_score,
                        &score_arg_sum);
 -              if (ret < 0)
 -                      return ret;
                if (ret > 0) /* not admissible */
                        return 0;
                score += item_score;
        }
        list_for_each_entry(item, &m->accept_list, mood_item_node) {
 -              ret = get_item_score(aft_row, item, &item_score,
 +              ret = get_item_score(item, &afsi, &afhi, path, &item_score,
                        &score_arg_sum);
 -              if (ret < 0)
 -                      return ret;
                if (ret == 0)
                        continue;
                match = 1;
        if (!match && !list_empty(&m->accept_list))
                return 0;
        list_for_each_entry(item, &m->score_list, mood_item_node) {
 -              ret = get_item_score(aft_row, item, &item_score,
 +              ret = get_item_score(item, &afsi, &afhi, path, &item_score,
                        &score_arg_sum);
 -              if (ret < 0)
 -                      return ret;
                score += item_score;
        }
        if (score_arg_sum)
        return 1;
  }
  
 -#define DEFINE_MOOD_METHOD(_name) \
 -.parser = mm_ ## _name ## _parser, \
 -.score_function = mm_ ## _name ## _score_function, \
 -.name = #_name
 -
 -#define DEFINE_MOOD_METHOD_WITH_CLEANUP(_name) \
 -      DEFINE_MOOD_METHOD(_name), \
 -      .cleanup = mm_ ## _name ## _cleanup
 -
 -static const struct mood_method mood_methods[] = {
 -      {DEFINE_MOOD_METHOD(no_attributes_set)},
 -      {DEFINE_MOOD_METHOD(played_rarely)},
 -      {DEFINE_MOOD_METHOD(is_set)},
 -      {DEFINE_MOOD_METHOD_WITH_CLEANUP(path_matches)},
 -      {.parser = NULL}
 -};
 -
  static void cleanup_list_entry(struct mood_item *item)
  {
        if (item->method && item->method->cleanup)
@@@ -248,17 -412,17 +248,17 @@@ static int parse_mood_line(char *mood_l
  {
        struct mood_line_parser_data *mlpd = data;
        char **argv;
 -      char *delim = " \t";
        unsigned num_words;
        char **w;
        int i, ret;
        enum mood_line_type mlt = ML_INVALID;
        struct mood_item *mi = NULL;
 -      char *buf = para_strdup(mood_line);
  
        mlpd->line_num++;
 -      num_words = split_args(buf, &argv, delim);
 -      ret = 1;
 +      ret = create_argv(mood_line, " \t", &argv);
 +      if (ret < 0)
 +              return ret;
 +      num_words = ret;
        if (!num_words) /* empty line */
                goto out;
        w = argv;
@@@ -331,8 -495,8 +331,8 @@@ check_for_if
        ret = -E_MOOD_SYNTAX;
        if (!mood_methods[i].parser)
                goto out;
 -      w++;
 -      ret = mood_methods[i].parser(*w, &mi->parser_data);
 +      ret = mood_methods[i].parser(num_words - 1 - (w - argv), w,
 +              &mi->parser_data);
        if (ret < 0)
                goto out;
        mi->method = &mood_methods[i];
@@@ -349,7 -513,8 +349,7 @@@ success
                (mlt == ML_DENY? "deny" : "score"), mi->method);
        ret = 1;
  out:
 -      free(argv);
 -      free(buf);
 +      free_argv(argv);
        if (ret >= 0)
                return ret;
        if (mi) {
@@@ -796,6 -961,7 +796,6 @@@ void close_current_mood(void
        memset(&statistics, 0, sizeof(statistics));
  }
  
 -
  /**
   * Change the current mood.
   *
@@@ -827,7 -993,7 +827,7 @@@ int change_current_mood(char *mood_name
                        .data = mood_name,
                        .size = strlen(mood_name) + 1
                };
 -              ret = osl_get_row(moods_table, BLOBCOL_NAME, &obj, &row);
 +              ret = osl(osl_get_row(moods_table, BLOBCOL_NAME, &obj, &row));
                if (ret < 0) {
                        PARA_NOTICE_LOG("no such mood: %s\n", mood_name);
                        return ret;
@@@ -893,7 -1059,9 +893,9 @@@ int reload_current_mood(void
  int moods_event_handler(enum afs_events event, __a_unused struct para_buffer *pb,
                void *data)
  {
-       switch(event) {
+       if (!current_mood)
+               return 0;
+       switch (event) {
        /*
         * The three blob events might change the set of admissible files,
         * so we must reload the score list.