- } else if (*v == '"') {
- char *e;
-
- e = strchr(v+1, '"');
- if (!e) {
- pa_log(__FILE__ ": [%s:%u] failed to parse line - missing role closing quote", filename, n);
- goto finish;
- }
-
- *e = '\0';
- e = pa_sprintf_malloc("media.role=\"%s\"", v+1);
- proplist = pa_proplist_from_string(e);
- pa_xfree(e);
- } else {
- char *e;
-
- e = v+strspn(v, WHITESPACE);
- if (!*e) {
- pa_log(__FILE__ ": [%s:%u] failed to parse line - missing end of property list", filename, n);
- goto finish;
- }
- *e = '\0';
- proplist = pa_proplist_from_string(v);
+ else {
+ size_t len;
+
+ token_end = value_str + strcspn(value_str, WHITESPACE);
+
+ len = token_end - value_str;
+ if (len == (sizeof(UPDATE_REPLACE) - 1) && !strncmp(value_str, UPDATE_REPLACE, len))
+ mode = PA_UPDATE_REPLACE;
+ else if (len == (sizeof(UPDATE_MERGE) - 1) && !strncmp(value_str, UPDATE_MERGE, len))
+ mode = PA_UPDATE_MERGE;
+
+ if (mode != (pa_update_mode_t) -1) {
+ value_str = token_end + strspn(token_end, WHITESPACE);
+
+ if (!*value_str) {
+ pa_log("[%s:%u] failed to parse line - too few words", fn, n);
+ goto finish;
+ }
+ } else
+ mode = PA_UPDATE_MERGE;
+
+ if (*value_str == '"') {
+ value_str++;
+
+ token_end = strchr(value_str, '"');
+ if (!token_end) {
+ pa_log("[%s:%u] failed to parse line - missing role closing quote", fn, n);
+ goto finish;
+ }
+ } else
+ token_end = value_str + strcspn(value_str, WHITESPACE);
+
+ *token_end = 0;
+
+ value_str = pa_sprintf_malloc("media.role=\"%s\"", value_str);
+ proplist = pa_proplist_from_string(value_str);
+ pa_xfree(value_str);