]> git.alsa-project.org Git - alsa-lib.git/commitdiff
ucm: substitute arguments in sequences only for syntax 3+
authorJaroslav Kysela <perex@perex.cz>
Wed, 27 May 2020 13:20:03 +0000 (15:20 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 27 May 2020 13:20:03 +0000 (15:20 +0200)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/ucm/parser.c

index bffc385b5f0e266056dd33f05cf28b179079aaaa..af144a9972c7908124795a9c1871178ad59c9127 100644 (file)
@@ -149,26 +149,36 @@ int parse_string_substitute(snd_use_case_mgr_t *uc_mgr,
 int parse_string_substitute3(snd_use_case_mgr_t *uc_mgr,
                             snd_config_t *n, char **res)
 {
-       const char *str;
-       char *s;
-       int err;
-
        if (uc_mgr->conf_format < 3)
                return parse_string(n, res);
-       err = snd_config_get_string(n, &str);
+       return parse_string_substitute(uc_mgr, n, res);
+}
+
+/*
+ * Parse integer with substitution
+ */
+int parse_integer_substitute(snd_use_case_mgr_t *uc_mgr,
+                            snd_config_t *n, long *res)
+{
+       char *s1, *s2;
+       int err;
+
+       err = snd_config_get_ascii(n, &s1);
        if (err < 0)
                return err;
-       err = uc_mgr_get_substituted_value(uc_mgr, &s, str);
+       err = uc_mgr_get_substituted_value(uc_mgr, &s2, s1);
        if (err >= 0)
-               *res = s;
+               err = safe_strtol(s2, res);
+       free(s2);
+       free(s1);
        return err;
 }
 
 /*
  * Parse integer with substitution
  */
-int parse_integer_substitute(snd_use_case_mgr_t *uc_mgr,
-                           snd_config_t *n, long *res)
+int parse_integer_substitute3(snd_use_case_mgr_t *uc_mgr,
+                             snd_config_t *n, long *res)
 {
        char *s1, *s2;
        int err;
@@ -176,10 +186,14 @@ int parse_integer_substitute(snd_use_case_mgr_t *uc_mgr,
        err = snd_config_get_ascii(n, &s1);
        if (err < 0)
                return err;
-       err = uc_mgr_get_substituted_value(uc_mgr, &s2, s1);
+       if (uc_mgr->conf_format < 3)
+               s2 = s1;
+       else
+               err = uc_mgr_get_substituted_value(uc_mgr, &s2, s1);
        if (err >= 0)
                err = safe_strtol(s2, res);
-       free(s2);
+       if (s1 != s2)
+               free(s2);
        free(s1);
        return err;
 }
@@ -672,7 +686,7 @@ static int parse_sequence(snd_use_case_mgr_t *uc_mgr,
 
                if (strcmp(cmd, "cdev") == 0) {
                        curr->type = SEQUENCE_ELEMENT_TYPE_CDEV;
-                       err = parse_string_substitute(uc_mgr, n, &curr->data.cdev);
+                       err = parse_string_substitute3(uc_mgr, n, &curr->data.cdev);
                        if (err < 0) {
                                uc_error("error: cdev requires a string!");
                                return err;
@@ -682,7 +696,7 @@ static int parse_sequence(snd_use_case_mgr_t *uc_mgr,
 
                if (strcmp(cmd, "cset") == 0) {
                        curr->type = SEQUENCE_ELEMENT_TYPE_CSET;
-                       err = parse_string_substitute(uc_mgr, n, &curr->data.cset);
+                       err = parse_string_substitute3(uc_mgr, n, &curr->data.cset);
                        if (err < 0) {
                                uc_error("error: cset requires a string!");
                                return err;
@@ -716,7 +730,7 @@ static int parse_sequence(snd_use_case_mgr_t *uc_mgr,
 
                if (strcmp(cmd, "cset-bin-file") == 0) {
                        curr->type = SEQUENCE_ELEMENT_TYPE_CSET_BIN_FILE;
-                       err = parse_string_substitute(uc_mgr, n, &curr->data.cset);
+                       err = parse_string_substitute3(uc_mgr, n, &curr->data.cset);
                        if (err < 0) {
                                uc_error("error: cset-bin-file requires a string!");
                                return err;
@@ -726,7 +740,7 @@ static int parse_sequence(snd_use_case_mgr_t *uc_mgr,
 
                if (strcmp(cmd, "cset-tlv") == 0) {
                        curr->type = SEQUENCE_ELEMENT_TYPE_CSET_TLV;
-                       err = parse_string_substitute(uc_mgr, n, &curr->data.cset);
+                       err = parse_string_substitute3(uc_mgr, n, &curr->data.cset);
                        if (err < 0) {
                                uc_error("error: cset-tlv requires a string!");
                                return err;
@@ -736,7 +750,7 @@ static int parse_sequence(snd_use_case_mgr_t *uc_mgr,
 
                if (strcmp(cmd, "usleep") == 0) {
                        curr->type = SEQUENCE_ELEMENT_TYPE_SLEEP;
-                       err = parse_integer_substitute(uc_mgr, n, &curr->data.sleep);
+                       err = parse_integer_substitute3(uc_mgr, n, &curr->data.sleep);
                        if (err < 0) {
                                uc_error("error: usleep requires integer!");
                                return err;
@@ -746,7 +760,7 @@ static int parse_sequence(snd_use_case_mgr_t *uc_mgr,
 
                if (strcmp(cmd, "msleep") == 0) {
                        curr->type = SEQUENCE_ELEMENT_TYPE_SLEEP;
-                       err = parse_integer_substitute(uc_mgr, n, &curr->data.sleep);
+                       err = parse_integer_substitute3(uc_mgr, n, &curr->data.sleep);
                        if (err < 0) {
                                uc_error("error: msleep requires integer!");
                                return err;
@@ -757,7 +771,7 @@ static int parse_sequence(snd_use_case_mgr_t *uc_mgr,
 
                if (strcmp(cmd, "exec") == 0) {
                        curr->type = SEQUENCE_ELEMENT_TYPE_EXEC;
-                       err = parse_string_substitute(uc_mgr, n, &curr->data.exec);
+                       err = parse_string_substitute3(uc_mgr, n, &curr->data.exec);
                        if (err < 0) {
                                uc_error("error: exec requires a string!");
                                return err;