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