Statistics
| Branch: | Revision:

root / qapi / string-output-visitor.c @ 06aac7bd

History | View | Annotate | Download (2.2 kB)

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("%f", *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
}