projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
simplify weighting
[pspp]
/
src
/
ui
/
gui
/
value-variant.c
diff --git
a/src/ui/gui/value-variant.c
b/src/ui/gui/value-variant.c
index e8c342b7bb33ecc19089888342786fbde1b90b41..7c85786f6c1745a2b7d0cb281c3022612109b055 100644
(file)
--- a/
src/ui/gui/value-variant.c
+++ b/
src/ui/gui/value-variant.c
@@
-1,5
+1,5
@@
/* PSPPIRE - a graphical user interface for PSPP.
/* PSPPIRE - a graphical user interface for PSPP.
- Copyright (C) 2016 Free Software Foundation
+ 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
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
@@
-17,18
+17,19
@@
#include <config.h>
#include <gtk/gtk.h>
#include <config.h>
#include <gtk/gtk.h>
-#include <string.h>
#include "value-variant.h"
#include "data/value.h"
#include "value-variant.h"
#include "data/value.h"
-
enum
{
IDX_WIDTH,
IDX_DATA
};
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 *
value_variant_new (const union value *in, int width)
{
@@
-37,35
+38,30
@@
value_variant_new (const union value *in, int width)
if (width == 0)
vv[IDX_DATA] = g_variant_new_double (in->f);
if (width == 0)
vv[IDX_DATA] = g_variant_new_double (in->f);
- else if (width <= MAX_SHORT_STRING)
- {
- char xx[MAX_SHORT_STRING + 1];
- memset (xx, '\0', MAX_SHORT_STRING + 1);
- memcpy (xx, in->short_string, width);
- vv[IDX_DATA] = g_variant_new_bytestring (xx);
- }
else
{
else
{
- gchar *q = xmalloc (width + 1);
- memcpy (q, in->long_string, width);
- q[width] = '\0';
- vv[IDX_DATA] = g_variant_new_from_data (G_VARIANT_TYPE_BYTESTRING, q,
- width + 1, FALSE, NULL, NULL);
+ vv[IDX_DATA] = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
+ in->s, width,
+ sizeof (gchar));
}
}
-
+
return g_variant_new_tuple (vv, 2);
}
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);
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);
+ gint32 width = g_variant_get_int32 (vwidth);
/* v is unreffed here */
g_variant_unref (vwidth);
value_destroy (val, width);
}
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)
{
void
value_variant_get (union value *val, GVariant *v)
{
@@
-79,13
+75,13
@@
value_variant_get (union value *val, GVariant *v)
val->f = g_variant_get_double (vdata);
else
{
val->f = g_variant_get_double (vdata);
else
{
-
const gchar *data = g_variant_get_bytestring (vdata)
;
- if (width <= MAX_SHORT_STRING)
-
memcpy (val->short_string, data, MAX_SHORT_STRING
);
- else
- {
-
val->long_string = xmemdup (data, width
);
- }
+
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);
}
g_variant_unref (vdata);