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
* 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.
-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,
-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,
-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]);
-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,
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];