config-parser: Add section iterator API

The X backend needs to iterate through all outputs.
dev
Kristian Høgsberg 12 years ago
parent b8f03aa20e
commit f73f316248
  1. 13
      shared/config-parser-test.c
  2. 24
      shared/config-parser.c
  3. 5
      shared/config-parser.h

@ -75,6 +75,10 @@ static const char t1[] =
"color=red\n" "color=red\n"
"contents=sand\n"; "contents=sand\n";
static const char *section_names[] = {
"foo", "bar", "stuff", "bucket", "bucket"
};
static const char t2[] = static const char t2[] =
"# invalid section...\n" "# invalid section...\n"
"[this bracket isn't closed\n"; "[this bracket isn't closed\n";
@ -93,8 +97,9 @@ int main(int argc, char *argv[])
{ {
struct weston_config *config; struct weston_config *config;
struct weston_config_section *section; struct weston_config_section *section;
const char *name;
char *s; char *s;
int r, b; int r, b, i;
int32_t n; int32_t n;
uint32_t u; uint32_t u;
@ -170,6 +175,12 @@ int main(int argc, char *argv[])
assert(r == -1 && errno == ENOENT && strcmp(s, "eels") == 0); assert(r == -1 && errno == ENOENT && strcmp(s, "eels") == 0);
free(s); 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); weston_config_destroy(config);
config = run_test(t2); config = run_test(t2);

@ -36,6 +36,10 @@
#include <wayland-util.h> #include <wayland-util.h>
#include "config-parser.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 static int
handle_key(const struct config_key *key, const char *value) handle_key(const struct config_key *key, const char *value)
{ {
@ -472,6 +476,26 @@ weston_config_parse(int fd)
return config; 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 void
weston_config_destroy(struct weston_config *config) weston_config_destroy(struct weston_config *config)
{ {

@ -102,6 +102,11 @@ weston_config_parse(int fd);
void void
weston_config_destroy(struct weston_config *config); 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 #ifdef __cplusplus
} }
#endif #endif

Loading…
Cancel
Save