mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-28 05:40:23 -04:00
conf: introduce snd_config_load_string()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
a95942f1af
commit
ebb8a6c7a1
4 changed files with 65 additions and 28 deletions
|
|
@ -89,6 +89,7 @@ const char *snd_config_topdir(void);
|
||||||
int snd_config_top(snd_config_t **config);
|
int snd_config_top(snd_config_t **config);
|
||||||
|
|
||||||
int snd_config_load(snd_config_t *config, snd_input_t *in);
|
int snd_config_load(snd_config_t *config, snd_input_t *in);
|
||||||
|
int snd_config_load_string(snd_config_t **config, const char *s, size_t size);
|
||||||
int snd_config_load_override(snd_config_t *config, snd_input_t *in);
|
int snd_config_load_override(snd_config_t *config, snd_input_t *in);
|
||||||
int snd_config_save(snd_config_t *config, snd_output_t *out);
|
int snd_config_save(snd_config_t *config, snd_output_t *out);
|
||||||
int snd_config_update(void);
|
int snd_config_update(void);
|
||||||
|
|
|
||||||
43
src/conf.c
43
src/conf.c
|
|
@ -2050,6 +2050,49 @@ int snd_config_load(snd_config_t *config, snd_input_t *in)
|
||||||
return _snd_config_load_with_include(config, in, 0, NULL);
|
return _snd_config_load_with_include(config, in, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Loads a configuration tree from a string.
|
||||||
|
* \param[out] The function puts the handle to the configuration
|
||||||
|
* node loaded from the file(s) at the address specified
|
||||||
|
* by \a config.
|
||||||
|
* \param[in] s String with the ASCII configuration
|
||||||
|
* \param[in] size String size, if zero, a C string is expected (with termination)
|
||||||
|
* \return Zero if successful, otherwise a negative error code.
|
||||||
|
*
|
||||||
|
* The definitions loaded from the string are put to \a config, which
|
||||||
|
* is created as a new top node.
|
||||||
|
*
|
||||||
|
* \par Errors:
|
||||||
|
* Any errors encountered when parsing the input or returned by hooks or
|
||||||
|
* functions.
|
||||||
|
*/
|
||||||
|
int snd_config_load_string(snd_config_t **config, const char *s, size_t size)
|
||||||
|
{
|
||||||
|
snd_input_t *input;
|
||||||
|
snd_config_t *dst;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
assert(config && s);
|
||||||
|
if (size == 0)
|
||||||
|
size = strlen(s);
|
||||||
|
err = snd_input_buffer_open(&input, s, size);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
err = snd_config_top(&dst);
|
||||||
|
if (err < 0) {
|
||||||
|
snd_input_close(input);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
err = snd_config_load(dst, input);
|
||||||
|
snd_input_close(input);
|
||||||
|
if (err < 0) {
|
||||||
|
snd_config_delete(dst);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
*config = dst;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Loads a configuration tree and overrides existing configuration nodes.
|
* \brief Loads a configuration tree and overrides existing configuration nodes.
|
||||||
* \param config Handle to a top level configuration node.
|
* \param config Handle to a top level configuration node.
|
||||||
|
|
|
||||||
|
|
@ -213,32 +213,6 @@ struct lookup_iterate {
|
||||||
void *info;
|
void *info;
|
||||||
};
|
};
|
||||||
|
|
||||||
static snd_config_t *parse_lookup_query(const char *query)
|
|
||||||
{
|
|
||||||
snd_input_t *input;
|
|
||||||
snd_config_t *config;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = snd_input_buffer_open(&input, query, strlen(query));
|
|
||||||
if (err < 0) {
|
|
||||||
uc_error("unable to create memory input buffer");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
err = snd_config_top(&config);
|
|
||||||
if (err < 0) {
|
|
||||||
snd_input_close(input);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
err = snd_config_load(config, input);
|
|
||||||
snd_input_close(input);
|
|
||||||
if (err < 0) {
|
|
||||||
snd_config_delete(config);
|
|
||||||
uc_error("wrong arguments '%s'", query);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *rval_lookup_main(snd_use_case_mgr_t *uc_mgr,
|
static char *rval_lookup_main(snd_use_case_mgr_t *uc_mgr,
|
||||||
const char *query,
|
const char *query,
|
||||||
struct lookup_iterate *iter)
|
struct lookup_iterate *iter)
|
||||||
|
|
@ -257,9 +231,11 @@ static char *rval_lookup_main(snd_use_case_mgr_t *uc_mgr,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
config = parse_lookup_query(query);
|
err = snd_config_load_string(&config, query, 0);
|
||||||
if (config == NULL)
|
if (err < 0) {
|
||||||
|
uc_error("The lookup arguments '%s' are invalid", query);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
if (iter->init && iter->init(uc_mgr, iter, config))
|
if (iter->init && iter->init(uc_mgr, iter, config))
|
||||||
goto null;
|
goto null;
|
||||||
if (snd_config_search(config, "field", &d)) {
|
if (snd_config_search(config, "field", &d)) {
|
||||||
|
|
|
||||||
|
|
@ -598,6 +598,22 @@ static void test_evaluate_string(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_load_string(void)
|
||||||
|
{
|
||||||
|
const char **cfg, *configs[] = {
|
||||||
|
"a=1,b=2",
|
||||||
|
"j 3;z 15;",
|
||||||
|
"x 0 y -1",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
snd_config_t *dst;
|
||||||
|
|
||||||
|
for (cfg = configs; *cfg; cfg++) {
|
||||||
|
ALSA_CHECK(snd_config_load_string(&dst, *cfg, 0));
|
||||||
|
ALSA_CHECK(snd_config_delete(dst));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
test_top();
|
test_top();
|
||||||
|
|
@ -629,5 +645,6 @@ int main(void)
|
||||||
test_iterators();
|
test_iterators();
|
||||||
test_for_each();
|
test_for_each();
|
||||||
test_evaluate_string();
|
test_evaluate_string();
|
||||||
|
test_load_string();
|
||||||
return TEST_EXIT_CODE();
|
return TEST_EXIT_CODE();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue