[pulseaudio-discuss] [PATCH v2 5/6] pactl: Implement list message-handlers

Georg Chini georg at chini.tk
Mon Jan 22 12:33:06 UTC 2018


On 21.01.2018 14:55, Georg Chini wrote:
> For better readability, "pactl list message-handlers" is introduced which
> prints a formatted output of "pactl send-message /core list-handlers".
>
> The patch also adds the function pa_split_message_parameter_string() for
> easy parsing of the message response string.
> ---
>   man/pactl.1.xml.in               |  2 +-
>   shell-completion/bash/pulseaudio |  2 +-
>   shell-completion/zsh/_pulseaudio |  1 +
>   src/pulse/util.c                 | 65 ++++++++++++++++++++++++++++++++++++++++
>   src/pulse/util.h                 |  4 +++
>   src/utils/pactl.c                | 60 +++++++++++++++++++++++++++++++++++--
>   6 files changed, 130 insertions(+), 4 deletions(-)
>
>
> diff --git a/src/pulse/util.c b/src/pulse/util.c
> index 54fe7a28..0324c4a6 100644
> --- a/src/pulse/util.c
> +++ b/src/pulse/util.c
> @@ -342,3 +342,68 @@ int pa_msleep(unsigned long t) {
>   #error "Platform lacks a sleep function."
>   #endif
>   }
> +
> +/* Split the specified string into elements. An element is defined as
> + * a sub-string between curly braces. The function is needed to parse
> + * the parameters of messages. Each time it is called returns the position
> + * of the next element in start_pos and the length of the element in
> + * length. If max_length is not 0, it is verified that the retrieved
> + * element is within the bounds of the parent element. If the parameter
> + * element is not NULL, a newly allocated string containing the retrieved
> + * element is returned. The caller is responsible to free the string.
> + * The variable state points to, should be initialized to NULL before
> + * the first call. */
> +int pa_split_message_parameter_string(const char *c, uint32_t max_length, const char **start_pos, uint32_t *length, char **element, const char **state) {
> +    const char *current = *state ? *state : c;
> +    uint32_t open_braces;
> +
> +    pa_assert(start_pos);
> +
> +    *start_pos = NULL;
> +
> +    /* End of string */
> +    if (!*current || *c == 0)
> +        return 0;
> +
> +    /* Find opening brace */
> +    current = strchr(current, '{');
> +
Simply using strchr() to find the next opening brace is incorrect.
This way, input like {x1} } {x2} will not produce a parse error,
because the excess closing brace is ignored by strchr(). I'll send
an updated version of patch 5 and 6.


More information about the pulseaudio-discuss mailing list