config-parser: Add section iterator API
authorKristian Høgsberg <krh@bitplanet.net>
Mon, 27 May 2013 00:50:53 +0000 (20:50 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Mon, 27 May 2013 00:50:53 +0000 (20:50 -0400)
The X backend needs to iterate through all outputs.

shared/config-parser-test.c
shared/config-parser.c
shared/config-parser.h

index 11eb9aa..86843a0 100644 (file)
@@ -75,6 +75,10 @@ static const char t1[] =
        "color=red\n"
        "contents=sand\n";
 
+static const char *section_names[] = {
+       "foo", "bar", "stuff", "bucket", "bucket"
+};
+
 static const char t2[] =
        "# invalid section...\n"
        "[this bracket isn't closed\n";
@@ -93,8 +97,9 @@ int main(int argc, char *argv[])
 {
        struct weston_config *config;
        struct weston_config_section *section;
+       const char *name;
        char *s;
-       int r, b;
+       int r, b, i;
        int32_t n;
        uint32_t u;
 
@@ -170,6 +175,12 @@ int main(int argc, char *argv[])
        assert(r == -1 && errno == ENOENT && strcmp(s, "eels") == 0);
        free(s);
 
+       section = NULL;
+       i = 0;
+       while (weston_config_next_section(config, &section, &name))
+               assert(strcmp(section_names[i++], name) == 0);
+       assert(i == 5);
+
        weston_config_destroy(config);
 
        config = run_test(t2);
index 9772c12..7a19ea5 100644 (file)
 #include <wayland-util.h>
 #include "config-parser.h"
 
+#define container_of(ptr, type, member) ({                             \
+       const __typeof__( ((type *)0)->member ) *__mptr = (ptr);        \
+       (type *)( (char *)__mptr - offsetof(type,member) );})
+
 static int
 handle_key(const struct config_key *key, const char *value)
 {
@@ -472,6 +476,26 @@ weston_config_parse(int fd)
        return config;
 }
 
+int
+weston_config_next_section(struct weston_config *config,
+                          struct weston_config_section **section,
+                          const char **name)
+{
+       if (*section == NULL)
+               *section = container_of(config->section_list.next,
+                                       struct weston_config_section, link);
+       else
+               *section = container_of((*section)->link.next,
+                                       struct weston_config_section, link);
+
+       if (&(*section)->link == &config->section_list)
+               return 0;
+
+       *name = (*section)->name;
+
+       return 1;
+}
+
 void
 weston_config_destroy(struct weston_config *config)
 {
index 949f4d6..794e09c 100644 (file)
@@ -102,6 +102,11 @@ weston_config_parse(int fd);
 void
 weston_config_destroy(struct weston_config *config);
 
+int weston_config_next_section(struct weston_config *config,
+                              struct weston_config_section **section,
+                              const char **name);
+
+
 #ifdef  __cplusplus
 }
 #endif