forked from ariadne/pkgconf
Merge branch 'fix-slashes' of nacho/pkgconf into master
commit
ccd2440cde
|
@ -86,3 +86,4 @@
|
||||||
#mesondefine PKG_DEFAULT_PATH
|
#mesondefine PKG_DEFAULT_PATH
|
||||||
#mesondefine SYSTEM_INCLUDEDIR
|
#mesondefine SYSTEM_INCLUDEDIR
|
||||||
#mesondefine SYSTEM_LIBDIR
|
#mesondefine SYSTEM_LIBDIR
|
||||||
|
#mesondefine PERSONALITY_PATH
|
||||||
|
|
|
@ -17,6 +17,10 @@
|
||||||
#include <libpkgconf/libpkgconf.h>
|
#include <libpkgconf/libpkgconf.h>
|
||||||
#include <libpkgconf/config.h>
|
#include <libpkgconf/config.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# define strcasecmp _stricmp
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool default_personality_init = false;
|
static bool default_personality_init = false;
|
||||||
static pkgconf_cross_personality_t default_personality = {
|
static pkgconf_cross_personality_t default_personality = {
|
||||||
.name = "default",
|
.name = "default",
|
||||||
|
|
|
@ -188,22 +188,74 @@ determine_prefix(const pkgconf_pkg_t *pkg, char *buf, size_t buflen)
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
remove_additional_separators(char *buf)
|
||||||
|
{
|
||||||
|
char *p = buf;
|
||||||
|
|
||||||
|
while (*p) {
|
||||||
|
if (*p == '/') {
|
||||||
|
char *q;
|
||||||
|
|
||||||
|
q = ++p;
|
||||||
|
while (*q && *q == '/')
|
||||||
|
q++;
|
||||||
|
|
||||||
|
if (p != q)
|
||||||
|
memmove (p, q, strlen (q) + 1);
|
||||||
|
} else {
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
canonicalize_path(char *buf)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
char *p = buf;
|
||||||
|
|
||||||
|
while (*p) {
|
||||||
|
if (*p == '\\')
|
||||||
|
*p = '/';
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
remove_additional_separators(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_path_prefix_equal(const char *path1, const char *path2, size_t path2_len)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
return !_strnicmp(path1, path2, path2_len);
|
||||||
|
#else
|
||||||
|
return !strncmp(path1, path2, path2_len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
pkgconf_pkg_parser_value_set(pkgconf_pkg_t *pkg, const size_t lineno, const char *keyword, char *value)
|
pkgconf_pkg_parser_value_set(pkgconf_pkg_t *pkg, const size_t lineno, const char *keyword, char *value)
|
||||||
{
|
{
|
||||||
|
char canonicalized_value[PKGCONF_ITEM_SIZE];
|
||||||
|
|
||||||
(void) lineno;
|
(void) lineno;
|
||||||
|
|
||||||
|
pkgconf_strlcpy(canonicalized_value, value, sizeof canonicalized_value);
|
||||||
|
canonicalize_path(canonicalized_value);
|
||||||
|
|
||||||
/* Some pc files will use absolute paths for all of their directories
|
/* Some pc files will use absolute paths for all of their directories
|
||||||
* which is broken when redefining the prefix. We try to outsmart the
|
* which is broken when redefining the prefix. We try to outsmart the
|
||||||
* file and rewrite any directory that starts with the same prefix.
|
* file and rewrite any directory that starts with the same prefix.
|
||||||
*/
|
*/
|
||||||
if (pkg->owner->flags & PKGCONF_PKG_PKGF_REDEFINE_PREFIX && pkg->orig_prefix
|
if (pkg->owner->flags & PKGCONF_PKG_PKGF_REDEFINE_PREFIX && pkg->orig_prefix
|
||||||
&& !strncmp(value, pkg->orig_prefix->value, strlen(pkg->orig_prefix->value)))
|
&& is_path_prefix_equal(canonicalized_value, pkg->orig_prefix->value, strlen(pkg->orig_prefix->value)))
|
||||||
{
|
{
|
||||||
char newvalue[PKGCONF_ITEM_SIZE];
|
char newvalue[PKGCONF_ITEM_SIZE];
|
||||||
|
|
||||||
pkgconf_strlcpy(newvalue, pkg->prefix->value, sizeof newvalue);
|
pkgconf_strlcpy(newvalue, pkg->prefix->value, sizeof newvalue);
|
||||||
pkgconf_strlcat(newvalue, value + strlen(pkg->orig_prefix->value), sizeof newvalue);
|
pkgconf_strlcat(newvalue, canonicalized_value + strlen(pkg->orig_prefix->value), sizeof newvalue);
|
||||||
pkgconf_tuple_add(pkg->owner, &pkg->vars, keyword, newvalue, false);
|
pkgconf_tuple_add(pkg->owner, &pkg->vars, keyword, newvalue, false);
|
||||||
}
|
}
|
||||||
else if (strcmp(keyword, pkg->owner->prefix_varname) || !(pkg->owner->flags & PKGCONF_PKG_PKGF_REDEFINE_PREFIX))
|
else if (strcmp(keyword, pkg->owner->prefix_varname) || !(pkg->owner->flags & PKGCONF_PKG_PKGF_REDEFINE_PREFIX))
|
||||||
|
@ -215,7 +267,7 @@ pkgconf_pkg_parser_value_set(pkgconf_pkg_t *pkg, const size_t lineno, const char
|
||||||
|
|
||||||
if (relvalue != NULL)
|
if (relvalue != NULL)
|
||||||
{
|
{
|
||||||
pkg->orig_prefix = pkgconf_tuple_add(pkg->owner, &pkg->vars, "orig_prefix", value, true);
|
pkg->orig_prefix = pkgconf_tuple_add(pkg->owner, &pkg->vars, "orig_prefix", canonicalized_value, true);
|
||||||
pkg->prefix = pkgconf_tuple_add(pkg->owner, &pkg->vars, keyword, relvalue, false);
|
pkg->prefix = pkgconf_tuple_add(pkg->owner, &pkg->vars, keyword, relvalue, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue