string-output-visitor.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. #include "qemu-common.h"
  13. #include "string-output-visitor.h"
  14. #include "qapi/qapi-visit-impl.h"
  15. #include "qerror.h"
  16. struct StringOutputVisitor
  17. {
  18. Visitor visitor;
  19. char *string;
  20. };
  21. static void string_output_set(StringOutputVisitor *sov, char *string)
  22. {
  23. g_free(sov->string);
  24. sov->string = string;
  25. }
  26. static void print_type_int(Visitor *v, int64_t *obj, const char *name,
  27. Error **errp)
  28. {
  29. StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v);
  30. string_output_set(sov, g_strdup_printf("%lld", (long long) *obj));
  31. }
  32. static void print_type_bool(Visitor *v, bool *obj, const char *name,
  33. Error **errp)
  34. {
  35. StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v);
  36. string_output_set(sov, g_strdup(*obj ? "true" : "false"));
  37. }
  38. static void print_type_str(Visitor *v, char **obj, const char *name,
  39. Error **errp)
  40. {
  41. StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v);
  42. string_output_set(sov, g_strdup(*obj ? *obj : ""));
  43. }
  44. static void print_type_number(Visitor *v, double *obj, const char *name,
  45. Error **errp)
  46. {
  47. StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v);
  48. string_output_set(sov, g_strdup_printf("%g", *obj));
  49. }
  50. char *string_output_get_string(StringOutputVisitor *sov)
  51. {
  52. char *string = sov->string;
  53. sov->string = NULL;
  54. return string;
  55. }
  56. Visitor *string_output_get_visitor(StringOutputVisitor *sov)
  57. {
  58. return &sov->visitor;
  59. }
  60. void string_output_visitor_cleanup(StringOutputVisitor *sov)
  61. {
  62. g_free(sov->string);
  63. g_free(sov);
  64. }
  65. StringOutputVisitor *string_output_visitor_new(void)
  66. {
  67. StringOutputVisitor *v;
  68. v = g_malloc0(sizeof(*v));
  69. v->visitor.type_enum = output_type_enum;
  70. v->visitor.type_int = print_type_int;
  71. v->visitor.type_bool = print_type_bool;
  72. v->visitor.type_str = print_type_str;
  73. v->visitor.type_number = print_type_number;
  74. return v;
  75. }