1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2016 Free Software Foundation
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "value-variant.h"
22 #include "data/value.h"
31 /* Returns a GVariant containing the data contained
32 in IN and WIDTH. The returned GVariant has a floating
36 value_variant_new (const union value *in, int width)
38 GVariant *vv[2] = {NULL, NULL};
39 vv[IDX_WIDTH] = g_variant_new_int32 (width);
42 vv[IDX_DATA] = g_variant_new_double (in->f);
45 gchar *q = xmalloc (width + 1);
46 memcpy (q, in->s, width);
48 vv[IDX_DATA] = g_variant_new_from_data (G_VARIANT_TYPE_BYTESTRING, q,
49 width + 1, FALSE, NULL, NULL);
52 return g_variant_new_tuple (vv, 2);
55 /* Destroy the contents of VAL. Also unref V */
57 value_destroy_from_variant (union value *val, GVariant *v)
59 GVariant *vwidth = g_variant_get_child_value (v, IDX_WIDTH);
60 gint32 width = g_variant_get_int32 (vwidth); /* v is unreffed here */
61 g_variant_unref (vwidth);
62 value_destroy (val, width);
66 /* Fills VAL with the value data held in V.
67 When VAL is no longer required it must be destroyed using
68 value_destroy_from_variant. */
70 value_variant_get (union value *val, GVariant *v)
72 GVariant *vwidth = g_variant_get_child_value (v, IDX_WIDTH);
73 gint32 width = g_variant_get_int32 (vwidth);
74 g_variant_unref (vwidth);
76 GVariant *vdata = g_variant_get_child_value (v, IDX_DATA);
79 val->f = g_variant_get_double (vdata);
82 const gchar *data = g_variant_get_bytestring (vdata);
83 size_t len = strlen (data);
84 val->s = xmemdup (data, MIN (width, len));
87 g_variant_unref (vdata);