[pulseaudio-discuss] RFC: Change the modarg parser to keep the raw form

Maarten Bosmans mkbosmans at gmail.com
Wed Sep 7 00:41:34 PDT 2011


2011/9/6 Colin Guthrie <gmane at colin.guthr.ie>:
> 'Twas brillig, and Colin Guthrie at 06/09/11 11:53 did gyre and gimble:
>> Late in the cycle so wanted to get more eyes on this before pushing.
>>
>> These patches simply modify things to ensure that the 'raw' form of
>> modargs will still be accessable and thus can be used by the proplist
>> parser.
>>
>> Now, this does break the proplist-test as it no longer parses the triple
>> escaped input. IMO, this is acceptable, as there should be no need to triple
>> escape things due to a quirk of how the modargs are parsed in the first place.

The gain in consistency outweighs the loss of compitibility here, IMHO.
With gain in consistency, I mean that regardless of the inner level of
quoting, you only need one escape for a quote in the string.
before:
   sink_properties="device.description='escape \' me'"
   sink_properties='device.description="escape \\' me"'
with patch:
   sink_properties="device.description='escape \' me'"
   sink_properties='device.description="escape \' me"'

>> That said, compatibility may be more important here? I suspect the impact of
>> a change would be minimal however.
>
> Just for the sake of completeness, this does have some drawbacks.
>
> Under the old scheme, you could vary which type of quotes you used for
> your property assignments in the proplist itself. (i.e. mix and match
> double quotes, vs single quotes: foo="bar" foo2='wibble'
>
> With this new "improved" scheme, we have to use the same style quotes
> all the way through - i.e. the opposite type to what we delimit the
> argument itself with:
>
> e.g.
>  sink_properties="foo='bar\"quote\"' foo2='wibble'"
> or
>  sink_properties='foo="bar\"quote\"" foo2="wibble"'

Indeed, this works, but I was initially thrown off by the double-quote
escaping of pactl/pulseaudio output. But that's only done on output
(by pa_proplist_to_string_sep), so no problem.

> both work fine, but you can't mix and match.
>
> IMO, even with this limitation, it is still simpler than passing:
>  sink_properties="foo='bar\\\"quote\\\"' foo2='wibble'"
> or
>  sink_properties='foo="bar\\\"quote\\\"" foo2="wibble"'

As you mentioned on IRC, the triple quoting is only when using it in c
source code. For example in default.pa it's just a single vs. double
quote issue.

> For reference, this is the change needed to "fix" the test:
>
> diff --git a/src/tests/proplist-test.c b/src/tests/proplist-test.c
> index 27a0d3f..8b5a235 100644
> --- a/src/tests/proplist-test.c
> +++ b/src/tests/proplist-test.c
> @@ -81,7 +81,7 @@ int main(int argc, char*argv[]) {
>     printf("%s\n", v);
>     pa_xfree(v);
>
> -    pa_assert_se(ma = pa_modargs_new("foo='foobar=waldo
> foo2=\"lj\\\\\"dhflh\" foo3=\\'kjlskj\\\\\\'\\''", x));
> +    pa_assert_se(ma = pa_modargs_new("foo='foobar=waldo
> foo2=\"lj\\\"dhflh\" foo3=\"kjlskj\\'\"'", x));
>     pa_assert_se(a = pa_proplist_new());
>
>     pa_assert_se(pa_modargs_get_proplist(ma, "foo", a,
> PA_UPDATE_REPLACE) >= 0);

Yup, that would be an improvement.

Maarten


More information about the pulseaudio-discuss mailing list