Reorganize build system
[qemu/aliguori.git] / test-plug.c
blob269b7ac33e06bde278c70c0a63ae040e07da17d4
1 /** stub **/
2 #include "plug.h"
4 static int nb_module_init;
5 static void (*module_initfn[100])(void);
7 void register_module_init(void (*fn)(void), module_init_type type)
9 int i = nb_module_init++;
10 module_initfn[i] = fn;
12 typedef struct TestPlug
14 Plug parent;
15 int x;
16 Plug child;
17 Plug *slot;
18 } TestPlug;
20 #define TYPE_TEST_PLUG "test-plug"
21 #define TEST_PLUG(obj) TYPE_CHECK(TestPlug, obj, TYPE_TEST_PLUG)
23 static void test_plug_initialize(TestPlug *obj, const char *id)
25 type_initialize(obj, TYPE_TEST_PLUG, id);
28 static int64_t test_plug_get_x(Plug *obj)
30 TestPlug *tp = TEST_PLUG(obj);
32 return tp->x;
35 static void test_plug_set_x(Plug *obj, int64_t value)
37 TestPlug *tp = TEST_PLUG(obj);
38 tp->x = value;
41 static void test_plug_initfn(TypeInstance *obj)
43 TestPlug *tp = TEST_PLUG(obj);
44 char name[32];
46 snprintf(name, sizeof(name), "%s::child", obj->id);
47 plug_initialize(&tp->child, name);
49 tp->x = 42;
50 plug_add_property_int(PLUG(tp), "x", test_plug_get_x, test_plug_set_x, PROP_F_READWRITE);
51 plug_add_property_plug(PLUG(tp), "child", &tp->child, TYPE_PLUG);
52 plug_add_property_socket(PLUG(tp), "slot", &tp->slot, TYPE_PLUG, PROP_F_READWRITE | PROP_F_MASKABLE);
55 static const TypeInfo test_plug_type_info = {
56 .name = TYPE_TEST_PLUG,
57 .parent = TYPE_PLUG,
58 .instance_size = sizeof(TestPlug),
59 .instance_init = test_plug_initfn,
62 static void register_devices(void)
64 type_register_static(&test_plug_type_info);
67 device_init(register_devices);
69 //////////////////////////////
71 typedef struct StringInputVisitor
73 Visitor parent;
74 const char *value;
75 } StringInputVisitor;
77 static void string_input_visitor_int(Visitor *v, int64_t *obj, const char *name, Error **errp)
79 StringInputVisitor *sv = container_of(v, StringInputVisitor, parent);
80 *obj = atoi(sv->value);
83 static void string_input_visitor_str(Visitor *v, char **obj, const char *name, Error **errp)
85 StringInputVisitor *sv = container_of(v, StringInputVisitor, parent);
86 *obj = qemu_strdup(sv->value);
89 static void string_input_visitor_init(StringInputVisitor *sv, const char *value)
91 memset(sv, 0, sizeof(*sv));
92 sv->parent.type_int = string_input_visitor_int;
93 sv->parent.type_str = string_input_visitor_str;
94 sv->value = value;
97 typedef struct StringOutputVisitor
99 Visitor parent;
100 char value[256];
101 } StringOutputVisitor;
103 static void string_output_visitor_int(Visitor *v, int64_t *obj, const char *name, Error **errp)
105 StringOutputVisitor *sv = container_of(v, StringOutputVisitor, parent);
106 snprintf(sv->value, sizeof(sv->value), "%" PRId64, *obj);
109 static void string_output_visitor_str(Visitor *v, char **obj, const char *name, Error **errp)
111 StringOutputVisitor *sv = container_of(v, StringOutputVisitor, parent);
113 snprintf(sv->value, sizeof(sv->value), "%s", *obj);
116 static void string_output_visitor_init(StringOutputVisitor *sv)
118 memset(sv, 0, sizeof(*sv));
119 sv->parent.type_int = string_output_visitor_int;
120 sv->parent.type_str = string_output_visitor_str;
123 static void print_props(Plug *plug, const char *name, const char *typename, int flags, void *opaque)
125 StringOutputVisitor sov;
127 string_output_visitor_init(&sov);
128 plug_get_property(plug, name, &sov.parent, NULL);
129 printf("`%s.%s' is a `%s' and has a value of `%s', %s\n", plug_get_id(plug), name, typename, sov.value,
130 ((flags & PROP_F_READWRITE) == PROP_F_READWRITE) ? "rw" : "ro"); // FIXME
133 int main(int argc, char **argv)
135 TestPlug tp;
136 int i;
137 StringInputVisitor siv;
138 StringOutputVisitor sov;
140 for (i = 0; i < nb_module_init; i++) {
141 module_initfn[i]();
144 string_input_visitor_init(&siv, "82");
145 string_output_visitor_init(&sov);
147 test_plug_initialize(&tp, "tp");
149 printf("x - %" PRId64 "\n", test_plug_get_x(PLUG(&tp)));
150 plug_set_property(PLUG(&tp), "x", &siv.parent, NULL);
152 printf("x - %" PRId64 "\n", test_plug_get_x(PLUG(&tp)));
154 plug_get_property(PLUG(&tp), "child", &sov.parent, NULL);
155 printf("child - %s\n", sov.value);
157 plug_get_property(PLUG(&tp), "slot", &sov.parent, NULL);
158 printf("slot - %s\n", sov.value);
160 string_input_visitor_init(&siv, "tp::child");
161 plug_set_property(PLUG(&tp), "slot", &siv.parent, NULL);
163 plug_get_property(PLUG(&tp), "slot", &sov.parent, NULL);
164 printf("slot - %s\n", sov.value);
166 printf("tp::child - %p\n", &tp.child);
167 printf("tp.slot - %p\n", tp.slot);
169 plug_foreach_property(PLUG(&tp), print_props, NULL);
171 assert(&tp.child == tp.slot);
173 return 0;