[alsa-devel] [PATCH] ucm: Allow cset commands to have values with spaces.

Tanu Kaskinen tanu.kaskinen at digia.com
Thu Aug 9 15:43:31 CEST 2012


An example:
    cset "name='Input Select' Digital Mic"

The old parsing code interpreted "name='Input Select' Digital"
as the element id, which of course didn't work.

Signed-off-by: Tanu Kaskinen <tanu.kaskinen at digia.com>
---
 src/ucm/main.c |   19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/ucm/main.c b/src/ucm/main.c
index 4b37776..05a7b0a 100644
--- a/src/ucm/main.c
+++ b/src/ucm/main.c
@@ -170,8 +170,23 @@ static int execute_cset(snd_ctl_t *ctl, char *cset)
 	snd_ctl_elem_value_malloc(&value);
 	snd_ctl_elem_info_malloc(&info);
 
-	pos = strrchr(cset, ' ');
-	if (pos == NULL) {
+	/* Find the space after the element id, taking quoting with
+	   single-quotes into account. */
+	for (pos = cset; *pos != '\0'; pos += strcspn(pos, "' ")) {
+		if (*pos == ' ')
+			break;
+		if (*pos == '\'') {
+			pos++;
+			pos += strcspn(pos, "'");
+			if (*pos == '\0') {
+				uc_error("invalid element id (closing single-quote not found): %s", cset);
+				err = -EINVAL;
+				goto __fail;
+			}
+			pos++;
+		}
+	}
+	if (*pos == '\0') {
 		uc_error("undefined value for cset >%s<", cset);
 		err = -EINVAL;
 		goto __fail;
-- 
1.7.9.5



More information about the Alsa-devel mailing list