xref: /freebsd/contrib/pkgconf/libpkgconf/variable.c (revision 592efe252472a3385acf36b1f49ecf710a7f3d9c)
1*592efe25SPierre Pronchery /*
2*592efe25SPierre Pronchery  * variable.c
3*592efe25SPierre Pronchery  * variable management
4*592efe25SPierre Pronchery  *
5*592efe25SPierre Pronchery  * SPDX-License-Identifier: pkgconf
6*592efe25SPierre Pronchery  *
7*592efe25SPierre Pronchery  * Copyright (c) 2026 pkgconf authors (see AUTHORS).
8*592efe25SPierre Pronchery  *
9*592efe25SPierre Pronchery  * Permission to use, copy, modify, and/or distribute this software for any
10*592efe25SPierre Pronchery  * purpose with or without fee is hereby granted, provided that the above
11*592efe25SPierre Pronchery  * copyright notice and this permission notice appear in all copies.
12*592efe25SPierre Pronchery  *
13*592efe25SPierre Pronchery  * This software is provided 'as is' and without any warranty, express or
14*592efe25SPierre Pronchery  * implied.  In no event shall the authors be liable for any damages arising
15*592efe25SPierre Pronchery  * from the use of this software.
16*592efe25SPierre Pronchery  */
17*592efe25SPierre Pronchery 
18*592efe25SPierre Pronchery #include <libpkgconf/libpkgconf.h>
19*592efe25SPierre Pronchery #include <libpkgconf/stdinc.h>
20*592efe25SPierre Pronchery 
21*592efe25SPierre Pronchery /*
22*592efe25SPierre Pronchery  * !doc
23*592efe25SPierre Pronchery  *
24*592efe25SPierre Pronchery  * libpkgconf `variable` module
25*592efe25SPierre Pronchery  * ============================
26*592efe25SPierre Pronchery  *
27*592efe25SPierre Pronchery  * The libpkgconf `variable` module contains the functions related to
28*592efe25SPierre Pronchery  * managing variables.  It replaces the old `tuple` module.
29*592efe25SPierre Pronchery  */
30*592efe25SPierre Pronchery 
31*592efe25SPierre Pronchery pkgconf_variable_t *
pkgconf_variable_new(const char * key)32*592efe25SPierre Pronchery pkgconf_variable_new(const char *key)
33*592efe25SPierre Pronchery {
34*592efe25SPierre Pronchery 	pkgconf_variable_t *v;
35*592efe25SPierre Pronchery 
36*592efe25SPierre Pronchery 	if (key == NULL)
37*592efe25SPierre Pronchery 		return NULL;
38*592efe25SPierre Pronchery 
39*592efe25SPierre Pronchery 	v = calloc(1, sizeof(*v));
40*592efe25SPierre Pronchery 	if (v == NULL)
41*592efe25SPierre Pronchery 		return NULL;
42*592efe25SPierre Pronchery 
43*592efe25SPierre Pronchery 	v->key = strdup(key);
44*592efe25SPierre Pronchery 	if (v->key == NULL)
45*592efe25SPierre Pronchery 	{
46*592efe25SPierre Pronchery 		free(v);
47*592efe25SPierre Pronchery 		return NULL;
48*592efe25SPierre Pronchery 	}
49*592efe25SPierre Pronchery 
50*592efe25SPierre Pronchery 	return v;
51*592efe25SPierre Pronchery }
52*592efe25SPierre Pronchery 
53*592efe25SPierre Pronchery void
pkgconf_variable_free(pkgconf_variable_t * v)54*592efe25SPierre Pronchery pkgconf_variable_free(pkgconf_variable_t *v)
55*592efe25SPierre Pronchery {
56*592efe25SPierre Pronchery 	if (v == NULL)
57*592efe25SPierre Pronchery 		return;
58*592efe25SPierre Pronchery 
59*592efe25SPierre Pronchery 	pkgconf_buffer_finalize(&v->bcbuf);
60*592efe25SPierre Pronchery 	free(v->key);
61*592efe25SPierre Pronchery 	free(v);
62*592efe25SPierre Pronchery }
63*592efe25SPierre Pronchery 
64*592efe25SPierre Pronchery pkgconf_variable_t *
pkgconf_variable_find(const pkgconf_list_t * vars,const char * key)65*592efe25SPierre Pronchery pkgconf_variable_find(const pkgconf_list_t *vars, const char *key)
66*592efe25SPierre Pronchery {
67*592efe25SPierre Pronchery 	const pkgconf_node_t *n;
68*592efe25SPierre Pronchery 
69*592efe25SPierre Pronchery 	if (vars == NULL || key == NULL)
70*592efe25SPierre Pronchery 		return NULL;
71*592efe25SPierre Pronchery 
72*592efe25SPierre Pronchery 	PKGCONF_FOREACH_LIST_ENTRY(vars->head, n)
73*592efe25SPierre Pronchery 	{
74*592efe25SPierre Pronchery 		pkgconf_variable_t *v = n->data;
75*592efe25SPierre Pronchery 
76*592efe25SPierre Pronchery 		if (!strcmp(v->key, key))
77*592efe25SPierre Pronchery 			return v;
78*592efe25SPierre Pronchery 	}
79*592efe25SPierre Pronchery 
80*592efe25SPierre Pronchery 	return NULL;
81*592efe25SPierre Pronchery }
82*592efe25SPierre Pronchery 
83*592efe25SPierre Pronchery pkgconf_variable_t *
pkgconf_variable_get_or_create(pkgconf_list_t * vars,const char * key)84*592efe25SPierre Pronchery pkgconf_variable_get_or_create(pkgconf_list_t *vars, const char *key)
85*592efe25SPierre Pronchery {
86*592efe25SPierre Pronchery 	pkgconf_variable_t *v;
87*592efe25SPierre Pronchery 
88*592efe25SPierre Pronchery 	if (vars == NULL || key == NULL)
89*592efe25SPierre Pronchery 		return NULL;
90*592efe25SPierre Pronchery 
91*592efe25SPierre Pronchery 	v = pkgconf_variable_find(vars, key);
92*592efe25SPierre Pronchery 	if (v != NULL)
93*592efe25SPierre Pronchery 		return v;
94*592efe25SPierre Pronchery 
95*592efe25SPierre Pronchery 	v = pkgconf_variable_new(key);
96*592efe25SPierre Pronchery 	if (v == NULL)
97*592efe25SPierre Pronchery 		return NULL;
98*592efe25SPierre Pronchery 
99*592efe25SPierre Pronchery 	pkgconf_node_insert_tail(&v->iter, v, vars);
100*592efe25SPierre Pronchery 
101*592efe25SPierre Pronchery 	return v;
102*592efe25SPierre Pronchery }
103*592efe25SPierre Pronchery 
104*592efe25SPierre Pronchery void
pkgconf_variable_delete(pkgconf_list_t * vars,pkgconf_variable_t * v)105*592efe25SPierre Pronchery pkgconf_variable_delete(pkgconf_list_t *vars, pkgconf_variable_t *v)
106*592efe25SPierre Pronchery {
107*592efe25SPierre Pronchery 	if (vars == NULL || v == NULL)
108*592efe25SPierre Pronchery 		return;
109*592efe25SPierre Pronchery 
110*592efe25SPierre Pronchery 	pkgconf_node_delete(&v->iter, vars);
111*592efe25SPierre Pronchery 	pkgconf_variable_free(v);
112*592efe25SPierre Pronchery }
113*592efe25SPierre Pronchery 
114*592efe25SPierre Pronchery void
pkgconf_variable_list_free(pkgconf_list_t * vars)115*592efe25SPierre Pronchery pkgconf_variable_list_free(pkgconf_list_t *vars)
116*592efe25SPierre Pronchery {
117*592efe25SPierre Pronchery 	pkgconf_node_t *node, *tmp;
118*592efe25SPierre Pronchery 
119*592efe25SPierre Pronchery 	if (vars == NULL)
120*592efe25SPierre Pronchery 		return;
121*592efe25SPierre Pronchery 
122*592efe25SPierre Pronchery 	PKGCONF_FOREACH_LIST_ENTRY_SAFE(vars->head, tmp, node)
123*592efe25SPierre Pronchery 	{
124*592efe25SPierre Pronchery 		pkgconf_variable_t *v = node->data;
125*592efe25SPierre Pronchery 
126*592efe25SPierre Pronchery 		pkgconf_node_delete(node, vars);
127*592efe25SPierre Pronchery 		pkgconf_variable_free(v);
128*592efe25SPierre Pronchery 	}
129*592efe25SPierre Pronchery }
130*592efe25SPierre Pronchery 
131*592efe25SPierre Pronchery bool
pkgconf_variable_eval(pkgconf_client_t * client,const pkgconf_list_t * tuples,const pkgconf_variable_t * v,pkgconf_buffer_t * out,bool * saw_sysroot)132*592efe25SPierre Pronchery pkgconf_variable_eval(pkgconf_client_t *client,
133*592efe25SPierre Pronchery 	const pkgconf_list_t *tuples,
134*592efe25SPierre Pronchery 	const pkgconf_variable_t *v,
135*592efe25SPierre Pronchery 	pkgconf_buffer_t *out,
136*592efe25SPierre Pronchery 	bool *saw_sysroot)
137*592efe25SPierre Pronchery {
138*592efe25SPierre Pronchery 	if (client == NULL || tuples == NULL || v == NULL || out == NULL)
139*592efe25SPierre Pronchery 		return false;
140*592efe25SPierre Pronchery 
141*592efe25SPierre Pronchery 	return pkgconf_bytecode_eval(client, tuples, &v->bc, out, saw_sysroot);
142*592efe25SPierre Pronchery }
143*592efe25SPierre Pronchery 
144*592efe25SPierre Pronchery char *
pkgconf_variable_eval_str(pkgconf_client_t * client,const pkgconf_list_t * tuples,const pkgconf_variable_t * v,bool * saw_sysroot)145*592efe25SPierre Pronchery pkgconf_variable_eval_str(pkgconf_client_t *client,
146*592efe25SPierre Pronchery 	const pkgconf_list_t *tuples,
147*592efe25SPierre Pronchery 	const pkgconf_variable_t *v,
148*592efe25SPierre Pronchery 	bool *saw_sysroot)
149*592efe25SPierre Pronchery {
150*592efe25SPierre Pronchery 	pkgconf_buffer_t out = PKGCONF_BUFFER_INITIALIZER;
151*592efe25SPierre Pronchery 
152*592efe25SPierre Pronchery 	if (client == NULL || tuples == NULL || v == NULL)
153*592efe25SPierre Pronchery 		return NULL;
154*592efe25SPierre Pronchery 
155*592efe25SPierre Pronchery 	if (!pkgconf_variable_eval(client, tuples, v, &out, saw_sysroot))
156*592efe25SPierre Pronchery 	{
157*592efe25SPierre Pronchery 		pkgconf_buffer_finalize(&out);
158*592efe25SPierre Pronchery 		return NULL;
159*592efe25SPierre Pronchery 	}
160*592efe25SPierre Pronchery 
161*592efe25SPierre Pronchery 	return pkgconf_buffer_freeze(&out);
162*592efe25SPierre Pronchery }
163