Statistics
| Branch: | Revision:

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
}