From 3864f7d95f7ad97690ed8e823aab3c96abfe5e48 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 24 Apr 2024 15:33:40 +0200 Subject: [PATCH] ucm: define and describe Syntax 7 - for new macro argument substitution - for new Path condition fields substitutions Link: https://github.com/alsa-project/alsa-ucm-conf/pull/411 Link: https://github.com/alsa-project/alsa-lib/issues/395 Signed-off-by: Jaroslav Kysela --- src/ucm/parser.c | 15 ++++++++++----- src/ucm/ucm_cond.c | 26 ++++++++++++++++++-------- src/ucm/ucm_confdoc.h | 14 ++++++++++++-- src/ucm/ucm_local.h | 2 +- 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/ucm/parser.c b/src/ucm/parser.c index 02f01a10..488a5c62 100644 --- a/src/ucm/parser.c +++ b/src/ucm/parser.c @@ -454,11 +454,16 @@ static int evaluate_macro1(snd_use_case_mgr_t *uc_mgr, err = snd_config_get_ascii(n, &var); if (err < 0) goto __err_path; - err = uc_mgr_get_substituted_value(uc_mgr, &var2, var); - free(var); - if (err >= 0) { - err = uc_mgr_set_variable(uc_mgr, name, var2); - free(var2); + if (uc_mgr->conf_format < 7) { + err = uc_mgr_set_variable(uc_mgr, name, var); + free(var); + } else { + err = uc_mgr_get_substituted_value(uc_mgr, &var2, var); + free(var); + if (err >= 0) { + err = uc_mgr_set_variable(uc_mgr, name, var2); + free(var2); + } } if (err < 0) goto __err_path; diff --git a/src/ucm/ucm_cond.c b/src/ucm/ucm_cond.c index bc4444e3..87bc9762 100644 --- a/src/ucm/ucm_cond.c +++ b/src/ucm/ucm_cond.c @@ -293,9 +293,13 @@ static int if_eval_path(snd_use_case_mgr_t *uc_mgr, snd_config_t *eval) return -EINVAL; } - err = uc_mgr_get_substituted_value(uc_mgr, &s, mode); - if (err < 0) - return err; + if (uc_mgr->conf_format < 7) { + s = (char *)mode; + } else { + err = uc_mgr_get_substituted_value(uc_mgr, &s, mode); + if (err < 0) + return err; + } if (strncasecmp(s, "exist", 5) == 0) { amode = F_OK; } else if (strcasecmp(s, "read") == 0) { @@ -309,17 +313,23 @@ static int if_eval_path(snd_use_case_mgr_t *uc_mgr, snd_config_t *eval) free(s); return -EINVAL; } - free(s); + if (s != mode) + free(s); - err = uc_mgr_get_substituted_value(uc_mgr, &s, path); - if (err < 0) - return err; + if (uc_mgr->conf_format < 7) { + s = (char *)path; + } else { + err = uc_mgr_get_substituted_value(uc_mgr, &s, path); + if (err < 0) + return err; + } #ifdef HAVE_EACCESS err = eaccess(s, amode); #else err = access(s, amode); #endif - free(s); + if (s != path) + free(s); return err ? 0 : 1; } diff --git a/src/ucm/ucm_confdoc.h b/src/ucm/ucm_confdoc.h index 7a907934..eb12a714 100644 --- a/src/ucm/ucm_confdoc.h +++ b/src/ucm/ucm_confdoc.h @@ -63,7 +63,7 @@ use case verbs for that sound card. i.e.: # Example master file for blah sound card # By Joe Blogs -Syntax 6 +Syntax 7 # Use Case name for user interface Comment "Nice Abstracted Soundcard" @@ -489,7 +489,8 @@ DefineMacro.macro1 { The arguments in the macro are refered as the variables with the double underscore name prefix (like *__variable*). The configuration block in the DefineMacro subtree is always evaluated (including arguments and variables) -at the time of the instantiation. +at the time of the instantiation. Argument string substitutions +(for multiple macro call levels) were added in *Syntax* version *7*. The macros can be instantiated (expanded) using: @@ -563,6 +564,15 @@ Field | Description String | string Regex | regex expression (extended posix, ignore case) +#### Path is present (Type Path) + +Field | Description +---------------------|----------------------- +Path | path (filename) +Mode | exist,read,write,exec + +Note: Substitution for Path and Mode fields were added in *Syntax* version *7*. + #### ALSA control element exists (Type ControlExists) Field | Description diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h index fc249058..464d1154 100644 --- a/src/ucm/ucm_local.h +++ b/src/ucm/ucm_local.h @@ -40,7 +40,7 @@ #include #include "use-case.h" -#define SYNTAX_VERSION_MAX 6 +#define SYNTAX_VERSION_MAX 7 #define MAX_CARD_SHORT_NAME 32 #define MAX_CARD_LONG_NAME 80 -- 2.47.1