Shared code for xbps_find_{string,pkgname,pkgpattern}_in_array().
This commit is contained in:
parent
22d67bcfb9
commit
41341af135
163
lib/plist.c
163
lib/plist.c
@ -234,7 +234,7 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static prop_dictionary_t
|
static prop_dictionary_t
|
||||||
find_virtual_pkg(prop_dictionary_t d,
|
find_virtual_pkg_in_dict(prop_dictionary_t d,
|
||||||
const char *key,
|
const char *key,
|
||||||
const char *str,
|
const char *str,
|
||||||
bool bypattern)
|
bool bypattern)
|
||||||
@ -264,34 +264,47 @@ find_virtual_pkg(prop_dictionary_t d,
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
prop_dictionary_t
|
static prop_dictionary_t
|
||||||
xbps_find_pkg_in_dict_by_name(prop_dictionary_t dict,
|
find_pkg_in_dict(prop_dictionary_t d,
|
||||||
const char *key,
|
const char *key,
|
||||||
const char *pkgname)
|
const char *str,
|
||||||
|
bool bypattern)
|
||||||
{
|
{
|
||||||
prop_object_iterator_t iter;
|
prop_object_iterator_t iter;
|
||||||
prop_object_t obj = NULL;
|
prop_object_t obj = NULL;
|
||||||
const char *dpkgn;
|
const char *dpkgn, *pkgver;
|
||||||
|
|
||||||
assert(dict != NULL);
|
assert(d != NULL);
|
||||||
assert(pkgname != NULL);
|
assert(str != NULL);
|
||||||
assert(key != NULL);
|
assert(key != NULL);
|
||||||
|
|
||||||
if ((iter = xbps_get_array_iter_from_dict(dict, key)) == NULL)
|
if ((iter = xbps_get_array_iter_from_dict(d, key)) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
while ((obj = prop_object_iterator_next(iter))) {
|
while ((obj = prop_object_iterator_next(iter))) {
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "pkgname", &dpkgn);
|
if (bypattern) {
|
||||||
if (strcmp(dpkgn, pkgname) == 0)
|
prop_dictionary_get_cstring_nocopy(obj,
|
||||||
|
"pkgver", &pkgver);
|
||||||
|
if (xbps_pkgpattern_match(pkgver, __UNCONST(str)))
|
||||||
break;
|
break;
|
||||||
|
} else {
|
||||||
|
prop_dictionary_get_cstring_nocopy(obj,
|
||||||
|
"pkgname", &dpkgn);
|
||||||
|
if (strcmp(dpkgn, str) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
prop_object_iterator_release(iter);
|
prop_object_iterator_release(iter);
|
||||||
if (obj == NULL) {
|
if (obj == NULL) {
|
||||||
/*
|
/*
|
||||||
* If a package couldn't be found by its name, try looking
|
* No pkg was found, try virtual package by name
|
||||||
* for a package providing a virtual package, i.e "provides".
|
* or by pattern.
|
||||||
*/
|
*/
|
||||||
obj = find_virtual_pkg(dict, key, pkgname, false);
|
if (bypattern)
|
||||||
|
obj = find_virtual_pkg_in_dict(d, key, str, true);
|
||||||
|
else
|
||||||
|
obj = find_virtual_pkg_in_dict(d, key, str, false);
|
||||||
|
|
||||||
if (obj == NULL) {
|
if (obj == NULL) {
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -301,46 +314,24 @@ xbps_find_pkg_in_dict_by_name(prop_dictionary_t dict,
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prop_dictionary_t
|
||||||
|
xbps_find_pkg_in_dict_by_name(prop_dictionary_t dict,
|
||||||
|
const char *key,
|
||||||
|
const char *pkgname)
|
||||||
|
{
|
||||||
|
return find_pkg_in_dict(dict, key, pkgname, false);
|
||||||
|
}
|
||||||
|
|
||||||
prop_dictionary_t
|
prop_dictionary_t
|
||||||
xbps_find_pkg_in_dict_by_pattern(prop_dictionary_t dict,
|
xbps_find_pkg_in_dict_by_pattern(prop_dictionary_t dict,
|
||||||
const char *key,
|
const char *key,
|
||||||
const char *pattern)
|
const char *pattern)
|
||||||
{
|
{
|
||||||
prop_object_iterator_t iter;
|
return find_pkg_in_dict(dict, key, pattern, true);
|
||||||
prop_object_t obj = NULL;
|
|
||||||
const char *pkgver;
|
|
||||||
|
|
||||||
assert(dict != NULL);
|
|
||||||
assert(key != NULL);
|
|
||||||
assert(pattern != NULL);
|
|
||||||
|
|
||||||
if ((iter = xbps_get_array_iter_from_dict(dict, key)) == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
while ((obj = prop_object_iterator_next(iter))) {
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver);
|
|
||||||
if (xbps_pkgpattern_match(pkgver, __UNCONST(pattern)))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
prop_object_iterator_release(iter);
|
|
||||||
if (obj == NULL) {
|
|
||||||
/*
|
|
||||||
* If a package couldn't be found by a pattern, try looking
|
|
||||||
* for a package providing a virtual package pattern via
|
|
||||||
* "provides".
|
|
||||||
*/
|
|
||||||
obj = find_virtual_pkg(dict, key, pattern, true);
|
|
||||||
if (obj == NULL) {
|
|
||||||
errno = ENOENT;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
static bool
|
||||||
xbps_find_pkgname_in_array(prop_array_t array, const char *pkgname)
|
find_string_in_array(prop_array_t array, const char *str, int mode)
|
||||||
{
|
{
|
||||||
prop_object_iterator_t iter;
|
prop_object_iterator_t iter;
|
||||||
prop_object_t obj;
|
prop_object_t obj;
|
||||||
@ -357,74 +348,54 @@ xbps_find_pkgname_in_array(prop_array_t array, const char *pkgname)
|
|||||||
|
|
||||||
while ((obj = prop_object_iterator_next(iter))) {
|
while ((obj = prop_object_iterator_next(iter))) {
|
||||||
assert(prop_object_type(obj) == PROP_TYPE_STRING);
|
assert(prop_object_type(obj) == PROP_TYPE_STRING);
|
||||||
|
if (mode == 0) {
|
||||||
|
/* match by string */
|
||||||
|
if (prop_string_equals_cstring(obj, str)) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (mode == 1) {
|
||||||
|
/* match by pkgname */
|
||||||
pkgdep = prop_string_cstring_nocopy(obj);
|
pkgdep = prop_string_cstring_nocopy(obj);
|
||||||
curpkgname = xbps_get_pkg_name(pkgdep);
|
curpkgname = xbps_get_pkg_name(pkgdep);
|
||||||
if (curpkgname == NULL)
|
if (curpkgname == NULL)
|
||||||
break;
|
break;
|
||||||
if (strcmp(curpkgname, pkgname) == 0) {
|
if (strcmp(curpkgname, str) == 0) {
|
||||||
free(curpkgname);
|
free(curpkgname);
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
free(curpkgname);
|
free(curpkgname);
|
||||||
|
} else if (mode == 2) {
|
||||||
|
/* match by pkgpattern */
|
||||||
|
pkgdep = prop_string_cstring_nocopy(obj);
|
||||||
|
if (xbps_pkgpattern_match(pkgdep, __UNCONST(str))) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
prop_object_iterator_release(iter);
|
prop_object_iterator_release(iter);
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
xbps_find_string_in_array(prop_array_t array, const char *str)
|
||||||
|
{
|
||||||
|
return find_string_in_array(array, str, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
xbps_find_pkgname_in_array(prop_array_t array, const char *pkgname)
|
||||||
|
{
|
||||||
|
return find_string_in_array(array, pkgname, 1);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
xbps_find_pkgpattern_in_array(prop_array_t array, const char *pattern)
|
xbps_find_pkgpattern_in_array(prop_array_t array, const char *pattern)
|
||||||
{
|
{
|
||||||
prop_object_iterator_t iter;
|
return find_string_in_array(array, pattern, 2);
|
||||||
prop_object_t obj;
|
|
||||||
const char *curpkgdep;
|
|
||||||
bool found = false;
|
|
||||||
|
|
||||||
assert(array != NULL);
|
|
||||||
assert(pattern != NULL);
|
|
||||||
|
|
||||||
iter = prop_array_iterator(array);
|
|
||||||
if (iter == NULL)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
while ((obj = prop_object_iterator_next(iter))) {
|
|
||||||
assert(prop_object_type(obj) == PROP_TYPE_STRING);
|
|
||||||
curpkgdep = prop_string_cstring_nocopy(obj);
|
|
||||||
if (xbps_pkgpattern_match(curpkgdep, __UNCONST(pattern))) {
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
prop_object_iterator_release(iter);
|
|
||||||
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
xbps_find_string_in_array(prop_array_t array, const char *val)
|
|
||||||
{
|
|
||||||
prop_object_iterator_t iter;
|
|
||||||
prop_object_t obj;
|
|
||||||
bool found = false;
|
|
||||||
|
|
||||||
assert(array != NULL);
|
|
||||||
assert(val != NULL);
|
|
||||||
|
|
||||||
iter = prop_array_iterator(array);
|
|
||||||
if (iter == NULL)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
|
||||||
assert(prop_object_type(obj) == PROP_TYPE_STRING);
|
|
||||||
if (prop_string_equals_cstring(obj, val)) {
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
prop_object_iterator_release(iter);
|
|
||||||
|
|
||||||
return found;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
prop_object_iterator_t
|
prop_object_iterator_t
|
||||||
|
Loading…
Reference in New Issue
Block a user