Pass full argument list to mood parsers.
authorAndre Noll <maan@systemlinux.org>
Wed, 8 Jul 2009 19:59:39 +0000 (21:59 +0200)
committerAndre Noll <maan@systemlinux.org>
Wed, 8 Jul 2009 19:59:39 +0000 (21:59 +0200)
Currently, for each mood line only the first word after the mood method  is passed
to the mood parser. Passing all arguments allows for mood parsers that take more
than one argument.l

mood.c

diff --git a/mood.c b/mood.c
index cb1534b..a1ef816 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
  * 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.
  */
  *
  * \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.
 
 /**
  * Deallocate resources which were allocated by the mood_parser.
@@ -165,11 +165,10 @@ static uint64_t int_sqrt(uint64_t x)
        return res;
 }
 
        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,
 }
 
 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;
 }
 
        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,
 }
 
 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;
 }
 
        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;
 }
 
        return 1;
 }
 
@@ -226,16 +226,20 @@ static void mm_path_matches_cleanup(void *data)
        free(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,
 }
 
 static int mm_is_set_score_function(__a_unused const char *path,
@@ -476,8 +480,8 @@ check_for_if:
        ret = -E_MOOD_SYNTAX;
        if (!mood_methods[i].parser)
                goto out;
        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];
        if (ret < 0)
                goto out;
        mi->method = &mood_methods[i];