]> git.alsa-project.org Git - alsa-lib.git/commitdiff
alsa-lib: fix the array parser (unique compound keys)
authorJaroslav Kysela <perex@perex.cz>
Thu, 12 Dec 2019 17:42:33 +0000 (18:42 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 12 Dec 2019 17:44:35 +0000 (18:44 +0100)
The code from the old import may merge arrays wrongly and
the result is a compound with same keys like:

Input:

        lines [
                "SSP0.OUT, , BUF1.3"
        ]
        lines [
                "BUF2.0, , SSP0.IN"
        ]

Parsed contents:

        lines {
                0 'SSP0.OUT, , BUF1.3'
                0 'BUF2.0, , SSP0.IN'
        }

Proper parsed contents (create+merge mode):

        lines {
                0 'SSP0.OUT, , BUF1.3'
                1 'BUF2.0, , SSP0.IN'
        }

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/conf.c

index e430650430d1bad94616e077c4cc319f652e53b3..3e753b266b8d58e3fc18fb01522480c0f763b95a 100644 (file)
@@ -1226,7 +1226,7 @@ static int parse_value(snd_config_t **_n, snd_config_t *parent, input_t *input,
 static int parse_defs(snd_config_t *parent, input_t *input, int skip, int override);
 static int parse_array_defs(snd_config_t *farther, input_t *input, int skip, int override);
 
-static int parse_array_def(snd_config_t *parent, input_t *input, int idx, int skip, int override)
+static int parse_array_def(snd_config_t *parent, input_t *input, int *idx, int skip, int override)
 {
        char *id = NULL;
        int c;
@@ -1234,8 +1234,21 @@ static int parse_array_def(snd_config_t *parent, input_t *input, int idx, int sk
        snd_config_t *n = NULL;
 
        if (!skip) {
+               snd_config_t *g;
                char static_id[12];
-               snprintf(static_id, sizeof(static_id), "%i", idx);
+               while (1) {
+                       snprintf(static_id, sizeof(static_id), "%i", *idx);
+                       if (_snd_config_search(parent, static_id, -1, &g) == 0) {
+                               if (override) {
+                                       snd_config_delete(n);
+                               } else {
+                                       /* merge */
+                                       (*idx)++;
+                                       continue;
+                               }
+                       }
+                       break;
+               }
                id = strdup(static_id);
                if (id == NULL)
                        return -ENOMEM;
@@ -1306,9 +1319,10 @@ static int parse_array_defs(snd_config_t *parent, input_t *input, int skip, int
                unget_char(c, input);
                if (c == ']')
                        return 0;
-               err = parse_array_def(parent, input, idx++, skip, override);
+               err = parse_array_def(parent, input, &idx, skip, override);
                if (err < 0)
                        return err;
+               idx++;
        }
        return 0;
 }