forked from ariadne/pkgconf
libpkgconf: refactor some path operations
parent
082fd4af24
commit
f4da1082cb
|
@ -87,7 +87,8 @@ libpkgconf_la_SOURCES = \
|
||||||
libpkgconf/fileio.c \
|
libpkgconf/fileio.c \
|
||||||
libpkgconf/tuple.c \
|
libpkgconf/tuple.c \
|
||||||
libpkgconf/dependency.c \
|
libpkgconf/dependency.c \
|
||||||
libpkgconf/queue.c
|
libpkgconf/queue.c \
|
||||||
|
libpkgconf/path.c
|
||||||
libpkgconf_la_LDFLAGS = -version-info 1:0:0
|
libpkgconf_la_LDFLAGS = -version-info 1:0:0
|
||||||
# -export-symbols-regex '^pkgconf_'
|
# -export-symbols-regex '^pkgconf_'
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,19 @@
|
||||||
#include <libpkgconf/iter.h>
|
#include <libpkgconf/iter.h>
|
||||||
#include <libpkgconf/bsdstubs.h>
|
#include <libpkgconf/bsdstubs.h>
|
||||||
|
|
||||||
|
/* pkg-config uses ';' on win32 as ':' is part of path */
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define PKG_CONFIG_PATH_SEP_S ";"
|
||||||
|
#else
|
||||||
|
#define PKG_CONFIG_PATH_SEP_S ":"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define PKG_DIR_SEP_S '\\'
|
||||||
|
#else
|
||||||
|
#define PKG_DIR_SEP_S '/'
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PKGCONF_BUFSIZE (65535)
|
#define PKGCONF_BUFSIZE (65535)
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -39,6 +52,7 @@ typedef struct pkgconf_pkg_ pkgconf_pkg_t;
|
||||||
typedef struct pkgconf_dependency_ pkgconf_dependency_t;
|
typedef struct pkgconf_dependency_ pkgconf_dependency_t;
|
||||||
typedef struct pkgconf_tuple_ pkgconf_tuple_t;
|
typedef struct pkgconf_tuple_ pkgconf_tuple_t;
|
||||||
typedef struct pkgconf_fragment_ pkgconf_fragment_t;
|
typedef struct pkgconf_fragment_ pkgconf_fragment_t;
|
||||||
|
typedef struct pkgconf_path_ pkgconf_path_t;
|
||||||
|
|
||||||
#define PKGCONF_ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
|
#define PKGCONF_ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
|
||||||
|
|
||||||
|
@ -74,6 +88,12 @@ struct pkgconf_tuple_ {
|
||||||
char *value;
|
char *value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct pkgconf_path_ {
|
||||||
|
pkgconf_node_t lnode;
|
||||||
|
|
||||||
|
char *path;
|
||||||
|
};
|
||||||
|
|
||||||
#define PKGCONF_PKG_PROPF_NONE 0x0
|
#define PKGCONF_PKG_PROPF_NONE 0x0
|
||||||
#define PKGCONF_PKG_PROPF_VIRTUAL 0x1
|
#define PKGCONF_PKG_PROPF_VIRTUAL 0x1
|
||||||
#define PKGCONF_PKG_PROPF_CACHED 0x2
|
#define PKGCONF_PKG_PROPF_CACHED 0x2
|
||||||
|
@ -215,4 +235,8 @@ void pkgconf_audit_open_log(FILE *auditf);
|
||||||
void pkgconf_audit_log(const char *format, ...) PRINTFLIKE(1, 2);
|
void pkgconf_audit_log(const char *format, ...) PRINTFLIKE(1, 2);
|
||||||
void pkgconf_audit_log_dependency(const pkgconf_pkg_t *dep, const pkgconf_dependency_t *depnode);
|
void pkgconf_audit_log_dependency(const pkgconf_pkg_t *dep, const pkgconf_dependency_t *depnode);
|
||||||
|
|
||||||
|
/* path.c */
|
||||||
|
void pkgconf_path_add(const char *text, pkgconf_list_t *dirlist);
|
||||||
|
size_t pkgconf_path_split(const char *text, pkgconf_list_t *dirlist);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* path.c
|
||||||
|
* filesystem path management
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016 pkgconf authors (see AUTHORS).
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* This software is provided 'as is' and without any warranty, express or
|
||||||
|
* implied. In no event shall the authors be liable for any damages arising
|
||||||
|
* from the use of this software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <libpkgconf/libpkgconf.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
pkgconf_path_add(const char *text, pkgconf_list_t *dirlist)
|
||||||
|
{
|
||||||
|
pkgconf_path_t *node;
|
||||||
|
|
||||||
|
node = calloc(sizeof(pkgconf_path_t), 1);
|
||||||
|
node->path = strdup(text);
|
||||||
|
|
||||||
|
pkgconf_node_insert_tail(&node->lnode, node, dirlist);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
pkgconf_path_split(const char *text, pkgconf_list_t *dirlist)
|
||||||
|
{
|
||||||
|
size_t count = 0;
|
||||||
|
char *workbuf, *p, *iter;
|
||||||
|
|
||||||
|
if (text == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
iter = workbuf = strdup(text);
|
||||||
|
while ((p = strtok(iter, PKG_CONFIG_PATH_SEP_S)) != NULL)
|
||||||
|
{
|
||||||
|
pkgconf_path_add(p, dirlist);
|
||||||
|
|
||||||
|
count++, iter = NULL;
|
||||||
|
}
|
||||||
|
free(workbuf);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
|
@ -53,56 +53,6 @@ pkgconf_set_error_handler(pkgconf_error_handler_func_t func)
|
||||||
#define PKG_CONFIG_EXT ".pc"
|
#define PKG_CONFIG_EXT ".pc"
|
||||||
#define PKG_CONFIG_PATH_SZ (65535)
|
#define PKG_CONFIG_PATH_SZ (65535)
|
||||||
|
|
||||||
/* pkg-config uses ';' on win32 as ':' is part of path */
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define PKG_CONFIG_PATH_SEP_S ";"
|
|
||||||
#else
|
|
||||||
#define PKG_CONFIG_PATH_SEP_S ":"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define PKG_DIR_SEP_S '\\'
|
|
||||||
#else
|
|
||||||
#define PKG_DIR_SEP_S '/'
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char *path;
|
|
||||||
pkgconf_node_t node;
|
|
||||||
} pkg_path_t;
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
path_add(const char *text, pkgconf_list_t *dirlist)
|
|
||||||
{
|
|
||||||
pkg_path_t *pkg_path;
|
|
||||||
|
|
||||||
pkg_path = calloc(sizeof(pkg_path_t), 1);
|
|
||||||
pkg_path->path = strdup(text);
|
|
||||||
|
|
||||||
pkgconf_node_insert_tail(&pkg_path->node, pkg_path, dirlist);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline size_t
|
|
||||||
path_split(const char *text, pkgconf_list_t *dirlist)
|
|
||||||
{
|
|
||||||
size_t count = 0;
|
|
||||||
char *workbuf, *p, *iter;
|
|
||||||
|
|
||||||
if (text == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
iter = workbuf = strdup(text);
|
|
||||||
while ((p = strtok(iter, PKG_CONFIG_PATH_SEP_S)) != NULL)
|
|
||||||
{
|
|
||||||
path_add(p, dirlist);
|
|
||||||
|
|
||||||
count++, iter = NULL;
|
|
||||||
}
|
|
||||||
free(workbuf);
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
str_has_suffix(const char *str, const char *suffix)
|
str_has_suffix(const char *str, const char *suffix)
|
||||||
{
|
{
|
||||||
|
@ -185,12 +135,12 @@ pkgconf_pkg_dir_list_build(unsigned int flags)
|
||||||
/* PKG_CONFIG_PATH has to take precedence */
|
/* PKG_CONFIG_PATH has to take precedence */
|
||||||
env_path = getenv("PKG_CONFIG_PATH");
|
env_path = getenv("PKG_CONFIG_PATH");
|
||||||
if (env_path)
|
if (env_path)
|
||||||
path_split(env_path, &pkg_dir_list);
|
pkgconf_path_split(env_path, &pkg_dir_list);
|
||||||
|
|
||||||
if (!(flags & PKGCONF_PKG_PKGF_ENV_ONLY))
|
if (!(flags & PKGCONF_PKG_PKGF_ENV_ONLY))
|
||||||
{
|
{
|
||||||
env_path = get_pkgconfig_path();
|
env_path = get_pkgconfig_path();
|
||||||
path_split(env_path, &pkg_dir_list);
|
pkgconf_path_split(env_path, &pkg_dir_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,9 +426,9 @@ pkgconf_scan_all(void *data, pkgconf_pkg_iteration_func_t func)
|
||||||
|
|
||||||
PKGCONF_FOREACH_LIST_ENTRY(pkg_dir_list.head, n)
|
PKGCONF_FOREACH_LIST_ENTRY(pkg_dir_list.head, n)
|
||||||
{
|
{
|
||||||
pkg_path_t *pkg_path = n->data;
|
pkgconf_path_t *pnode = n->data;
|
||||||
|
|
||||||
if ((pkg = pkgconf_pkg_scan_dir(pkg_path->path, data, func)) != NULL)
|
if ((pkg = pkgconf_pkg_scan_dir(pnode->path, data, func)) != NULL)
|
||||||
return pkg;
|
return pkg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -540,7 +490,7 @@ pkgconf_pkg_find(const char *name, unsigned int flags)
|
||||||
pkgconf_pkg_t *pkg;
|
pkgconf_pkg_t *pkg;
|
||||||
|
|
||||||
pkg = pkgconf_pkg_new_from_file(name, f, flags);
|
pkg = pkgconf_pkg_new_from_file(name, f, flags);
|
||||||
path_add(pkg_get_parent_dir(pkg), &pkg_dir_list);
|
pkgconf_path_add(pkg_get_parent_dir(pkg), &pkg_dir_list);
|
||||||
|
|
||||||
return pkg;
|
return pkg;
|
||||||
}
|
}
|
||||||
|
@ -562,9 +512,9 @@ pkgconf_pkg_find(const char *name, unsigned int flags)
|
||||||
|
|
||||||
PKGCONF_FOREACH_LIST_ENTRY(pkg_dir_list.head, n)
|
PKGCONF_FOREACH_LIST_ENTRY(pkg_dir_list.head, n)
|
||||||
{
|
{
|
||||||
pkg_path_t *pkg_path = n->data;
|
pkgconf_path_t *pnode = n->data;
|
||||||
|
|
||||||
pkg = pkgconf_pkg_try_specific_path(pkg_path->path, name, flags);
|
pkg = pkgconf_pkg_try_specific_path(pnode->path, name, flags);
|
||||||
if (pkg != NULL)
|
if (pkg != NULL)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue