Re: [Qemu-devel] [PATCH v2 3/6] block/qapi: Human-readable ImageInfoSpecific dump
On 2013-09-10 06:04, Fam Zheng wrote: On Fri, 09/06 15:12, Max Reitz wrote: Add a function for generically dumping the ImageInfoSpecific information in a human-readable format to block/qapi.c. Use this function in bdrv_image_info_dump and qemu-io-cmds.c:info_f to allow qemu-img info resp. qemu-io -c info to print that format specific information. Signed-off-by: Max Reitz mre...@redhat.com --- block/qapi.c | 121 +++ include/block/qapi.h | 2 + qemu-io-cmds.c | 3 ++ 3 files changed, 126 insertions(+) diff --git a/block/qapi.c b/block/qapi.c index f13fbd5..4fe45d5 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -25,6 +25,9 @@ #include block/qapi.h #include block/block_int.h #include qmp-commands.h +#include qapi-visit.h +#include qapi/qmp-output-visitor.h +#include qapi/qmp/types.h /* * Returns 0 on success, with *p_list either set to describe snapshot @@ -401,6 +404,119 @@ void bdrv_snapshot_dump(fprintf_function func_fprintf, void *f, } } +static void dump_qdict(fprintf_function func_fprintf, void *f, int indentation, + QDict *dict); +static void dump_qlist(fprintf_function func_fprintf, void *f, int indentation, + QList *list); + +static void dump_qobject(fprintf_function func_fprintf, void *f, + int comp_indent, QObject *obj) +{ +switch (qobject_type(obj)) { +case QTYPE_QINT: { +QInt *value = qobject_to_qint(obj); +func_fprintf(f, % PRId64, qint_get_int(value)); +break; +} +case QTYPE_QSTRING: { +QString *value = qobject_to_qstring(obj); +func_fprintf(f, %s, qstring_get_str(value)); +break; +} +case QTYPE_QDICT: { +QDict *value = qobject_to_qdict(obj); +dump_qdict(func_fprintf, f, comp_indent, value); +break; +} +case QTYPE_QLIST: { +QList *value = qobject_to_qlist(obj); +dump_qlist(func_fprintf, f, comp_indent, value); +break; +} +case QTYPE_QFLOAT: { +QFloat *value = qobject_to_qfloat(obj); +func_fprintf(f, %g, qfloat_get_double(value)); +break; +} +case QTYPE_QBOOL: { +QBool *value = qobject_to_qbool(obj); +func_fprintf(f, %s, qbool_get_int(value) ? true : false); +break; +} +case QTYPE_QERROR: { +QString *value = qerror_human((QError *)obj); +func_fprintf(f, %s, qstring_get_str(value)); +break; +} +case QTYPE_NONE: +break; +case QTYPE_MAX: +default: +abort(); +} +} + +static void dump_qlist(fprintf_function func_fprintf, void *f, int indentation, + QList *list) +{ +const QListEntry *entry; +int i = 0; + +for (entry = qlist_first(list); entry; entry = qlist_next(entry), i++) { +qtype_code type = qobject_type(entry-value); +bool composite = (type == QTYPE_QDICT || type == QTYPE_QLIST); +const char *format = composite ? %*s[%i]:\n : %*s[%i]: ; + +func_fprintf(f, format, indentation * 4, , i); +dump_qobject(func_fprintf, f, indentation + 1, entry-value); +if (!composite) { +func_fprintf(f, \n); +} +} +} + +static void dump_qdict(fprintf_function func_fprintf, void *f, int indentation, + QDict *dict) +{ +const QDictEntry *entry; + +for (entry = qdict_first(dict); entry; entry = qdict_next(dict, entry)) { +qtype_code type = qobject_type(entry-value); +bool composite = (type == QTYPE_QDICT || type == QTYPE_QLIST); +const char *format = composite ? %*s%s:\n : %*s%s: ; +char key[strlen(entry-key) + 1]; +int i; + +/* replace dashes with spaces in key (variable) names */ +for (i = 0; entry-key[i]; i++) { +key[i] = entry-key[i] == '-' ? ' ' : entry-key[i]; +} +key[i] = 0; + +func_fprintf(f, format, indentation * 4, , key); +dump_qobject(func_fprintf, f, indentation + 1, entry-value); +if (!composite) { +func_fprintf(f, \n); +} +} +} + +void bdrv_image_info_specific_dump(fprintf_function func_fprintf, void *f, + ImageInfoSpecific *info_spec) +{ +Error *local_err = NULL; +QmpOutputVisitor *ov = qmp_output_visitor_new(); +QObject *obj, *data; + +visit_type_ImageInfoSpecific(qmp_output_get_visitor(ov), info_spec, NULL, + local_err); +obj = qmp_output_get_qobject(ov); +assert(qobject_type(obj) == QTYPE_QDICT); +data = qdict_get(qobject_to_qdict(obj), data); +dump_qobject(func_fprintf, f, 0, data); +qmp_output_visitor_cleanup(ov); +} + void
Re: [Qemu-devel] [PATCH v2 3/6] block/qapi: Human-readable ImageInfoSpecific dump
On Fri, 09/06 15:12, Max Reitz wrote: Add a function for generically dumping the ImageInfoSpecific information in a human-readable format to block/qapi.c. Use this function in bdrv_image_info_dump and qemu-io-cmds.c:info_f to allow qemu-img info resp. qemu-io -c info to print that format specific information. Signed-off-by: Max Reitz mre...@redhat.com --- block/qapi.c | 121 +++ include/block/qapi.h | 2 + qemu-io-cmds.c | 3 ++ 3 files changed, 126 insertions(+) diff --git a/block/qapi.c b/block/qapi.c index f13fbd5..4fe45d5 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -25,6 +25,9 @@ #include block/qapi.h #include block/block_int.h #include qmp-commands.h +#include qapi-visit.h +#include qapi/qmp-output-visitor.h +#include qapi/qmp/types.h /* * Returns 0 on success, with *p_list either set to describe snapshot @@ -401,6 +404,119 @@ void bdrv_snapshot_dump(fprintf_function func_fprintf, void *f, } } +static void dump_qdict(fprintf_function func_fprintf, void *f, int indentation, + QDict *dict); +static void dump_qlist(fprintf_function func_fprintf, void *f, int indentation, + QList *list); + +static void dump_qobject(fprintf_function func_fprintf, void *f, + int comp_indent, QObject *obj) +{ +switch (qobject_type(obj)) { +case QTYPE_QINT: { +QInt *value = qobject_to_qint(obj); +func_fprintf(f, % PRId64, qint_get_int(value)); +break; +} +case QTYPE_QSTRING: { +QString *value = qobject_to_qstring(obj); +func_fprintf(f, %s, qstring_get_str(value)); +break; +} +case QTYPE_QDICT: { +QDict *value = qobject_to_qdict(obj); +dump_qdict(func_fprintf, f, comp_indent, value); +break; +} +case QTYPE_QLIST: { +QList *value = qobject_to_qlist(obj); +dump_qlist(func_fprintf, f, comp_indent, value); +break; +} +case QTYPE_QFLOAT: { +QFloat *value = qobject_to_qfloat(obj); +func_fprintf(f, %g, qfloat_get_double(value)); +break; +} +case QTYPE_QBOOL: { +QBool *value = qobject_to_qbool(obj); +func_fprintf(f, %s, qbool_get_int(value) ? true : false); +break; +} +case QTYPE_QERROR: { +QString *value = qerror_human((QError *)obj); +func_fprintf(f, %s, qstring_get_str(value)); +break; +} +case QTYPE_NONE: +break; +case QTYPE_MAX: +default: +abort(); +} +} + +static void dump_qlist(fprintf_function func_fprintf, void *f, int indentation, + QList *list) +{ +const QListEntry *entry; +int i = 0; + +for (entry = qlist_first(list); entry; entry = qlist_next(entry), i++) { +qtype_code type = qobject_type(entry-value); +bool composite = (type == QTYPE_QDICT || type == QTYPE_QLIST); +const char *format = composite ? %*s[%i]:\n : %*s[%i]: ; + +func_fprintf(f, format, indentation * 4, , i); +dump_qobject(func_fprintf, f, indentation + 1, entry-value); +if (!composite) { +func_fprintf(f, \n); +} +} +} + +static void dump_qdict(fprintf_function func_fprintf, void *f, int indentation, + QDict *dict) +{ +const QDictEntry *entry; + +for (entry = qdict_first(dict); entry; entry = qdict_next(dict, entry)) { +qtype_code type = qobject_type(entry-value); +bool composite = (type == QTYPE_QDICT || type == QTYPE_QLIST); +const char *format = composite ? %*s%s:\n : %*s%s: ; +char key[strlen(entry-key) + 1]; +int i; + +/* replace dashes with spaces in key (variable) names */ +for (i = 0; entry-key[i]; i++) { +key[i] = entry-key[i] == '-' ? ' ' : entry-key[i]; +} +key[i] = 0; + +func_fprintf(f, format, indentation * 4, , key); +dump_qobject(func_fprintf, f, indentation + 1, entry-value); +if (!composite) { +func_fprintf(f, \n); +} +} +} + +void bdrv_image_info_specific_dump(fprintf_function func_fprintf, void *f, + ImageInfoSpecific *info_spec) +{ +Error *local_err = NULL; +QmpOutputVisitor *ov = qmp_output_visitor_new(); +QObject *obj, *data; + +visit_type_ImageInfoSpecific(qmp_output_get_visitor(ov), info_spec, NULL, + local_err); +obj = qmp_output_get_qobject(ov); +assert(qobject_type(obj) == QTYPE_QDICT); +data = qdict_get(qobject_to_qdict(obj), data); +
[Qemu-devel] [PATCH v2 3/6] block/qapi: Human-readable ImageInfoSpecific dump
Add a function for generically dumping the ImageInfoSpecific information in a human-readable format to block/qapi.c. Use this function in bdrv_image_info_dump and qemu-io-cmds.c:info_f to allow qemu-img info resp. qemu-io -c info to print that format specific information. Signed-off-by: Max Reitz mre...@redhat.com --- block/qapi.c | 121 +++ include/block/qapi.h | 2 + qemu-io-cmds.c | 3 ++ 3 files changed, 126 insertions(+) diff --git a/block/qapi.c b/block/qapi.c index f13fbd5..4fe45d5 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -25,6 +25,9 @@ #include block/qapi.h #include block/block_int.h #include qmp-commands.h +#include qapi-visit.h +#include qapi/qmp-output-visitor.h +#include qapi/qmp/types.h /* * Returns 0 on success, with *p_list either set to describe snapshot @@ -401,6 +404,119 @@ void bdrv_snapshot_dump(fprintf_function func_fprintf, void *f, } } +static void dump_qdict(fprintf_function func_fprintf, void *f, int indentation, + QDict *dict); +static void dump_qlist(fprintf_function func_fprintf, void *f, int indentation, + QList *list); + +static void dump_qobject(fprintf_function func_fprintf, void *f, + int comp_indent, QObject *obj) +{ +switch (qobject_type(obj)) { +case QTYPE_QINT: { +QInt *value = qobject_to_qint(obj); +func_fprintf(f, % PRId64, qint_get_int(value)); +break; +} +case QTYPE_QSTRING: { +QString *value = qobject_to_qstring(obj); +func_fprintf(f, %s, qstring_get_str(value)); +break; +} +case QTYPE_QDICT: { +QDict *value = qobject_to_qdict(obj); +dump_qdict(func_fprintf, f, comp_indent, value); +break; +} +case QTYPE_QLIST: { +QList *value = qobject_to_qlist(obj); +dump_qlist(func_fprintf, f, comp_indent, value); +break; +} +case QTYPE_QFLOAT: { +QFloat *value = qobject_to_qfloat(obj); +func_fprintf(f, %g, qfloat_get_double(value)); +break; +} +case QTYPE_QBOOL: { +QBool *value = qobject_to_qbool(obj); +func_fprintf(f, %s, qbool_get_int(value) ? true : false); +break; +} +case QTYPE_QERROR: { +QString *value = qerror_human((QError *)obj); +func_fprintf(f, %s, qstring_get_str(value)); +break; +} +case QTYPE_NONE: +break; +case QTYPE_MAX: +default: +abort(); +} +} + +static void dump_qlist(fprintf_function func_fprintf, void *f, int indentation, + QList *list) +{ +const QListEntry *entry; +int i = 0; + +for (entry = qlist_first(list); entry; entry = qlist_next(entry), i++) { +qtype_code type = qobject_type(entry-value); +bool composite = (type == QTYPE_QDICT || type == QTYPE_QLIST); +const char *format = composite ? %*s[%i]:\n : %*s[%i]: ; + +func_fprintf(f, format, indentation * 4, , i); +dump_qobject(func_fprintf, f, indentation + 1, entry-value); +if (!composite) { +func_fprintf(f, \n); +} +} +} + +static void dump_qdict(fprintf_function func_fprintf, void *f, int indentation, + QDict *dict) +{ +const QDictEntry *entry; + +for (entry = qdict_first(dict); entry; entry = qdict_next(dict, entry)) { +qtype_code type = qobject_type(entry-value); +bool composite = (type == QTYPE_QDICT || type == QTYPE_QLIST); +const char *format = composite ? %*s%s:\n : %*s%s: ; +char key[strlen(entry-key) + 1]; +int i; + +/* replace dashes with spaces in key (variable) names */ +for (i = 0; entry-key[i]; i++) { +key[i] = entry-key[i] == '-' ? ' ' : entry-key[i]; +} +key[i] = 0; + +func_fprintf(f, format, indentation * 4, , key); +dump_qobject(func_fprintf, f, indentation + 1, entry-value); +if (!composite) { +func_fprintf(f, \n); +} +} +} + +void bdrv_image_info_specific_dump(fprintf_function func_fprintf, void *f, + ImageInfoSpecific *info_spec) +{ +Error *local_err = NULL; +QmpOutputVisitor *ov = qmp_output_visitor_new(); +QObject *obj, *data; + +visit_type_ImageInfoSpecific(qmp_output_get_visitor(ov), info_spec, NULL, + local_err); +obj = qmp_output_get_qobject(ov); +assert(qobject_type(obj) == QTYPE_QDICT); +data = qdict_get(qobject_to_qdict(obj), data); +dump_qobject(func_fprintf, f, 0, data); +qmp_output_visitor_cleanup(ov); +} + void bdrv_image_info_dump(fprintf_function func_fprintf, void *f, ImageInfo *info) { @@ -471,4 +587,9