ucimap: add an example for optmap data structure encapsulation
[project/uci.git] / ucimap-example.c
index 3fd3765..0e3f7a4 100644 (file)
@@ -29,7 +29,7 @@ struct uci_network {
        const char *ipaddr;
        int test;
        bool enabled;
-       struct list_head aliases;
+       struct ucimap_list *aliases;
 };
 
 struct uci_alias {
@@ -82,32 +82,79 @@ network_add_alias(struct uci_map *map, void *section)
        return 0;
 }
 
-struct uci_sectmap network_interface;
-struct uci_sectmap network_alias;
+struct my_optmap {
+       struct uci_optmap map;
+       int test;
+};
+
+static struct uci_sectmap network_interface;
+static struct uci_sectmap network_alias;
 
-struct uci_optmap network_interface_options[] = {
-       OPTMAP_OPTION(UCIMAP_STRING, struct uci_network, proto, .data.s.maxlen = 32),
-       OPTMAP_OPTION(UCIMAP_STRING, struct uci_network, ifname),
-       OPTMAP_OPTION(UCIMAP_STRING, struct uci_network, ipaddr),
-       OPTMAP_OPTION(UCIMAP_BOOL, struct uci_network, enabled),
-       OPTMAP_OPTION(UCIMAP_INT, struct uci_network, test),
-       OPTMAP_OPTION(UCIMAP_LIST | UCIMAP_SECTION, struct uci_network, aliases, .data.sm = &network_alias),
+static struct my_optmap network_interface_options[] = {
+       {
+               .map = {
+                       UCIMAP_OPTION(struct uci_network, proto),
+                       .type = UCIMAP_STRING,
+                       .name = "proto",
+                       .data.s.maxlen = 32,
+               }
+       },
+       {
+               .map = {
+                       UCIMAP_OPTION(struct uci_network, ifname),
+                       .type = UCIMAP_STRING,
+                       .name = "ifname"
+               }
+       },
+       {
+               .map = {
+                       UCIMAP_OPTION(struct uci_network, ipaddr),
+                       .type = UCIMAP_STRING,
+                       .name = "ipaddr",
+               }
+       },
+       {
+               .map = {
+                       UCIMAP_OPTION(struct uci_network, enabled),
+                       .type = UCIMAP_BOOL,
+                       .name = "enabled",
+               }
+       },
+       {
+               .map = {
+                       UCIMAP_OPTION(struct uci_network, test),
+                       .type = UCIMAP_INT,
+                       .name = "test"
+               }
+       },
+       {
+               .map = {
+                       UCIMAP_OPTION(struct uci_network, aliases),
+                       .type = UCIMAP_LIST | UCIMAP_SECTION,
+                       .data.sm = &network_alias
+               }
+       }
 };
 
-struct uci_sectmap network_interface = {
+static struct uci_sectmap network_interface = {
        .type = "interface",
-       .options = network_interface_options,
        .alloc_len = sizeof(struct uci_network),
        .init_section = network_init_interface,
        .add_section = network_add_interface,
+       .options = &network_interface_options[0].map,
        .n_options = ARRAY_SIZE(network_interface_options),
+       .options_size = sizeof(struct my_optmap)
 };
 
-struct uci_optmap network_alias_options[] = {
-       OPTMAP_OPTION(UCIMAP_SECTION, struct uci_alias, interface, .data.sm = &network_interface),
+static struct uci_optmap network_alias_options[] = {
+       {
+               UCIMAP_OPTION(struct uci_alias, interface),
+               .type = UCIMAP_SECTION,
+               .data.sm = &network_interface
+       }
 };
 
-struct uci_sectmap network_alias = {
+static struct uci_sectmap network_alias = {
        .type = "alias",
        .options = network_alias_options,
        .alloc_len = sizeof(struct uci_network),
@@ -116,12 +163,12 @@ struct uci_sectmap network_alias = {
        .n_options = ARRAY_SIZE(network_alias_options),
 };
 
-struct uci_sectmap *network_smap[] = {
+static struct uci_sectmap *network_smap[] = {
        &network_interface,
        &network_alias,
 };
 
-struct uci_map network_map = {
+static struct uci_map network_map = {
        .sections = network_smap,
        .n_sections = ARRAY_SIZE(network_smap),
 };
@@ -134,6 +181,7 @@ int main(int argc, char **argv)
        struct list_head *p, *p2;
        struct uci_network *net;
        struct uci_alias *alias;
+       int i;
 
        INIT_LIST_HEAD(&ifs);
        ctx = uci_alloc_context();
@@ -158,9 +206,8 @@ int main(int argc, char **argv)
                        net->test,
                        (net->enabled ? "on" : "off"));
 
-               list_for_each(p2, &net->aliases) {
-                       struct uci_listmap *li = list_entry(p2, struct uci_listmap, list);
-                       alias = li->data.section;
+               for (i = 0; i < net->aliases->n_items; i++) {
+                       alias = net->aliases->item[i].section;
                        printf("New alias: %s\n", alias->name);
                }
 #if 0