root / qapi / string-output-visitor.c @ 0056c093
History | View | Annotate | Download (2.2 kB)
1 | a020f980 | Paolo Bonzini | /*
|
---|---|---|---|
2 | a020f980 | Paolo Bonzini | * String printing Visitor
|
3 | a020f980 | Paolo Bonzini | *
|
4 | a020f980 | Paolo Bonzini | * Copyright Red Hat, Inc. 2012
|
5 | a020f980 | Paolo Bonzini | *
|
6 | a020f980 | Paolo Bonzini | * Author: Paolo Bonzini <pbonzini@redhat.com>
|
7 | a020f980 | Paolo Bonzini | *
|
8 | a020f980 | Paolo Bonzini | * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
9 | a020f980 | Paolo Bonzini | * See the COPYING.LIB file in the top-level directory.
|
10 | a020f980 | Paolo Bonzini | *
|
11 | a020f980 | Paolo Bonzini | */
|
12 | a020f980 | Paolo Bonzini | |
13 | a020f980 | Paolo Bonzini | #include "qemu-common.h" |
14 | a020f980 | Paolo Bonzini | #include "string-output-visitor.h" |
15 | a020f980 | Paolo Bonzini | #include "qapi/qapi-visit-impl.h" |
16 | a020f980 | Paolo Bonzini | #include "qerror.h" |
17 | a020f980 | Paolo Bonzini | |
18 | a020f980 | Paolo Bonzini | struct StringOutputVisitor
|
19 | a020f980 | Paolo Bonzini | { |
20 | a020f980 | Paolo Bonzini | Visitor visitor; |
21 | a020f980 | Paolo Bonzini | char *string;
|
22 | a020f980 | Paolo Bonzini | }; |
23 | a020f980 | Paolo Bonzini | |
24 | a020f980 | Paolo Bonzini | static void string_output_set(StringOutputVisitor *sov, char *string) |
25 | a020f980 | Paolo Bonzini | { |
26 | a020f980 | Paolo Bonzini | g_free(sov->string); |
27 | a020f980 | Paolo Bonzini | sov->string = string; |
28 | a020f980 | Paolo Bonzini | } |
29 | a020f980 | Paolo Bonzini | |
30 | a020f980 | Paolo Bonzini | static void print_type_int(Visitor *v, int64_t *obj, const char *name, |
31 | a020f980 | Paolo Bonzini | Error **errp) |
32 | a020f980 | Paolo Bonzini | { |
33 | a020f980 | Paolo Bonzini | StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); |
34 | a020f980 | Paolo Bonzini | string_output_set(sov, g_strdup_printf("%lld", (long long) *obj)); |
35 | a020f980 | Paolo Bonzini | } |
36 | a020f980 | Paolo Bonzini | |
37 | a020f980 | Paolo Bonzini | static void print_type_bool(Visitor *v, bool *obj, const char *name, |
38 | a020f980 | Paolo Bonzini | Error **errp) |
39 | a020f980 | Paolo Bonzini | { |
40 | a020f980 | Paolo Bonzini | StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); |
41 | a020f980 | Paolo Bonzini | string_output_set(sov, g_strdup(*obj ? "true" : "false")); |
42 | a020f980 | Paolo Bonzini | } |
43 | a020f980 | Paolo Bonzini | |
44 | a020f980 | Paolo Bonzini | static void print_type_str(Visitor *v, char **obj, const char *name, |
45 | a020f980 | Paolo Bonzini | Error **errp) |
46 | a020f980 | Paolo Bonzini | { |
47 | a020f980 | Paolo Bonzini | StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); |
48 | a020f980 | Paolo Bonzini | string_output_set(sov, g_strdup(*obj ? *obj : ""));
|
49 | a020f980 | Paolo Bonzini | } |
50 | a020f980 | Paolo Bonzini | |
51 | a020f980 | Paolo Bonzini | static void print_type_number(Visitor *v, double *obj, const char *name, |
52 | a020f980 | Paolo Bonzini | Error **errp) |
53 | a020f980 | Paolo Bonzini | { |
54 | a020f980 | Paolo Bonzini | StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); |
55 | a020f980 | Paolo Bonzini | string_output_set(sov, g_strdup_printf("%g", *obj));
|
56 | a020f980 | Paolo Bonzini | } |
57 | a020f980 | Paolo Bonzini | |
58 | a020f980 | Paolo Bonzini | char *string_output_get_string(StringOutputVisitor *sov)
|
59 | a020f980 | Paolo Bonzini | { |
60 | a020f980 | Paolo Bonzini | char *string = sov->string;
|
61 | a020f980 | Paolo Bonzini | sov->string = NULL;
|
62 | a020f980 | Paolo Bonzini | return string;
|
63 | a020f980 | Paolo Bonzini | } |
64 | a020f980 | Paolo Bonzini | |
65 | a020f980 | Paolo Bonzini | Visitor *string_output_get_visitor(StringOutputVisitor *sov) |
66 | a020f980 | Paolo Bonzini | { |
67 | a020f980 | Paolo Bonzini | return &sov->visitor;
|
68 | a020f980 | Paolo Bonzini | } |
69 | a020f980 | Paolo Bonzini | |
70 | a020f980 | Paolo Bonzini | void string_output_visitor_cleanup(StringOutputVisitor *sov)
|
71 | a020f980 | Paolo Bonzini | { |
72 | a020f980 | Paolo Bonzini | g_free(sov->string); |
73 | a020f980 | Paolo Bonzini | g_free(sov); |
74 | a020f980 | Paolo Bonzini | } |
75 | a020f980 | Paolo Bonzini | |
76 | a020f980 | Paolo Bonzini | StringOutputVisitor *string_output_visitor_new(void)
|
77 | a020f980 | Paolo Bonzini | { |
78 | a020f980 | Paolo Bonzini | StringOutputVisitor *v; |
79 | a020f980 | Paolo Bonzini | |
80 | a020f980 | Paolo Bonzini | v = g_malloc0(sizeof(*v));
|
81 | a020f980 | Paolo Bonzini | |
82 | a020f980 | Paolo Bonzini | v->visitor.type_enum = output_type_enum; |
83 | a020f980 | Paolo Bonzini | v->visitor.type_int = print_type_int; |
84 | a020f980 | Paolo Bonzini | v->visitor.type_bool = print_type_bool; |
85 | a020f980 | Paolo Bonzini | v->visitor.type_str = print_type_str; |
86 | a020f980 | Paolo Bonzini | v->visitor.type_number = print_type_number; |
87 | a020f980 | Paolo Bonzini | |
88 | a020f980 | Paolo Bonzini | return v;
|
89 | a020f980 | Paolo Bonzini | } |