mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2026-03-20 05:33:44 -04:00
ucm: allow string with substitution for If.Condition block (Syntax 9)
When If.Condition is a string type instead of compound, parse it using snd_config_load_string with variable substitution support for syntax v9+. This allows more flexible condition definitions using variable references. Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
30d1ae7221
commit
c41f795f5c
1 changed files with 41 additions and 13 deletions
|
|
@ -452,7 +452,9 @@ static int if_eval_one(snd_use_case_mgr_t *uc_mgr,
|
||||||
snd_config_t **prepend,
|
snd_config_t **prepend,
|
||||||
snd_config_t **append)
|
snd_config_t **append)
|
||||||
{
|
{
|
||||||
snd_config_t *expr, *_true = NULL, *_false = NULL;
|
snd_config_t *expr, *expr_eval = NULL, *_true = NULL, *_false = NULL;
|
||||||
|
const char *s;
|
||||||
|
char *s1;
|
||||||
int err, has_condition;
|
int err, has_condition;
|
||||||
|
|
||||||
*result = NULL;
|
*result = NULL;
|
||||||
|
|
@ -467,73 +469,99 @@ static int if_eval_one(snd_use_case_mgr_t *uc_mgr,
|
||||||
/* For syntax v8+, Condition is optional if Prepend or Append is present */
|
/* For syntax v8+, Condition is optional if Prepend or Append is present */
|
||||||
has_condition = snd_config_search(cond, "Condition", &expr) >= 0;
|
has_condition = snd_config_search(cond, "Condition", &expr) >= 0;
|
||||||
|
|
||||||
|
if (has_condition && uc_mgr->conf_format >= 9 &&
|
||||||
|
snd_config_get_type(expr) == SND_CONFIG_TYPE_STRING) {
|
||||||
|
err = snd_config_get_string(expr, &s);
|
||||||
|
if (err < 0) {
|
||||||
|
snd_error(UCM, "Condition string error (If)");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
err = uc_mgr_get_substituted_value(uc_mgr, &s1, s);
|
||||||
|
if (err >= 0) {
|
||||||
|
err = snd_config_load_string(&expr_eval, s1, 0);
|
||||||
|
free(s1);
|
||||||
|
}
|
||||||
|
if (err < 0) {
|
||||||
|
snd_error(UCM, "Condition string parse error (If)");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
expr = expr_eval;
|
||||||
|
}
|
||||||
|
|
||||||
if (uc_mgr->conf_format >= 8) {
|
if (uc_mgr->conf_format >= 8) {
|
||||||
/* Check for Prepend block */
|
/* Check for Prepend block */
|
||||||
err = snd_config_search(cond, "Prepend", prepend);
|
err = snd_config_search(cond, "Prepend", prepend);
|
||||||
if (err < 0 && err != -ENOENT) {
|
if (err < 0 && err != -ENOENT) {
|
||||||
snd_error(UCM, "prepend block error (If)");
|
snd_error(UCM, "prepend block error (If)");
|
||||||
return -EINVAL;
|
goto __error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for Append block */
|
/* Check for Append block */
|
||||||
err = snd_config_search(cond, "Append", append);
|
err = snd_config_search(cond, "Append", append);
|
||||||
if (err < 0 && err != -ENOENT) {
|
if (err < 0 && err != -ENOENT) {
|
||||||
snd_error(UCM, "append block error (If)");
|
snd_error(UCM, "append block error (If)");
|
||||||
return -EINVAL;
|
goto __error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If Prepend or Append is present, Condition can be omitted */
|
/* If Prepend or Append is present, Condition can be omitted */
|
||||||
if (!has_condition && (*prepend == NULL && *append == NULL)) {
|
if (!has_condition && (*prepend == NULL && *append == NULL)) {
|
||||||
snd_error(UCM, "condition block expected (If)");
|
snd_error(UCM, "condition block expected (If)");
|
||||||
return -EINVAL;
|
goto __error;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!has_condition) {
|
if (!has_condition) {
|
||||||
snd_error(UCM, "condition block expected (If)");
|
snd_error(UCM, "condition block expected (If)");
|
||||||
return -EINVAL;
|
goto __error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = snd_config_search(cond, "True", &_true);
|
err = snd_config_search(cond, "True", &_true);
|
||||||
if (err < 0 && err != -ENOENT) {
|
if (err < 0 && err != -ENOENT) {
|
||||||
snd_error(UCM, "true block error (If)");
|
snd_error(UCM, "true block error (If)");
|
||||||
return -EINVAL;
|
goto __error;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = snd_config_search(cond, "False", &_false);
|
err = snd_config_search(cond, "False", &_false);
|
||||||
if (err < 0 && err != -ENOENT) {
|
if (err < 0 && err != -ENOENT) {
|
||||||
snd_error(UCM, "false block error (If)");
|
snd_error(UCM, "false block error (If)");
|
||||||
return -EINVAL;
|
goto __error;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = snd_config_search(cond, "Before", before);
|
err = snd_config_search(cond, "Before", before);
|
||||||
if (err < 0 && err != -ENOENT) {
|
if (err < 0 && err != -ENOENT) {
|
||||||
snd_error(UCM, "before block identifier error");
|
snd_error(UCM, "before block identifier error");
|
||||||
return -EINVAL;
|
goto __error;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = snd_config_search(cond, "After", after);
|
err = snd_config_search(cond, "After", after);
|
||||||
if (err < 0 && err != -ENOENT) {
|
if (err < 0 && err != -ENOENT) {
|
||||||
snd_error(UCM, "before block identifier error");
|
snd_error(UCM, "before block identifier error");
|
||||||
return -EINVAL;
|
goto __error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Evaluate condition if present */
|
/* Evaluate condition if present */
|
||||||
if (has_condition) {
|
if (has_condition) {
|
||||||
err = if_eval(uc_mgr, expr);
|
err = if_eval(uc_mgr, expr);
|
||||||
|
if (err < 0)
|
||||||
|
goto __error;
|
||||||
if (err > 0) {
|
if (err > 0) {
|
||||||
*result = _true;
|
*result = _true;
|
||||||
return 0;
|
goto __return;
|
||||||
} else if (err == 0) {
|
} else if (err == 0) {
|
||||||
*result = _false;
|
*result = _false;
|
||||||
return 0;
|
goto __return;
|
||||||
} else {
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If no condition (v8+ with Prepend/Append only), no result block */
|
/* If no condition (v8+ with Prepend/Append only), no result block */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
__error:
|
||||||
|
err = -EINVAL;
|
||||||
|
__return:
|
||||||
|
if (expr_eval)
|
||||||
|
snd_config_delete(expr_eval);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue