aboutsummaryrefslogtreecommitdiff
path: root/libpkgconf
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2018-06-06 15:41:51 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2018-06-06 15:41:51 +0300
commit9fcd9687814f12770487d03dd0a61d42fc6ad693 (patch)
treefa44411615f6bdc87eea6872de8f3cdd469d63e4 /libpkgconf
parent034f19cda78286fc676bb4a6116a66f7d5edd453 (diff)
Merge with 1.4.2 upstream package version
Diffstat (limited to 'libpkgconf')
-rw-r--r--libpkgconf/fragment.c54
-rw-r--r--libpkgconf/pkg.c33
2 files changed, 61 insertions, 26 deletions
diff --git a/libpkgconf/fragment.c b/libpkgconf/fragment.c
index 1ea91ee..5b686f5 100644
--- a/libpkgconf/fragment.c
+++ b/libpkgconf/fragment.c
@@ -386,15 +386,19 @@ pkgconf_fragment_filter(const pkgconf_client_t *client, pkgconf_list_t *dest, pk
}
}
-static inline bool
-fragment_should_quote(const pkgconf_fragment_t *frag)
+static inline char *
+fragment_quote(const pkgconf_fragment_t *frag)
{
- const char *src;
+ const char *src = frag->data;
+ ssize_t outlen = strlen(src) + 10;
+ char *out, *dst;
if (frag->data == NULL)
- return false;
+ return NULL;
+
+ out = dst = calloc(outlen, 1);
- for (src = frag->data; *src; src++)
+ for (; *src; src++)
{
if (((*src < ' ') ||
(*src >= (' ' + (frag->merged ? 1 : 0)) && *src < '$') ||
@@ -406,10 +410,19 @@ fragment_should_quote(const pkgconf_fragment_t *frag)
(*src == '`') ||
(*src > 'z' && *src < '~') ||
(*src > '~')))
- return true;
+ *dst++ = '\\';
+
+ *dst++ = *src;
+
+ if ((ptrdiff_t)(dst - out) + 2 > outlen)
+ {
+ outlen *= 2;
+ out = realloc(out, outlen);
+ }
}
- return false;
+ *dst = 0;
+ return out;
}
static inline size_t
@@ -422,10 +435,9 @@ pkgconf_fragment_len(const pkgconf_fragment_t *frag)
if (frag->data != NULL)
{
- len += strlen(frag->data);
-
- if (fragment_should_quote(frag))
- len += 2;
+ char *quoted = fragment_quote(frag);
+ len += strlen(quoted);
+ free(quoted);
}
return len;
@@ -462,13 +474,13 @@ fragment_render_buf(const pkgconf_list_t *list, char *buf, size_t buflen, bool e
{
const pkgconf_fragment_t *frag = node->data;
size_t buf_remaining = buflen - (bptr - buf);
- bool should_quote = fragment_should_quote(frag);
+ char *quoted = fragment_quote(frag);
- if (pkgconf_fragment_len(frag) > buf_remaining)
+ if (strlen(quoted) > buf_remaining)
+ {
+ free(quoted);
break;
-
- if (should_quote)
- *bptr++ = '\'';
+ }
if (frag->type)
{
@@ -476,11 +488,11 @@ fragment_render_buf(const pkgconf_list_t *list, char *buf, size_t buflen, bool e
*bptr++ = frag->type;
}
- if (frag->data)
- bptr += pkgconf_strlcpy(bptr, frag->data, buf_remaining);
-
- if (should_quote)
- *bptr++ = '\'';
+ if (quoted != NULL)
+ {
+ bptr += pkgconf_strlcpy(bptr, quoted, buf_remaining);
+ free(quoted);
+ }
*bptr++ = ' ';
}
diff --git a/libpkgconf/pkg.c b/libpkgconf/pkg.c
index 6918d6d..0feb4d6 100644
--- a/libpkgconf/pkg.c
+++ b/libpkgconf/pkg.c
@@ -884,15 +884,25 @@ static pkgconf_pkg_t pkg_config_virtual = {
.flags = PKGCONF_PKG_PROPF_STATIC,
.vars = {
.head = &(pkgconf_node_t){
- .prev = NULL,
- .next = NULL,
+ .next = &(pkgconf_node_t){
+ .next = &(pkgconf_node_t){
+ .data = &(pkgconf_tuple_t){
+ .key = "pc_system_libdirs",
+ .value = SYSTEM_LIBDIR,
+ }
+ },
+ .data = &(pkgconf_tuple_t){
+ .key = "pc_system_includedirs",
+ .value = SYSTEM_INCLUDEDIR,
+ }
+ },
.data = &(pkgconf_tuple_t){
.key = "pc_path",
.value = PKG_DEFAULT_PATH,
},
},
.tail = NULL,
- },
+ }
};
static pkgconf_pkg_t pkgconf_virtual = {
@@ -904,8 +914,18 @@ static pkgconf_pkg_t pkgconf_virtual = {
.flags = PKGCONF_PKG_PROPF_STATIC,
.vars = {
.head = &(pkgconf_node_t){
- .prev = NULL,
- .next = NULL,
+ .next = &(pkgconf_node_t){
+ .next = &(pkgconf_node_t){
+ .data = &(pkgconf_tuple_t){
+ .key = "pc_system_libdirs",
+ .value = SYSTEM_LIBDIR,
+ }
+ },
+ .data = &(pkgconf_tuple_t){
+ .key = "pc_system_includedirs",
+ .value = SYSTEM_INCLUDEDIR,
+ }
+ },
.data = &(pkgconf_tuple_t){
.key = "pc_path",
.value = PKG_DEFAULT_PATH,
@@ -1241,7 +1261,10 @@ pkgconf_pkg_scan_providers(pkgconf_client_t *client, pkgconf_dependency_t *pkgde
pkg = pkgconf_scan_all(client, &ctx, (pkgconf_pkg_iteration_func_t) pkgconf_pkg_scan_provides_entry);
if (pkg != NULL)
+ {
+ pkgdep->match = pkgconf_pkg_ref(client, pkg);
return pkg;
+ }
if (eflags != NULL)
*eflags |= PKGCONF_PKG_ERRF_PACKAGE_NOT_FOUND;