1 /* 2 * libpkgconf.h 3 * Global include file for everything in libpkgconf. 4 * 5 * Copyright (c) 2011, 2015 pkgconf authors (see AUTHORS). 6 * 7 * Permission to use, copy, modify, and/or distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * This software is provided 'as is' and without any warranty, express or 12 * implied. In no event shall the authors be liable for any damages arising 13 * from the use of this software. 14 */ 15 16 #ifndef LIBPKGCONF__LIBPKGCONF_H 17 #define LIBPKGCONF__LIBPKGCONF_H 18 19 #include <inttypes.h> 20 #include <stdio.h> 21 #include <stdarg.h> 22 #include <stddef.h> 23 #include <stdbool.h> 24 #include <stdint.h> 25 #include <libpkgconf/libpkgconf-api.h> 26 #include <libpkgconf/iter.h> 27 #include <libpkgconf/bsdstubs.h> 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 /* pkg-config uses ';' on win32 as ':' is part of path */ 34 #ifdef _WIN32 35 #define PKG_CONFIG_PATH_SEP_S ";" 36 #else 37 #define PKG_CONFIG_PATH_SEP_S ":" 38 #endif 39 40 #ifdef _WIN32 41 #define PKG_DIR_SEP_S '\\' 42 #else 43 #define PKG_DIR_SEP_S '/' 44 #endif 45 46 #ifdef _WIN32 47 #define realpath(N,R) _fullpath((R),(N),_MAX_PATH) 48 #endif 49 50 #define PKGCONF_BUFSIZE (65535) 51 52 typedef enum { 53 PKGCONF_CMP_NOT_EQUAL, 54 PKGCONF_CMP_ANY, 55 PKGCONF_CMP_LESS_THAN, 56 PKGCONF_CMP_LESS_THAN_EQUAL, 57 PKGCONF_CMP_EQUAL, 58 PKGCONF_CMP_GREATER_THAN, 59 PKGCONF_CMP_GREATER_THAN_EQUAL 60 } pkgconf_pkg_comparator_t; 61 62 #define PKGCONF_CMP_COUNT 7 63 64 typedef struct pkgconf_pkg_ pkgconf_pkg_t; 65 typedef struct pkgconf_dependency_ pkgconf_dependency_t; 66 typedef struct pkgconf_tuple_ pkgconf_tuple_t; 67 typedef struct pkgconf_fragment_ pkgconf_fragment_t; 68 typedef struct pkgconf_path_ pkgconf_path_t; 69 typedef struct pkgconf_client_ pkgconf_client_t; 70 typedef struct pkgconf_cross_personality_ pkgconf_cross_personality_t; 71 typedef struct pkgconf_queue_ pkgconf_queue_t; 72 73 #define PKGCONF_ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) 74 75 #define PKGCONF_FOREACH_LIST_ENTRY(head, value) \ 76 for ((value) = (head); (value) != NULL; (value) = (value)->next) 77 78 #define PKGCONF_FOREACH_LIST_ENTRY_SAFE(head, nextiter, value) \ 79 for ((value) = (head), (nextiter) = (head) != NULL ? (head)->next : NULL; (value) != NULL; (value) = (nextiter), (nextiter) = (nextiter) != NULL ? (nextiter)->next : NULL) 80 81 #define PKGCONF_FOREACH_LIST_ENTRY_REVERSE(tail, value) \ 82 for ((value) = (tail); (value) != NULL; (value) = (value)->prev) 83 84 #define LIBPKGCONF_VERSION 20501 85 #define LIBPKGCONF_VERSION_STR "2.5.1" 86 87 struct pkgconf_queue_ { 88 pkgconf_node_t iter; 89 char *package; 90 91 unsigned int flags; 92 }; 93 94 struct pkgconf_fragment_ { 95 pkgconf_node_t iter; 96 97 char type; 98 char *data; 99 100 pkgconf_list_t children; 101 unsigned int flags; 102 }; 103 104 #define PKGCONF_PKG_FRAGF_TERMINATED 0x1 105 106 struct pkgconf_dependency_ { 107 pkgconf_node_t iter; 108 109 char *package; 110 pkgconf_pkg_comparator_t compare; 111 char *version; 112 pkgconf_pkg_t *parent; 113 pkgconf_pkg_t *match; 114 115 unsigned int flags; 116 117 int refcount; 118 pkgconf_client_t *owner; 119 }; 120 121 struct pkgconf_tuple_ { 122 pkgconf_node_t iter; 123 124 char *key; 125 char *value; 126 127 unsigned int flags; 128 }; 129 130 #define PKGCONF_PKG_TUPLEF_OVERRIDE 0x1 131 132 struct pkgconf_path_ { 133 pkgconf_node_t lnode; 134 135 char *path; 136 void *handle_path; 137 void *handle_device; 138 139 unsigned int flags; 140 }; 141 142 #define PKGCONF_PKG_PROPF_NONE 0x00 143 #define PKGCONF_PKG_PROPF_STATIC 0x01 144 #define PKGCONF_PKG_PROPF_CACHED 0x02 145 #define PKGCONF_PKG_PROPF_UNINSTALLED 0x08 146 #define PKGCONF_PKG_PROPF_VIRTUAL 0x10 147 #define PKGCONF_PKG_PROPF_ANCESTOR 0x20 148 #define PKGCONF_PKG_PROPF_VISITED_PRIVATE 0x40 149 #define PKGCONF_PKG_PROPF_PRELOADED 0x80 150 151 struct pkgconf_pkg_ { 152 int refcount; 153 char *id; 154 char *filename; 155 char *realname; 156 char *version; 157 char *description; 158 char *url; 159 char *pc_filedir; 160 char *license; 161 char *maintainer; 162 char *copyright; 163 char *why; 164 165 pkgconf_list_t libs; 166 pkgconf_list_t libs_private; 167 pkgconf_list_t cflags; 168 pkgconf_list_t cflags_private; 169 170 pkgconf_list_t required; /* this used to be requires but that is now a reserved keyword */ 171 pkgconf_list_t requires_private; 172 pkgconf_list_t conflicts; 173 pkgconf_list_t provides; 174 175 pkgconf_list_t vars; 176 177 unsigned int flags; 178 179 pkgconf_client_t *owner; 180 181 /* these resources are owned by the package and do not need special management, 182 * under no circumstance attempt to allocate or free objects belonging to these pointers 183 */ 184 pkgconf_tuple_t *orig_prefix; 185 pkgconf_tuple_t *prefix; 186 187 uint64_t serial; 188 uint64_t identifier; 189 190 pkgconf_node_t preload_node; 191 }; 192 193 typedef bool (*pkgconf_pkg_iteration_func_t)(const pkgconf_pkg_t *pkg, void *data); 194 typedef void (*pkgconf_pkg_traverse_func_t)(pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data); 195 typedef bool (*pkgconf_queue_apply_func_t)(pkgconf_client_t *client, pkgconf_pkg_t *world, void *data, int maxdepth); 196 typedef bool (*pkgconf_error_handler_func_t)(const char *msg, const pkgconf_client_t *client, void *data); 197 typedef void (*pkgconf_unveil_handler_func_t)(const pkgconf_client_t *client, const char *path, const char *permissions); 198 199 struct pkgconf_client_ { 200 pkgconf_list_t dir_list; 201 202 pkgconf_list_t filter_libdirs; 203 pkgconf_list_t filter_includedirs; 204 205 pkgconf_list_t global_vars; 206 207 void *error_handler_data; 208 void *warn_handler_data; 209 void *trace_handler_data; 210 211 pkgconf_error_handler_func_t error_handler; 212 pkgconf_error_handler_func_t warn_handler; 213 pkgconf_error_handler_func_t trace_handler; 214 215 FILE *auditf; 216 217 char *sysroot_dir; 218 char *buildroot_dir; 219 220 unsigned int flags; 221 222 char *prefix_varname; 223 224 bool already_sent_notice; 225 226 uint64_t serial; 227 uint64_t identifier; 228 229 pkgconf_pkg_t **cache_table; 230 size_t cache_count; 231 232 pkgconf_unveil_handler_func_t unveil_handler; 233 234 pkgconf_list_t preloaded_pkgs; 235 }; 236 237 struct pkgconf_cross_personality_ { 238 char *name; 239 240 pkgconf_list_t dir_list; 241 242 pkgconf_list_t filter_libdirs; 243 pkgconf_list_t filter_includedirs; 244 245 char *sysroot_dir; 246 247 bool want_default_static; 248 bool want_default_pure; 249 }; 250 251 /* client.c */ 252 PKGCONF_API void pkgconf_client_init(pkgconf_client_t *client, pkgconf_error_handler_func_t error_handler, void *error_handler_data, const pkgconf_cross_personality_t *personality); 253 PKGCONF_API pkgconf_client_t * pkgconf_client_new(pkgconf_error_handler_func_t error_handler, void *error_handler_data, const pkgconf_cross_personality_t *personality); 254 PKGCONF_API void pkgconf_client_deinit(pkgconf_client_t *client); 255 PKGCONF_API void pkgconf_client_free(pkgconf_client_t *client); 256 PKGCONF_API const char *pkgconf_client_get_sysroot_dir(const pkgconf_client_t *client); 257 PKGCONF_API void pkgconf_client_set_sysroot_dir(pkgconf_client_t *client, const char *sysroot_dir); 258 PKGCONF_API const char *pkgconf_client_get_buildroot_dir(const pkgconf_client_t *client); 259 PKGCONF_API void pkgconf_client_set_buildroot_dir(pkgconf_client_t *client, const char *buildroot_dir); 260 PKGCONF_API unsigned int pkgconf_client_get_flags(const pkgconf_client_t *client); 261 PKGCONF_API void pkgconf_client_set_flags(pkgconf_client_t *client, unsigned int flags); 262 PKGCONF_API const char *pkgconf_client_get_prefix_varname(const pkgconf_client_t *client); 263 PKGCONF_API void pkgconf_client_set_prefix_varname(pkgconf_client_t *client, const char *prefix_varname); 264 PKGCONF_API pkgconf_error_handler_func_t pkgconf_client_get_warn_handler(const pkgconf_client_t *client); 265 PKGCONF_API void pkgconf_client_set_warn_handler(pkgconf_client_t *client, pkgconf_error_handler_func_t warn_handler, void *warn_handler_data); 266 PKGCONF_API pkgconf_error_handler_func_t pkgconf_client_get_error_handler(const pkgconf_client_t *client); 267 PKGCONF_API void pkgconf_client_set_error_handler(pkgconf_client_t *client, pkgconf_error_handler_func_t error_handler, void *error_handler_data); 268 PKGCONF_API pkgconf_error_handler_func_t pkgconf_client_get_trace_handler(const pkgconf_client_t *client); 269 PKGCONF_API void pkgconf_client_set_trace_handler(pkgconf_client_t *client, pkgconf_error_handler_func_t trace_handler, void *trace_handler_data); 270 PKGCONF_API pkgconf_unveil_handler_func_t pkgconf_client_get_unveil_handler(const pkgconf_client_t *client); 271 PKGCONF_API void pkgconf_client_set_unveil_handler(pkgconf_client_t *client, pkgconf_unveil_handler_func_t unveil_handler); 272 PKGCONF_API void pkgconf_client_dir_list_build(pkgconf_client_t *client, const pkgconf_cross_personality_t *personality); 273 PKGCONF_API bool pkgconf_client_preload_path(pkgconf_client_t *client, const char *path); 274 PKGCONF_API bool pkgconf_client_preload_from_environ(pkgconf_client_t *client, const char *env); 275 276 /* personality.c */ 277 PKGCONF_API pkgconf_cross_personality_t *pkgconf_cross_personality_default(void); 278 PKGCONF_API pkgconf_cross_personality_t *pkgconf_cross_personality_find(const char *triplet); 279 PKGCONF_API void pkgconf_cross_personality_deinit(pkgconf_cross_personality_t *personality); 280 281 #define PKGCONF_IS_MODULE_SEPARATOR(c) ((c) == ',' || isspace ((unsigned char)(c))) 282 #define PKGCONF_IS_OPERATOR_CHAR(c) ((c) == '<' || (c) == '>' || (c) == '!' || (c) == '=') 283 284 #define PKGCONF_PKG_PKGF_NONE 0x0000 285 #define PKGCONF_PKG_PKGF_SEARCH_PRIVATE 0x0001 286 #define PKGCONF_PKG_PKGF_ENV_ONLY 0x0002 287 #define PKGCONF_PKG_PKGF_NO_UNINSTALLED 0x0004 288 #define PKGCONF_PKG_PKGF_SKIP_ROOT_VIRTUAL 0x0008 289 #define PKGCONF_PKG_PKGF_MERGE_PRIVATE_FRAGMENTS 0x0010 290 #define PKGCONF_PKG_PKGF_SKIP_CONFLICTS 0x0020 291 #define PKGCONF_PKG_PKGF_NO_CACHE 0x0040 292 #define PKGCONF_PKG_PKGF_SKIP_ERRORS 0x0080 293 #define PKGCONF_PKG_PKGF_ITER_PKG_IS_PRIVATE 0x0100 294 #define PKGCONF_PKG_PKGF_SKIP_PROVIDES 0x0200 295 #define PKGCONF_PKG_PKGF_REDEFINE_PREFIX 0x0400 296 #define PKGCONF_PKG_PKGF_DONT_RELOCATE_PATHS 0x0800 297 #define PKGCONF_PKG_PKGF_SIMPLIFY_ERRORS 0x1000 298 #define PKGCONF_PKG_PKGF_DONT_FILTER_INTERNAL_CFLAGS 0x2000 299 #define PKGCONF_PKG_PKGF_DONT_MERGE_SPECIAL_FRAGMENTS 0x4000 300 #define PKGCONF_PKG_PKGF_FDO_SYSROOT_RULES 0x8000 301 #define PKGCONF_PKG_PKGF_PKGCONF1_SYSROOT_RULES 0x10000 302 303 #define PKGCONF_PKG_DEPF_INTERNAL 0x1 304 #define PKGCONF_PKG_DEPF_PRIVATE 0x2 305 #define PKGCONF_PKG_DEPF_QUERY 0x4 306 307 #define PKGCONF_PKG_ERRF_OK 0x0 308 #define PKGCONF_PKG_ERRF_PACKAGE_NOT_FOUND 0x1 309 #define PKGCONF_PKG_ERRF_PACKAGE_VER_MISMATCH 0x2 310 #define PKGCONF_PKG_ERRF_PACKAGE_CONFLICT 0x4 311 #define PKGCONF_PKG_ERRF_DEPGRAPH_BREAK 0x8 312 313 #if __GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) 314 # define PRINTFLIKE(fmtarg, firstvararg) \ 315 __attribute__((__format__ (gnu_printf, fmtarg, firstvararg))) 316 #elif defined(__clang__) || defined(__INTEL_COMPILER) || __GNUC__ > 2 || (_GNUC__ == 2 && __GNUC_MINOR__ >= 5) 317 # define PRINTFLIKE(fmtarg, firstvararg) \ 318 __attribute__((__format__ (__printf__, fmtarg, firstvararg))) 319 #else 320 # define PRINTFLIKE(fmtarg, firstvararg) 321 #endif 322 323 #if defined(__clang__) || defined(__INTEL_COMPILER) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) 324 # define DEPRECATED __attribute__((deprecated)) 325 #elif defined(_MSC_VER) 326 # define DEPRECATED __declspec(deprecated) 327 #else 328 # define DEPRECATED 329 #endif 330 331 /* parser.c */ 332 typedef void (*pkgconf_parser_operand_func_t)(void *data, const size_t lineno, const char *key, const char *value); 333 typedef void (*pkgconf_parser_warn_func_t)(void *data, const char *fmt, ...); 334 335 PKGCONF_API void pkgconf_parser_parse(FILE *f, void *data, const pkgconf_parser_operand_func_t *ops, const pkgconf_parser_warn_func_t warnfunc, const char *filename); 336 337 /* pkg.c */ 338 PKGCONF_API bool pkgconf_error(const pkgconf_client_t *client, const char *format, ...) PRINTFLIKE(2, 3); 339 PKGCONF_API bool pkgconf_warn(const pkgconf_client_t *client, const char *format, ...) PRINTFLIKE(2, 3); 340 PKGCONF_API bool pkgconf_trace(const pkgconf_client_t *client, const char *filename, size_t lineno, const char *funcname, const char *format, ...) PRINTFLIKE(5, 6); 341 PKGCONF_API bool pkgconf_default_error_handler(const char *msg, const pkgconf_client_t *client, void *data); 342 343 #ifndef PKGCONF_LITE 344 #if defined(__GNUC__) || defined(__INTEL_COMPILER) 345 #define PKGCONF_TRACE(client, ...) do { \ 346 pkgconf_trace(client, __FILE__, __LINE__, __PRETTY_FUNCTION__, __VA_ARGS__); \ 347 } while (0) 348 #else 349 #define PKGCONF_TRACE(client, ...) do { \ 350 pkgconf_trace(client, __FILE__, __LINE__, __func__, __VA_ARGS__); \ 351 } while (0) 352 #endif 353 #else 354 #define PKGCONF_TRACE(client, ...) 355 #endif 356 357 PKGCONF_API pkgconf_pkg_t *pkgconf_pkg_ref(pkgconf_client_t *client, pkgconf_pkg_t *pkg); 358 PKGCONF_API void pkgconf_pkg_unref(pkgconf_client_t *client, pkgconf_pkg_t *pkg); 359 PKGCONF_API void pkgconf_pkg_free(pkgconf_client_t *client, pkgconf_pkg_t *pkg); 360 PKGCONF_API pkgconf_pkg_t *pkgconf_pkg_find(pkgconf_client_t *client, const char *name); 361 PKGCONF_API unsigned int pkgconf_pkg_traverse(pkgconf_client_t *client, pkgconf_pkg_t *root, pkgconf_pkg_traverse_func_t func, void *data, int maxdepth, unsigned int skip_flags); 362 PKGCONF_API unsigned int pkgconf_pkg_verify_graph(pkgconf_client_t *client, pkgconf_pkg_t *root, int depth); 363 PKGCONF_API pkgconf_pkg_t *pkgconf_pkg_verify_dependency(pkgconf_client_t *client, pkgconf_dependency_t *pkgdep, unsigned int *eflags); 364 PKGCONF_API const char *pkgconf_pkg_get_comparator(const pkgconf_dependency_t *pkgdep); 365 PKGCONF_API unsigned int pkgconf_pkg_cflags(pkgconf_client_t *client, pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth); 366 PKGCONF_API unsigned int pkgconf_pkg_libs(pkgconf_client_t *client, pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth); 367 PKGCONF_API pkgconf_pkg_comparator_t pkgconf_pkg_comparator_lookup_by_name(const char *name); 368 PKGCONF_API pkgconf_pkg_t *pkgconf_builtin_pkg_get(const char *name); 369 370 PKGCONF_API int pkgconf_compare_version(const char *a, const char *b); 371 PKGCONF_API pkgconf_pkg_t *pkgconf_scan_all(pkgconf_client_t *client, void *ptr, pkgconf_pkg_iteration_func_t func); 372 373 /* parse.c */ 374 PKGCONF_API pkgconf_pkg_t *pkgconf_pkg_new_from_path(pkgconf_client_t *client, const char *path, unsigned int flags); 375 PKGCONF_API void pkgconf_dependency_parse_str(pkgconf_client_t *client, pkgconf_list_t *deplist_head, const char *depends, unsigned int flags); 376 PKGCONF_API void pkgconf_dependency_parse(pkgconf_client_t *client, pkgconf_pkg_t *pkg, pkgconf_list_t *deplist_head, const char *depends, unsigned int flags); 377 PKGCONF_API void pkgconf_dependency_append(pkgconf_list_t *list, pkgconf_dependency_t *tail); 378 PKGCONF_API void pkgconf_dependency_free(pkgconf_list_t *list); 379 PKGCONF_API void pkgconf_dependency_free_one(pkgconf_dependency_t *dep); 380 PKGCONF_API pkgconf_dependency_t *pkgconf_dependency_add(pkgconf_client_t *client, pkgconf_list_t *list, const char *package, const char *version, pkgconf_pkg_comparator_t compare, unsigned int flags); 381 PKGCONF_API pkgconf_dependency_t *pkgconf_dependency_ref(pkgconf_client_t *client, pkgconf_dependency_t *dep); 382 PKGCONF_API void pkgconf_dependency_unref(pkgconf_client_t *client, pkgconf_dependency_t *dep); 383 PKGCONF_API pkgconf_dependency_t *pkgconf_dependency_copy(pkgconf_client_t *client, const pkgconf_dependency_t *dep); 384 385 /* argvsplit.c */ 386 PKGCONF_API int pkgconf_argv_split(const char *src, int *argc, char ***argv); 387 PKGCONF_API void pkgconf_argv_free(char **argv); 388 389 /* fragment.c */ 390 typedef struct pkgconf_fragment_render_ops_ { 391 size_t (*render_len)(const pkgconf_list_t *list, bool escape); 392 void (*render_buf)(const pkgconf_list_t *list, char *buf, size_t len, bool escape); 393 } pkgconf_fragment_render_ops_t; 394 395 typedef bool (*pkgconf_fragment_filter_func_t)(const pkgconf_client_t *client, const pkgconf_fragment_t *frag, void *data); 396 PKGCONF_API bool pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value, unsigned int flags); 397 PKGCONF_API void pkgconf_fragment_insert(const pkgconf_client_t *client, pkgconf_list_t *list, char type, const char *data, bool tail); 398 PKGCONF_API void pkgconf_fragment_add(const pkgconf_client_t *client, pkgconf_list_t *list, const char *string, unsigned int flags); 399 PKGCONF_API void pkgconf_fragment_copy(const pkgconf_client_t *client, pkgconf_list_t *list, const pkgconf_fragment_t *base, bool is_private); 400 PKGCONF_API void pkgconf_fragment_copy_list(const pkgconf_client_t *client, pkgconf_list_t *list, const pkgconf_list_t *base); 401 PKGCONF_API void pkgconf_fragment_delete(pkgconf_list_t *list, pkgconf_fragment_t *node); 402 PKGCONF_API void pkgconf_fragment_free(pkgconf_list_t *list); 403 PKGCONF_API void pkgconf_fragment_filter(const pkgconf_client_t *client, pkgconf_list_t *dest, pkgconf_list_t *src, pkgconf_fragment_filter_func_t filter_func, void *data); 404 PKGCONF_API size_t pkgconf_fragment_render_len(const pkgconf_list_t *list, bool escape, const pkgconf_fragment_render_ops_t *ops); 405 PKGCONF_API void pkgconf_fragment_render_buf(const pkgconf_list_t *list, char *buf, size_t len, bool escape, const pkgconf_fragment_render_ops_t *ops); 406 PKGCONF_API char *pkgconf_fragment_render(const pkgconf_list_t *list, bool escape, const pkgconf_fragment_render_ops_t *ops); 407 PKGCONF_API bool pkgconf_fragment_has_system_dir(const pkgconf_client_t *client, const pkgconf_fragment_t *frag); 408 409 /* tuple.c */ 410 PKGCONF_API pkgconf_tuple_t *pkgconf_tuple_add(const pkgconf_client_t *client, pkgconf_list_t *parent, const char *key, const char *value, bool parse, unsigned int flags); 411 PKGCONF_API char *pkgconf_tuple_find(const pkgconf_client_t *client, pkgconf_list_t *list, const char *key); 412 PKGCONF_API char *pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *list, const char *value, unsigned int flags); 413 PKGCONF_API void pkgconf_tuple_free(pkgconf_list_t *list); 414 PKGCONF_API void pkgconf_tuple_free_entry(pkgconf_tuple_t *tuple, pkgconf_list_t *list); 415 PKGCONF_API void pkgconf_tuple_add_global(pkgconf_client_t *client, const char *key, const char *value); 416 PKGCONF_API char *pkgconf_tuple_find_global(const pkgconf_client_t *client, const char *key); 417 PKGCONF_API void pkgconf_tuple_free_global(pkgconf_client_t *client); 418 PKGCONF_API void pkgconf_tuple_define_global(pkgconf_client_t *client, const char *kv); 419 420 /* queue.c */ 421 PKGCONF_API void pkgconf_queue_push(pkgconf_list_t *list, const char *package); 422 PKGCONF_API bool pkgconf_queue_compile(pkgconf_client_t *client, pkgconf_pkg_t *world, pkgconf_list_t *list); 423 PKGCONF_API bool pkgconf_queue_solve(pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_pkg_t *world, int maxdepth); 424 PKGCONF_API void pkgconf_queue_free(pkgconf_list_t *list); 425 PKGCONF_API bool pkgconf_queue_apply(pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_queue_apply_func_t func, int maxdepth, void *data); 426 PKGCONF_API bool pkgconf_queue_validate(pkgconf_client_t *client, pkgconf_list_t *list, int maxdepth); 427 PKGCONF_API void pkgconf_solution_free(pkgconf_client_t *client, pkgconf_pkg_t *world); 428 429 /* cache.c */ 430 PKGCONF_API pkgconf_pkg_t *pkgconf_cache_lookup(pkgconf_client_t *client, const char *id); 431 PKGCONF_API void pkgconf_cache_add(pkgconf_client_t *client, pkgconf_pkg_t *pkg); 432 PKGCONF_API void pkgconf_cache_remove(pkgconf_client_t *client, pkgconf_pkg_t *pkg); 433 PKGCONF_API void pkgconf_cache_free(pkgconf_client_t *client); 434 435 /* audit.c */ 436 PKGCONF_API void pkgconf_audit_set_log(pkgconf_client_t *client, FILE *auditf); 437 PKGCONF_API void pkgconf_audit_log(pkgconf_client_t *client, const char *format, ...) PRINTFLIKE(2, 3); 438 PKGCONF_API void pkgconf_audit_log_dependency(pkgconf_client_t *client, const pkgconf_pkg_t *dep, const pkgconf_dependency_t *depnode); 439 440 /* path.c */ 441 PKGCONF_API void pkgconf_path_add(const char *text, pkgconf_list_t *dirlist, bool filter); 442 PKGCONF_API void pkgconf_path_prepend(const char *text, pkgconf_list_t *dirlist, bool filter); 443 PKGCONF_API size_t pkgconf_path_split(const char *text, pkgconf_list_t *dirlist, bool filter); 444 PKGCONF_API size_t pkgconf_path_build_from_environ(const char *envvarname, const char *fallback, pkgconf_list_t *dirlist, bool filter); 445 #ifdef _WIN32 446 PKGCONF_API size_t pkgconf_path_build_from_registry(/* HKEY -> HANDLE -> PVOID */ void *hKey, pkgconf_list_t *dirlist, bool filter); 447 #endif 448 PKGCONF_API bool pkgconf_path_match_list(const char *path, const pkgconf_list_t *dirlist); 449 PKGCONF_API void pkgconf_path_free(pkgconf_list_t *dirlist); 450 PKGCONF_API bool pkgconf_path_relocate(char *buf, size_t buflen); 451 PKGCONF_API void pkgconf_path_copy_list(pkgconf_list_t *dst, const pkgconf_list_t *src); 452 PKGCONF_API void pkgconf_path_prepend_list(pkgconf_list_t *dst, const pkgconf_list_t *src); 453 454 /* buffer.c */ 455 typedef struct pkgconf_buffer_ { 456 char *base; 457 char *end; 458 } pkgconf_buffer_t; 459 460 PKGCONF_API void pkgconf_buffer_append(pkgconf_buffer_t *buffer, const char *text); 461 PKGCONF_API void pkgconf_buffer_push_byte(pkgconf_buffer_t *buffer, char byte); 462 PKGCONF_API void pkgconf_buffer_trim_byte(pkgconf_buffer_t *buffer); 463 PKGCONF_API void pkgconf_buffer_finalize(pkgconf_buffer_t *buffer); 464 static inline const char *pkgconf_buffer_str(const pkgconf_buffer_t *buffer) { 465 return buffer->base; 466 } 467 468 static inline size_t pkgconf_buffer_len(const pkgconf_buffer_t *buffer) { 469 return (size_t)(ptrdiff_t)(buffer->end - buffer->base); 470 } 471 472 static inline char pkgconf_buffer_lastc(const pkgconf_buffer_t *buffer) { 473 if (buffer->base == buffer->end) 474 return '\0'; 475 476 return *(buffer->end - 1); 477 } 478 479 #define PKGCONF_BUFFER_INITIALIZER { NULL, NULL } 480 481 static inline void pkgconf_buffer_reset(pkgconf_buffer_t *buffer) { 482 pkgconf_buffer_finalize(buffer); 483 buffer->base = buffer->end = NULL; 484 } 485 486 /* fileio.c */ 487 PKGCONF_API bool pkgconf_fgetline(pkgconf_buffer_t *buffer, FILE *stream); 488 489 #ifdef __cplusplus 490 } 491 #endif 492 493 #endif 494