Pass full argument list to mood parsers.
[paraslash.git] / mood.c
diff --git a/mood.c b/mood.c
index 32a10e56503147819cbe0a27d3e2e96c1293de6e..a1ef816d7cb8d503fa1f69181da4011bd44460fa 100644 (file)
--- a/mood.c
+++ b/mood.c
@@ -63,11 +63,11 @@ typedef int mood_score_function(const char *path, const struct afs_info *afsi,
  * 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.
+ * store a pointer to its structure via the void** pointer.
  *
  * \sa mood_open(), mood_cleanup_function, mood_score_function.
  */
-typedef int mood_parser(const char *, void **);
+typedef int mood_parser(int, char **, void **);
 
 /**
  * Deallocate resources which were allocated by the mood_parser.
@@ -165,11 +165,10 @@ static uint64_t int_sqrt(uint64_t x)
        return res;
 }
 
-static int mm_no_attributes_set_parser(const char *arg, __a_unused void **ignored)
+static int mm_no_attributes_set_parser(int argc, __a_unused char **argv,
+               __a_unused void **ignored)
 {
-       if (arg && *arg)
-               PARA_WARNING_LOG("ignored junk at eol: %s\n", arg);
-       return 1;
+       return argc? -E_MOOD_SYNTAX : 1;
 }
 
 static int mm_no_attributes_set_score_function(__a_unused const char *path,
@@ -198,11 +197,10 @@ static int mm_played_rarely_score_function(__a_unused const char *path,
        return -100;
 }
 
-static int mm_played_rarely_parser(const char *arg, __a_unused void **ignored)
+static int mm_played_rarely_parser(int argc, __a_unused char **argv,
+               __a_unused void **ignored)
 {
-       if (arg && *arg)
-               PARA_WARNING_LOG("ignored junk at eol: %s\n", arg);
-       return 1;
+       return argc? -E_MOOD_SYNTAX : 1;
 }
 
 static int mm_path_matches_score_function(const char *path,
@@ -215,9 +213,11 @@ static int mm_path_matches_score_function(const char *path,
        return 100;
 }
 
-static int mm_path_matches_parser(const char *arg, void **data)
+static int mm_path_matches_parser(int argc, char **argv, void **data)
 {
-       *data = para_strdup(arg);
+       if (argc != 1)
+               return -E_MOOD_SYNTAX;
+       *data = para_strdup(argv[1]);
        return 1;
 }
 
@@ -226,16 +226,20 @@ static void mm_path_matches_cleanup(void *data)
        free(data);
 }
 
-static int mm_is_set_parser(const char *arg, void **bitnum)
+static int mm_is_set_parser(int argc, char **argv, void **bitnum)
 {
-       unsigned char *c = para_malloc(1);
-       int ret = get_attribute_bitnum_by_name(arg, c);
+       int ret;
+       unsigned char c, *res;
 
-       if (ret >= 0)
-               *bitnum = c;
-       else
-               free(c);
-       return ret;
+       if (argc != 1)
+               return -E_MOOD_SYNTAX;
+       ret = get_attribute_bitnum_by_name(argv[1], &c);
+       if (ret < 0)
+               return ret;
+       res = para_malloc(1);
+       *res = c;
+       *bitnum = res;
+       return 1;
 }
 
 static int mm_is_set_score_function(__a_unused const char *path,
@@ -393,17 +397,17 @@ static int parse_mood_line(char *mood_line, void *data)
 {
        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;
@@ -476,8 +480,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];
@@ -494,8 +498,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) {