Looks good to me.

Reviewed-by: Derek Foreman <[email protected]>

On 20/01/15 05:30 PM, Bryce Harrington wrote:
> From: "Bryce Harrington" <[email protected]>
> 
> Adds a setter, weston_config_section_set(), for changing key values in
> the loaded copy of the weston.ini configuration.  This functionality is
> not exposed to clients.  Changes are not saved to disk.
> 
> Signed-off-by: Bryce Harrington (http://osg.samsung.com) 
> <[email protected]>
> Signed-off-by: Bryce Harrington <[email protected]>
> ---
>  shared/config-parser.c     | 88 
> ++++++++++++++++++++++++++++++++--------------
>  shared/config-parser.h     |  5 +++
>  tests/config-parser-test.c | 22 ++++++++++++
>  3 files changed, 88 insertions(+), 27 deletions(-)
> 
> diff --git a/shared/config-parser.c b/shared/config-parser.c
> index b72cb77..78039ba 100644
> --- a/shared/config-parser.c
> +++ b/shared/config-parser.c
> @@ -115,6 +115,33 @@ open_config_file(struct weston_config *c, const char 
> *name)
>       return open(c->path, O_RDONLY | O_CLOEXEC);
>  }
>  
> +static struct weston_config_section *
> +config_add_section(struct weston_config *config, const char *name)
> +{
> +     struct weston_config_section *section;
> +
> +     section = malloc(sizeof *section);
> +     section->name = strdup(name);
> +     wl_list_init(&section->entry_list);
> +     wl_list_insert(config->section_list.prev, &section->link);
> +
> +     return section;
> +}
> +
> +static struct weston_config_entry *
> +section_add_entry(struct weston_config_section *section,
> +               const char *key, const char *value)
> +{
> +     struct weston_config_entry *entry;
> +
> +     entry = malloc(sizeof *entry);
> +     entry->key = strdup(key);
> +     entry->value = strdup(value);
> +     wl_list_insert(section->entry_list.prev, &entry->link);
> +
> +     return entry;
> +}
> +
>  static struct weston_config_entry *
>  config_section_get_entry(struct weston_config_section *section,
>                        const char *key)
> @@ -174,6 +201,40 @@ weston_config_get_section(struct weston_config *config, 
> const char *section,
>       return NULL;
>  }
>  
> +/** Set a value in the configuration
> + *
> + * \param section    Data structure containing \c key to be updated
> + * \param key                Name of parameter to change
> + * \param value              String value to set \c key to
> + *
> + * \return true if the value could be set, false otherwise.
> + *
> + * This routine allows changing of specific entries in the config
> + * data loaded from a configuration file.  This does not change the
> + * config file on disk, only the values in memory.
> + */
> +WL_EXPORT
> +bool
> +weston_config_section_set(struct weston_config_section *section,
> +                       const char *key, const char *value)
> +{
> +     struct weston_config_entry *e;
> +
> +     if (section == NULL || key == NULL || value == NULL)
> +             return false;
> +
> +     e = config_section_get_entry(section, key);
> +     if (e == NULL) {
> +             // If no entry, create a new one
> +             e = section_add_entry(section, key, value);
> +     } else {
> +             // Change existing value
> +             free(e->value);
> +             e->value = strdup(value);
> +     }
> +     return (e != NULL) && (e->value != NULL);
> +}
> +
>  WL_EXPORT
>  int
>  weston_config_section_get_int(struct weston_config_section *section,
> @@ -315,33 +376,6 @@ weston_config_get_libexec_dir(void)
>       return LIBEXECDIR;
>  }
>  
> -static struct weston_config_section *
> -config_add_section(struct weston_config *config, const char *name)
> -{
> -     struct weston_config_section *section;
> -
> -     section = malloc(sizeof *section);
> -     section->name = strdup(name);
> -     wl_list_init(&section->entry_list);
> -     wl_list_insert(config->section_list.prev, &section->link);
> -
> -     return section;
> -}
> -
> -static struct weston_config_entry *
> -section_add_entry(struct weston_config_section *section,
> -               const char *key, const char *value)
> -{
> -     struct weston_config_entry *entry;
> -
> -     entry = malloc(sizeof *entry);
> -     entry->key = strdup(key);
> -     entry->value = strdup(value);
> -     wl_list_insert(section->entry_list.prev, &entry->link);
> -
> -     return entry;
> -}
> -
>  struct weston_config *
>  weston_config_parse(const char *name)
>  {
> diff --git a/shared/config-parser.h b/shared/config-parser.h
> index 1ecc8cc..e47c54a 100644
> --- a/shared/config-parser.h
> +++ b/shared/config-parser.h
> @@ -27,6 +27,8 @@
>  extern "C" {
>  #endif
>  
> +#include <stdbool.h>
> +
>  enum config_key_type {
>       CONFIG_KEY_INTEGER,             /* typeof data = int */
>       CONFIG_KEY_UNSIGNED_INTEGER,    /* typeof data = unsigned int */
> @@ -71,6 +73,9 @@ struct weston_config;
>  struct weston_config_section *
>  weston_config_get_section(struct weston_config *config, const char *section,
>                         const char *key, const char *value);
> +bool
> +weston_config_section_set(struct weston_config_section *section,
> +                       const char *key, const char *value);
>  int
>  weston_config_section_get_int(struct weston_config_section *section,
>                             const char *key,
> diff --git a/tests/config-parser-test.c b/tests/config-parser-test.c
> index 4b255b7..fa61ffd 100644
> --- a/tests/config-parser-test.c
> +++ b/tests/config-parser-test.c
> @@ -96,6 +96,10 @@ static const char t4[] =
>       "[bambam]\n"
>       "=not valid at all\n";
>  
> +static const char t5[] =
> +     "[foo]\n"
> +     "a=b\n";
> +
>  int main(int argc, char *argv[])
>  {
>       struct weston_config *config;
> @@ -200,6 +204,24 @@ int main(int argc, char *argv[])
>  
>       section = weston_config_get_section(NULL, "bucket", NULL, NULL);
>       assert(section == NULL);
> +     weston_config_destroy(config);
> +
> +     /* Setting values */
> +     config = run_test(t5);
> +
> +     section = weston_config_get_section(config, "foo", NULL, NULL);
> +     assert(weston_config_section_set(section, "a", "c"));
> +
> +     section = weston_config_get_section(config, "foo", NULL, NULL);
> +     r = weston_config_section_get_string(section, "a", &s, NULL);
> +     assert(r == 0 && strcmp(s, "c") == 0);
> +     free(s);
> +
> +     assert(!weston_config_section_set(NULL, "a", "c"));
> +     assert(!weston_config_section_set(section, NULL, "c"));
> +     assert(!weston_config_section_set(section, "a", NULL));
> +
> +     weston_config_destroy(config);
>  
>       return 0;
>  }
> 

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

Reply via email to