libpkgconf: fragment: pkgconf_fragment_parse: return false on parse failure

pull/144/head
William Pitcock 2017-09-19 21:48:53 -05:00
parent 72cf871421
commit 7ced8d77ae
3 changed files with 20 additions and 8 deletions

View File

@ -90,7 +90,7 @@ which is composable, mergeable and reorderable.
:param pkgconf_list_t* list: The `fragment list` to delete.
:return: nothing
.. c:function:: void pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value)
.. c:function:: bool pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value)
Parse a string into a `fragment list`.
@ -98,4 +98,4 @@ which is composable, mergeable and reorderable.
:param pkgconf_list_t* list: The `fragment list` to add the fragment entries to.
:param pkgconf_list_t* vars: A list of variables to use for variable substitution.
:param char* value: The string to parse into fragments.
:return: nothing
:return: true on success, false on parse error

View File

@ -600,7 +600,7 @@ pkgconf_fragment_free(pkgconf_list_t *list)
/*
* !doc
*
* .. c:function:: void pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value)
* .. c:function:: bool pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value)
*
* Parse a string into a `fragment list`.
*
@ -608,9 +608,9 @@ pkgconf_fragment_free(pkgconf_list_t *list)
* :param pkgconf_list_t* list: The `fragment list` to add the fragment entries to.
* :param pkgconf_list_t* vars: A list of variables to use for variable substitution.
* :param char* value: The string to parse into fragments.
* :return: nothing
* :return: true on success, false on parse error
*/
void
bool
pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value)
{
int i, ret, argc;
@ -622,12 +622,24 @@ pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkg
{
PKGCONF_TRACE(client, "unable to parse fragment string [%s]", repstr);
free(repstr);
return;
return false;
}
for (i = 0; i < argc && argv[i] != NULL; i++)
for (i = 0; i < argc; i++)
{
if (argv[i] == NULL)
{
PKGCONF_TRACE(client, "parsed fragment string is inconsistent: argc = %d while argv[%d] == NULL", argc, i);
pkgconf_argv_free(argv);
free(repstr);
return false;
}
pkgconf_fragment_add(client, list, argv[i]);
}
pkgconf_argv_free(argv);
free(repstr);
return true;
}

View File

@ -273,7 +273,7 @@ PKGCONF_API void pkgconf_argv_free(char **argv);
/* fragment.c */
typedef bool (*pkgconf_fragment_filter_func_t)(const pkgconf_client_t *client, const pkgconf_fragment_t *frag, void *data);
PKGCONF_API void pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value);
PKGCONF_API bool pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value);
PKGCONF_API void pkgconf_fragment_add(const pkgconf_client_t *client, pkgconf_list_t *list, const char *string);
PKGCONF_API void pkgconf_fragment_copy(const pkgconf_client_t *client, pkgconf_list_t *list, const pkgconf_fragment_t *base, bool is_private);
PKGCONF_API void pkgconf_fragment_delete(pkgconf_list_t *list, pkgconf_fragment_t *node);