On 20/01/15 05:30 PM, Bryce Harrington wrote:
> From: "Bryce Harrington" <[email protected]>
> 
> Adds weston_config_update(), which parses a condensed string of
> comma-delimited key/value pairs and adds or changes the corresponding
> parameters in the weston_config structure.
> 
> Signed-off-by: Bryce Harrington (http://osg.samsung.com) 
> <[email protected]>
> Signed-off-by: Bryce Harrington <[email protected]>
> ---
>  shared/config-parser.c | 72 
> +++++++++++++++++++++++++++++++++++++++++++++++---
>  shared/config-parser.h |  6 +++++
>  2 files changed, 75 insertions(+), 3 deletions(-)
> 
> diff --git a/shared/config-parser.c b/shared/config-parser.c
> index 78039ba..0b60c2f 100644
> --- a/shared/config-parser.c
> +++ b/shared/config-parser.c
> @@ -377,6 +377,20 @@ weston_config_get_libexec_dir(void)
>  }
>  
>  struct weston_config *
> +weston_config_create(void)
> +{
> +     struct weston_config *config;
> +
> +     config = malloc(sizeof *config);
> +     if (config == NULL)
> +             return NULL;
> +
> +     wl_list_init(&config->section_list);
> +
> +     return config;
> +}

The need for this isn't explained in the commit log... is this intended
to be part of a different patch?

> +
> +struct weston_config *
>  weston_config_parse(const char *name)
>  {
>       FILE *fp;
> @@ -385,12 +399,10 @@ weston_config_parse(const char *name)
>       struct weston_config_section *section = NULL;
>       int i, fd;
>  
> -     config = malloc(sizeof *config);
> +     config = weston_config_create();
>       if (config == NULL)
>               return NULL;
>  
> -     wl_list_init(&config->section_list);
> -
>       fd = open_config_file(config, name);
>       if (fd == -1) {
>               free(config);
> @@ -449,6 +461,60 @@ weston_config_parse(const char *name)
>       return config;
>  }
>  
> +/* Parses a string of the form section.key=value,section.key=value
> + * and updates the provided config.
> + */
> +bool
> +weston_config_update(struct weston_config *config, char *line)
> +{
> +     char *p;
> +     char *tok;
> +     char *saveptr;
> +     char *section_name;
> +     char *key;
> +     char *value;
> +     struct weston_config_section *section = NULL;
> +
> +     tok = strtok_r(line, ",", &saveptr);
> +     while (tok != NULL) {
> +             p = strchr(tok, '.');
> +             p[0] = '\0';
> +             section_name = strdup(tok);
> +             tok = p+1;

Can segfault if no . present in the string.

> +
> +             p = strchr(tok, '=');
> +             p[0] = '\0';
> +             key = strdup(tok);
> +             value = p+1;

Similar problem here.

> +             section = weston_config_get_section(config, section_name, NULL, 
> NULL);
> +             if (section == NULL) {
> +                     section = config_add_section(config, section_name);
> +                     if (section == NULL) {
> +                             fprintf(stderr, "could not add section %s\n", 
> section_name);
> +                             free(section_name);
> +                             free(key);
> +                             return false;
> +                     }
> +             }
> +             if (!weston_config_section_set(section, key, value)) {
> +                     fprintf(stderr, "could not set %s to %s in section 
> %s\n",
> +                             key, value, section_name);
> +                     free(section_name);
> +                     free(key);
> +                     return false;
> +             }
> +
> +             free(section_name);
> +             free(key);
> +
> +             tok = strtok_r(NULL, ",", &saveptr);
> +     }
> +
> +     return true;
> +}
> +
> +
>  const char *
>  weston_config_get_full_path(struct weston_config *config)
>  {
> diff --git a/shared/config-parser.h b/shared/config-parser.h
> index e47c54a..d70b0a0 100644
> --- a/shared/config-parser.h
> +++ b/shared/config-parser.h
> @@ -101,8 +101,14 @@ const char *
>  weston_config_get_libexec_dir(void);
>  
>  struct weston_config *
> +weston_config_create(void);
> +
> +struct weston_config *
>  weston_config_parse(const char *name);
>  
> +bool
> +weston_config_update(struct weston_config *config, char *line);
> +
>  const char *
>  weston_config_get_full_path(struct weston_config *config);
>  
> 

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to