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