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