On Wed, Apr 17, 2013 at 04:33:03PM +0800, Amos Kong wrote: > On Tue, Apr 16, 2013 at 09:50:17AM -0500, mdroth wrote: > > On Tue, Apr 16, 2013 at 10:49:19AM +0200, Stefan Hajnoczi wrote: > > > On Mon, Apr 15, 2013 at 10:04:24PM +0200, Lluís Vilanova wrote: > > > > Tried using a list of strings as an argument to a command, but the > > > > generated > > > > code references the 'strList' type, which does not exist. > > > > > > > > Is a specialized version for "['str']" missing, or should I define my > > > > own type > > > > with a single field of 'str' type? > > > > I would say just give that a shot. Stick: > > > > typedef struct strList > > { > > char *value; > > struct strList *next; > > } strList; > > > > in include/qapi/visitor.h and see what happens. > > Hi Michael, > > | In file included from /home/devel/qemu/include/qapi/error.h:16, > | from /home/devel/qemu/include/qapi/visitor.h:16, > | from /home/devel/qemu/include/qapi/dealloc-visitor.h:17, > | from qapi-types.c:17: > | ./qapi-types.h:2158: error: expected specifier-qualifier-list before > ‘strList’ > | make: *** [qapi-types.o] Error 1 > > > ("->" means "is include to") > qapi-types.h -> include/qapi/error.h -> include/qapi/visitor.h > > 'strList' is used in qapi-types.h, we should not declare strList in > include/qapi/visitor.h. I changed scripts/qapi-types.py to declare > strList in qapi-types.h, but got a redefinition error. > > | In file included from qga/qapi-generated/qga-qmp-commands.h:19, > | from qga/commands.c:15: > | qga/qapi-generated/qga-qapi-types.h:23: error: redefinition of ‘struct > strList’ > | qga/qapi-generated/qga-qapi-types.h:26: error: conflicting types for > ‘strList’ > | ./qapi-types.h:26: note: previous declaration of ‘strList’ was here > | make: *** [qga/commands.o] Error 1 > > > I used an _ugly_ "#ifndef" to limit it only be defined in qapi-types.h. > Michael, others do you have some suggestion?
>From ecbd69a8ad4b5e600ac56b1cda4c4c04e0175742 Mon Sep 17 00:00:00 2001 From: Amos Kong <ak...@redhat.com> Date: Thu, 18 Apr 2013 10:56:24 +0800 Subject: [RFC PATCH] qapi: introduce strList and visit_type_strList() Currently we can only use ['String'] to add string to a list, it contains some additional JSON structure. "multicast": [ { "str": "01:80:c2:00:00:21" }, { "str": "00:00:00:00:00:00" } ] This patch introdued strList, we can use ['str'] "multicast": [ "01:00:5e:00:00:01", "33:33:ff:12:34:57" ] Signed-off-by: Amos Kong <ak...@redhat.com> --- I used an _ugly_ "#ifndef" to limit it only be defined in qapi-types.h. Michael, others do you have some suggestion? --- include/qapi/visitor.h | 1 + qapi/qapi-visit-core.c | 22 ++++++++++++++++++++++ scripts/qapi-types.py | 8 ++++++++ 3 files changed, 31 insertions(+), 0 deletions(-) diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h index 1fef18c..2e36edb 100644 --- a/include/qapi/visitor.h +++ b/include/qapi/visitor.h @@ -50,6 +50,7 @@ void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp); void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp); void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **errp); void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp); +void visit_type_strList(Visitor *m, strList ** obj, const char *name, Error **errp); void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp); #endif diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index 401ee6e..aefe227 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -257,6 +257,28 @@ void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp) } } +void visit_type_strList(Visitor *m, strList ** obj, const char *name, Error **errp) +{ + GenericList *i, **prev = (GenericList **)obj; + Error *err = NULL; + + if (!error_is_set(errp)) { + visit_start_list(m, name, &err); + if (!err) { + for (; (i = visit_next_list(m, prev, &err)) != NULL; prev = &i) { + strList *native_i = (strList *)i; + visit_type_str(m, &native_i->value, NULL, &err); + } + error_propagate(errp, err); + err = NULL; + + /* Always call end_list if start_list succeeded. */ + visit_end_list(m, &err); + } + error_propagate(errp, err); + } +} + void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp) { if (!error_is_set(errp)) { diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index 9e19920..f2ca373 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -276,6 +276,14 @@ fdecl.write(mcgen(''' #include <stdbool.h> #include <stdint.h> +#ifndef QGA_QAPI_TYPES_H +typedef struct strList +{ + char *value; + struct strList *next; +} strList; +#endif + ''', guard=guardname(h_file))) -- 1.7.1