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);
pkgconf_buffer_str(const pkgconf_buffer_t * buffer)464 static inline const char *pkgconf_buffer_str(const pkgconf_buffer_t *buffer) {
465 return buffer->base;
466 }
467
pkgconf_buffer_len(const pkgconf_buffer_t * buffer)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
pkgconf_buffer_lastc(const pkgconf_buffer_t * buffer)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
pkgconf_buffer_reset(pkgconf_buffer_t * buffer)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