Visitor visitor;
bool human;
GString *string;
+ char **result;
ListMode list_mode;
union {
int64_t s;
sov->list_mode = LM_NONE;
}
-char *string_output_get_string(StringOutputVisitor *sov)
+static void string_output_complete(Visitor *v, void *opaque)
{
- char *string = g_string_free(sov->string, false);
- sov->string = NULL;
- return string;
-}
+ StringOutputVisitor *sov = to_sov(v);
-Visitor *string_output_get_visitor(StringOutputVisitor *sov)
-{
- return &sov->visitor;
+ assert(opaque == sov->result);
+ *sov->result = g_string_free(sov->string, false);
+ sov->string = NULL;
}
static void free_range(void *range, void *dummy)
{
StringOutputVisitor *sov = to_sov(v);
- string_output_visitor_cleanup(sov);
-}
-
-void string_output_visitor_cleanup(StringOutputVisitor *sov)
-{
if (sov->string) {
g_string_free(sov->string, true);
}
g_free(sov);
}
-StringOutputVisitor *string_output_visitor_new(bool human)
+Visitor *string_output_visitor_new(bool human, char **result)
{
StringOutputVisitor *v;
v->string = g_string_new(NULL);
v->human = human;
+ v->result = result;
+ *result = NULL;
+
v->visitor.type = VISITOR_OUTPUT;
v->visitor.type_int64 = print_type_int64;
v->visitor.type_uint64 = print_type_uint64;
v->visitor.start_list = start_list;
v->visitor.next_list = next_list;
v->visitor.end_list = end_list;
+ v->visitor.complete = string_output_complete;
v->visitor.free = string_output_free;
- return v;
+ return &v->visitor;
}