From 8b0ab0837ecdd5d28c7b6f31a605552f6942ca64 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Wed, 8 Jul 2009 21:59:39 +0200 Subject: [PATCH] Pass full argument list to mood parsers. 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 | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/mood.c b/mood.c index cb1534bc..a1ef816d 100644 --- 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, @@ -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]; -- 2.30.2