mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
conf: add snd_config_make_path() function
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
3050af4b90
commit
1aef5a8f8a
2 changed files with 99 additions and 0 deletions
|
|
@ -131,6 +131,8 @@ int snd_config_make_real(snd_config_t **config, const char *key);
|
||||||
int snd_config_make_string(snd_config_t **config, const char *key);
|
int snd_config_make_string(snd_config_t **config, const char *key);
|
||||||
int snd_config_make_pointer(snd_config_t **config, const char *key);
|
int snd_config_make_pointer(snd_config_t **config, const char *key);
|
||||||
int snd_config_make_compound(snd_config_t **config, const char *key, int join);
|
int snd_config_make_compound(snd_config_t **config, const char *key, int join);
|
||||||
|
int snd_config_make_path(snd_config_t **config, snd_config_t *root, const char *key,
|
||||||
|
int join, int override);
|
||||||
|
|
||||||
int snd_config_imake_integer(snd_config_t **config, const char *key, const long value);
|
int snd_config_imake_integer(snd_config_t **config, const char *key, const long value);
|
||||||
int snd_config_imake_integer64(snd_config_t **config, const char *key, const long long value);
|
int snd_config_imake_integer64(snd_config_t **config, const char *key, const long long value);
|
||||||
|
|
|
||||||
97
src/conf.c
97
src/conf.c
|
|
@ -2547,6 +2547,103 @@ int snd_config_make_compound(snd_config_t **config, const char *id,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Creates an empty compound configuration node in the path.
|
||||||
|
* \param[out] config The function puts the handle to the new or
|
||||||
|
* existing compound node at the address specified
|
||||||
|
* by \a config.
|
||||||
|
* \param[in] root The id of the new node.
|
||||||
|
* \param[in] key The id of the new node.
|
||||||
|
* \param[in] join Join flag.
|
||||||
|
* \param[in] override Override flag.
|
||||||
|
* \return Zero if successful, otherwise a negative error code.
|
||||||
|
*
|
||||||
|
* This function creates a new empty node of type
|
||||||
|
* #SND_CONFIG_TYPE_COMPOUND if the path does not exist. Otherwise,
|
||||||
|
* the node from the current configuration tree is returned without
|
||||||
|
* any modification. The \a join argument is ignored in this case.
|
||||||
|
*
|
||||||
|
* \a join determines how the compound node's id is printed when the
|
||||||
|
* configuration is saved to a text file. For example, if the join flag
|
||||||
|
* of compound node \c a is zero, the output will look as follows:
|
||||||
|
* \code
|
||||||
|
* a {
|
||||||
|
* b "hello"
|
||||||
|
* c 42
|
||||||
|
* }
|
||||||
|
* \endcode
|
||||||
|
* If, however, the join flag of \c a is nonzero, its id will be joined
|
||||||
|
* with its children's ids, like this:
|
||||||
|
* \code
|
||||||
|
* a.b "hello"
|
||||||
|
* a.c 42
|
||||||
|
* \endcode
|
||||||
|
* An \e empty compound node with its join flag set would result in no
|
||||||
|
* output, i.e., after saving and reloading the configuration file, that
|
||||||
|
* compound node would be lost.
|
||||||
|
*
|
||||||
|
* \par Errors:
|
||||||
|
* <dl>
|
||||||
|
* <dt>-ENOMEM<dd>Out of memory.
|
||||||
|
* <dt>-EACCESS<dd>Path exists, but it's not a compound (!override)
|
||||||
|
* </dl>
|
||||||
|
*/
|
||||||
|
int snd_config_make_path(snd_config_t **config, snd_config_t *root,
|
||||||
|
const char *key, int join, int override)
|
||||||
|
{
|
||||||
|
snd_config_t *n;
|
||||||
|
const char *p;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
p = strchr(key, '.');
|
||||||
|
if (p) {
|
||||||
|
err = _snd_config_search(root, key, p - key, &n);
|
||||||
|
if (err < 0) {
|
||||||
|
size_t l = p - key;
|
||||||
|
char *s = malloc(l + 1);
|
||||||
|
if (s == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
strncpy(s, key, l);
|
||||||
|
s[l] = '\0';
|
||||||
|
err = snd_config_make_compound(&n, s, join);
|
||||||
|
free(s);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
err = snd_config_add(root, n);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
root = n;
|
||||||
|
key = p + 1;
|
||||||
|
} else {
|
||||||
|
err = _snd_config_search(root, key, -1, config);
|
||||||
|
if (err == 0) {
|
||||||
|
if ((*config)->type != SND_CONFIG_TYPE_COMPOUND) {
|
||||||
|
if (override) {
|
||||||
|
err = snd_config_delete(*config);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
goto __make;
|
||||||
|
} else {
|
||||||
|
return -EACCES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
__make:
|
||||||
|
err = snd_config_make_compound(&n, key, join);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
err = snd_config_add(root, n);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
*config = n;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Creates an integer configuration node with the given initial value.
|
* \brief Creates an integer configuration node with the given initial value.
|
||||||
* \param[out] config The function puts the handle to the new node at
|
* \param[out] config The function puts the handle to the new node at
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue