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