/* PSPPIRE - a graphical user interface for PSPP. Copyright (C) 2016, 2020 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include "value-variant.h" #include "data/value.h" enum { IDX_WIDTH, IDX_DATA }; /* Returns a GVariant containing the data contained in IN and WIDTH. The returned GVariant has a floating reference. */ GVariant * value_variant_new (const union value *in, int width) { GVariant *vv[2] = {NULL, NULL}; vv[IDX_WIDTH] = g_variant_new_int32 (width); if (width == 0) vv[IDX_DATA] = g_variant_new_double (in->f); else { vv[IDX_DATA] = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, in->s, width, sizeof (gchar)); } return g_variant_new_tuple (vv, 2); } /* Destroy the contents of VAL. Also unref V */ void value_destroy_from_variant (union value *val, GVariant *v) { GVariant *vwidth = g_variant_get_child_value (v, IDX_WIDTH); gint32 width = g_variant_get_int32 (vwidth); /* v is unreffed here */ g_variant_unref (vwidth); value_destroy (val, width); } /* Fills VAL with the value data held in V. When VAL is no longer required it must be destroyed using value_destroy_from_variant. */ void value_variant_get (union value *val, GVariant *v) { GVariant *vwidth = g_variant_get_child_value (v, IDX_WIDTH); gint32 width = g_variant_get_int32 (vwidth); g_variant_unref (vwidth); GVariant *vdata = g_variant_get_child_value (v, IDX_DATA); if (0 == width) val->f = g_variant_get_double (vdata); else { gsize w; const gchar *data = g_variant_get_fixed_array (vdata, &w, sizeof (gchar)); if (w != width) g_critical ("Value variant's width does not match its array size"); val->s = xmemdup (data, w); } g_variant_unref (vdata); }

AltStyle によって変換されたページ (->オリジナル) /