Include <string.h> for memcpy.
[platform/upstream/glib.git] / gobject / gvaluetransform.c
1 /* GObject - GLib Type, Object, Parameter and Signal Library
2  * Copyright (C) 2001 Red Hat, Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library 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 GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General
15  * Public License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 #include        <string.h>
20
21 #include        "gvalue.h"
22 #include        "genums.h"
23
24
25 /* same type transforms
26  */
27 static void
28 value_transform_memcpy_data0 (const GValue *src_value,
29                               GValue       *dest_value)
30 {
31   memcpy (&dest_value->data[0], &src_value->data[0], sizeof (src_value->data[0]));
32 }
33 #define value_transform_int_int         value_transform_memcpy_data0
34 #define value_transform_uint_uint       value_transform_memcpy_data0
35 #define value_transform_long_long       value_transform_memcpy_data0
36 #define value_transform_ulong_ulong     value_transform_memcpy_data0
37 #define value_transform_float_float     value_transform_memcpy_data0
38 #define value_transform_double_double   value_transform_memcpy_data0
39
40
41 /* numeric casts
42  */
43 #define DEFINE_CAST(func_name, from_member, ctype, to_member)                   \
44     static void                                                                 \
45     value_transform_##func_name (const GValue *src_value,                       \
46                                  GValue       *dest_value)                      \
47     {                                                                           \
48       ctype c_value = src_value->data[0].from_member;                           \
49       dest_value->data[0].to_member = c_value;                                  \
50     }
51 DEFINE_CAST (int_s8,            v_int,    gint8,   v_int);
52 DEFINE_CAST (int_u8,            v_int,    guint8,  v_uint);
53 DEFINE_CAST (int_uint,          v_int,    guint,   v_uint);
54 DEFINE_CAST (int_long,          v_int,    glong,   v_long);
55 DEFINE_CAST (int_ulong,         v_int,    gulong,  v_ulong);
56 DEFINE_CAST (int_float,         v_int,    gfloat,  v_float);
57 DEFINE_CAST (int_double,        v_int,    gdouble, v_double);
58 DEFINE_CAST (uint_s8,           v_uint,   gint8,   v_int);
59 DEFINE_CAST (uint_u8,           v_uint,   guint8,  v_uint);
60 DEFINE_CAST (uint_int,          v_uint,   gint,    v_int);
61 DEFINE_CAST (uint_long,         v_uint,   glong,   v_long);
62 DEFINE_CAST (uint_ulong,        v_uint,   gulong,  v_ulong);
63 DEFINE_CAST (uint_float,        v_uint,   gfloat,  v_float);
64 DEFINE_CAST (uint_double,       v_uint,   gdouble, v_double);
65 DEFINE_CAST (long_s8,           v_long,   gint8,   v_int);
66 DEFINE_CAST (long_u8,           v_long,   guint8,  v_uint);
67 DEFINE_CAST (long_int,          v_long,   gint,    v_int);
68 DEFINE_CAST (long_uint,         v_long,   guint,   v_uint);
69 DEFINE_CAST (long_ulong,        v_long,   gulong,  v_ulong);
70 DEFINE_CAST (long_float,        v_long,   gfloat,  v_float);
71 DEFINE_CAST (long_double,       v_long,   gdouble, v_double);
72 DEFINE_CAST (ulong_s8,          v_ulong,  gint8,   v_int);
73 DEFINE_CAST (ulong_u8,          v_ulong,  guint8,  v_uint);
74 DEFINE_CAST (ulong_int,         v_ulong,  gint,    v_int);
75 DEFINE_CAST (ulong_uint,        v_ulong,  guint,   v_uint);
76 DEFINE_CAST (ulong_long,        v_ulong,  glong,   v_long);
77 DEFINE_CAST (ulong_float,       v_ulong,  gfloat,  v_float);
78 DEFINE_CAST (ulong_double,      v_ulong,  gdouble, v_double);
79 DEFINE_CAST (float_s8,          v_float,  gint8,   v_int);
80 DEFINE_CAST (float_u8,          v_float,  guint8,  v_uint);
81 DEFINE_CAST (float_int,         v_float,  gint,    v_int);
82 DEFINE_CAST (float_uint,        v_float,  guint,   v_uint);
83 DEFINE_CAST (float_long,        v_float,  glong,   v_long);
84 DEFINE_CAST (float_ulong,       v_float,  gulong,  v_ulong);
85 DEFINE_CAST (float_double,      v_float,  gdouble, v_double);
86 DEFINE_CAST (double_s8,         v_double, gint8,   v_int);
87 DEFINE_CAST (double_u8,         v_double, guint8,  v_uint);
88 DEFINE_CAST (double_int,        v_double, gint,    v_int);
89 DEFINE_CAST (double_uint,       v_double, guint,   v_uint);
90 DEFINE_CAST (double_long,       v_double, glong,   v_long);
91 DEFINE_CAST (double_ulong,      v_double, gulong,  v_ulong);
92 DEFINE_CAST (double_float,      v_double, gfloat,  v_float);
93
94
95 /* boolean assignments
96  */
97 #define DEFINE_BOOL_CHECK(func_name, from_member)                               \
98     static void                                                                 \
99     value_transform_##func_name (const GValue *src_value,                       \
100                                  GValue       *dest_value)                      \
101     {                                                                           \
102       dest_value->data[0].v_int = src_value->data[0].from_member != 0;  \
103     }
104 DEFINE_BOOL_CHECK (int_bool,    v_int);
105 DEFINE_BOOL_CHECK (uint_bool,   v_uint);
106 DEFINE_BOOL_CHECK (long_bool,   v_long);
107 DEFINE_BOOL_CHECK (ulong_bool,  v_uint);
108
109
110 /* string printouts
111  */
112 #define DEFINE_SPRINTF(func_name, from_member, format)                          \
113     static void                                                                 \
114     value_transform_##func_name (const GValue *src_value,                       \
115                                  GValue       *dest_value)                      \
116     {                                                                           \
117       dest_value->data[0].v_pointer =                                           \
118         g_strdup_printf ((format), src_value->data[0].from_member);             \
119     }
120 DEFINE_SPRINTF (int_string,     v_int,    "%d");
121 DEFINE_SPRINTF (uint_string,    v_uint,   "%u");
122 DEFINE_SPRINTF (long_string,    v_long,   "%ld");
123 DEFINE_SPRINTF (ulong_string,   v_ulong,  "%lu");
124 DEFINE_SPRINTF (float_string,   v_float,  "%f");
125 DEFINE_SPRINTF (double_string,  v_double, "%f");
126
127
128 /* special cases
129  */
130 static void
131 value_transform_bool_string (const GValue *src_value,
132                              GValue       *dest_value)
133 {
134   dest_value->data[0].v_pointer = g_strdup_printf ("%s",
135                                                    src_value->data[0].v_int ?
136                                                    "TRUE" : "FALSE");
137 }
138 static void
139 value_transform_string_string (const GValue *src_value,
140                                GValue       *dest_value)
141 {
142   dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
143 }
144 static void
145 value_transform_enum_string (const GValue *src_value,
146                              GValue       *dest_value)
147 {
148   GEnumClass *class = g_type_class_ref (G_VALUE_TYPE (src_value));
149   GEnumValue *enum_value = g_enum_get_value (class, src_value->data[0].v_int);
150
151   if (enum_value)
152     dest_value->data[0].v_pointer = g_strdup (enum_value->value_name);
153   else
154     dest_value->data[0].v_pointer = g_strdup_printf ("%d", src_value->data[0].v_int);
155
156   g_type_class_unref (class);
157 }
158 static void
159 value_transform_flags_string (const GValue *src_value,
160                               GValue       *dest_value)
161 {
162   GFlagsClass *class = g_type_class_ref (G_VALUE_TYPE (src_value));
163   GFlagsValue *flags_value = g_flags_get_first_value (class, src_value->data[0].v_uint);
164
165   if (flags_value)
166     {
167       GString *gstring = g_string_new ("");
168       guint v_flags = src_value->data[0].v_uint;
169       
170       do
171         {
172           v_flags &= ~flags_value->value;
173           
174           if (gstring->str[0])
175             g_string_append (gstring, " | ");
176           g_string_append (gstring, flags_value->value_name);
177           flags_value = g_flags_get_first_value (class, v_flags);
178         }
179       while (flags_value);
180
181       if (v_flags)
182         dest_value->data[0].v_pointer = g_strdup_printf ("%s | %u",
183                                                          gstring->str,
184                                                          v_flags);
185       else
186         dest_value->data[0].v_pointer = g_strdup (gstring->str);
187       g_string_free (gstring, TRUE);
188     }
189   else
190     dest_value->data[0].v_pointer = g_strdup_printf ("%u", src_value->data[0].v_uint);
191
192   g_type_class_unref (class);
193 }
194
195
196 /* registration
197  */
198 void
199 g_value_transforms_init (void)          /* sync with gtype.c */
200 {
201   /* some transformations are a bit questionable,
202    * we currently skip those
203    */
204 #define SKIP____register_transform_func(type1,type2,transform_func)     /* skip questionable transforms */
205
206   /* numeric types (plus to string) */
207   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_CHAR,            value_transform_int_int);
208   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_UCHAR,           value_transform_int_u8);
209   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_BOOLEAN,         value_transform_int_bool);
210   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_INT,             value_transform_int_int);
211   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_UINT,            value_transform_int_uint);
212   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_LONG,            value_transform_int_long);
213   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_ULONG,           value_transform_int_ulong);
214   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_ENUM,            value_transform_int_int);
215   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_FLAGS,           value_transform_int_uint);
216   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_FLOAT,           value_transform_int_float);
217   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_DOUBLE,          value_transform_int_double);
218   g_value_register_transform_func (G_TYPE_CHAR,         G_TYPE_STRING,          value_transform_int_string);
219   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_CHAR,            value_transform_uint_s8);
220   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_UCHAR,           value_transform_uint_uint);
221   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_BOOLEAN,         value_transform_uint_bool);
222   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_INT,             value_transform_uint_int);
223   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_UINT,            value_transform_uint_uint);
224   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_LONG,            value_transform_uint_long);
225   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_ULONG,           value_transform_uint_ulong);
226   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_ENUM,            value_transform_uint_int);
227   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_FLAGS,           value_transform_uint_uint);
228   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_FLOAT,           value_transform_uint_float);
229   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_DOUBLE,          value_transform_uint_double);
230   g_value_register_transform_func (G_TYPE_UCHAR,        G_TYPE_STRING,          value_transform_uint_string);
231   g_value_register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_CHAR,            value_transform_int_s8);
232   g_value_register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_UCHAR,           value_transform_int_u8);
233   g_value_register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_BOOLEAN,         value_transform_int_int);
234   g_value_register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_INT,             value_transform_int_int);
235   g_value_register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_UINT,            value_transform_int_uint);
236   g_value_register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_LONG,            value_transform_int_long);
237   g_value_register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_ULONG,           value_transform_int_ulong);
238   g_value_register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_ENUM,            value_transform_int_int);
239   g_value_register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_FLAGS,           value_transform_int_uint);
240   SKIP____register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_FLOAT,           value_transform_int_float);
241   SKIP____register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_DOUBLE,          value_transform_int_double);
242   g_value_register_transform_func (G_TYPE_BOOLEAN,      G_TYPE_STRING,          value_transform_bool_string);
243   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_CHAR,            value_transform_int_s8);
244   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_UCHAR,           value_transform_int_u8);
245   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_BOOLEAN,         value_transform_int_bool);
246   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_INT,             value_transform_int_int);
247   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_UINT,            value_transform_int_uint);
248   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_LONG,            value_transform_int_long);
249   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_ULONG,           value_transform_int_ulong);
250   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_ENUM,            value_transform_int_int);
251   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_FLAGS,           value_transform_int_uint);
252   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_FLOAT,           value_transform_int_float);
253   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_DOUBLE,          value_transform_int_double);
254   g_value_register_transform_func (G_TYPE_INT,          G_TYPE_STRING,          value_transform_int_string);
255   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_CHAR,            value_transform_uint_s8);
256   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_UCHAR,           value_transform_uint_u8);
257   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_BOOLEAN,         value_transform_uint_bool);
258   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_INT,             value_transform_uint_int);
259   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_UINT,            value_transform_uint_uint);
260   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_LONG,            value_transform_uint_long);
261   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_ULONG,           value_transform_uint_ulong);
262   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_ENUM,            value_transform_uint_int);
263   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_FLAGS,           value_transform_uint_uint);
264   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_FLOAT,           value_transform_uint_float);
265   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_DOUBLE,          value_transform_uint_double);
266   g_value_register_transform_func (G_TYPE_UINT,         G_TYPE_STRING,          value_transform_uint_string);
267   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_CHAR,            value_transform_long_s8);
268   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_UCHAR,           value_transform_long_u8);
269   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_BOOLEAN,         value_transform_long_bool);
270   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_INT,             value_transform_long_int);
271   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_UINT,            value_transform_long_uint);
272   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_LONG,            value_transform_long_long);
273   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_ULONG,           value_transform_long_ulong);
274   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_ENUM,            value_transform_long_int);
275   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_FLAGS,           value_transform_long_uint);
276   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_FLOAT,           value_transform_long_float);
277   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_DOUBLE,          value_transform_long_double);
278   g_value_register_transform_func (G_TYPE_LONG,         G_TYPE_STRING,          value_transform_long_string);
279   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_CHAR,            value_transform_ulong_s8);
280   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_UCHAR,           value_transform_ulong_u8);
281   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_BOOLEAN,         value_transform_ulong_bool);
282   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_INT,             value_transform_ulong_int);
283   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_UINT,            value_transform_ulong_uint);
284   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_LONG,            value_transform_ulong_long);
285   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_ULONG,           value_transform_ulong_ulong);
286   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_ENUM,            value_transform_ulong_int);
287   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_FLAGS,           value_transform_ulong_uint);
288   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_FLOAT,           value_transform_ulong_float);
289   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_DOUBLE,          value_transform_ulong_double);
290   g_value_register_transform_func (G_TYPE_ULONG,        G_TYPE_STRING,          value_transform_ulong_string);
291   g_value_register_transform_func (G_TYPE_ENUM,         G_TYPE_CHAR,            value_transform_int_s8);
292   g_value_register_transform_func (G_TYPE_ENUM,         G_TYPE_UCHAR,           value_transform_int_u8);
293   SKIP____register_transform_func (G_TYPE_ENUM,         G_TYPE_BOOLEAN,         value_transform_int_bool);
294   g_value_register_transform_func (G_TYPE_ENUM,         G_TYPE_INT,             value_transform_int_int);
295   g_value_register_transform_func (G_TYPE_ENUM,         G_TYPE_UINT,            value_transform_int_uint);
296   g_value_register_transform_func (G_TYPE_ENUM,         G_TYPE_LONG,            value_transform_int_long);
297   g_value_register_transform_func (G_TYPE_ENUM,         G_TYPE_ULONG,           value_transform_int_ulong);
298   g_value_register_transform_func (G_TYPE_ENUM,         G_TYPE_ENUM,            value_transform_int_int);
299   g_value_register_transform_func (G_TYPE_ENUM,         G_TYPE_FLAGS,           value_transform_int_uint);
300   SKIP____register_transform_func (G_TYPE_ENUM,         G_TYPE_FLOAT,           value_transform_int_float);
301   SKIP____register_transform_func (G_TYPE_ENUM,         G_TYPE_DOUBLE,          value_transform_int_double);
302   g_value_register_transform_func (G_TYPE_ENUM,         G_TYPE_STRING,          value_transform_enum_string);
303   g_value_register_transform_func (G_TYPE_FLAGS,        G_TYPE_CHAR,            value_transform_uint_s8);
304   g_value_register_transform_func (G_TYPE_FLAGS,        G_TYPE_UCHAR,           value_transform_uint_u8);
305   SKIP____register_transform_func (G_TYPE_FLAGS,        G_TYPE_BOOLEAN,         value_transform_uint_bool);
306   g_value_register_transform_func (G_TYPE_FLAGS,        G_TYPE_INT,             value_transform_uint_int);
307   g_value_register_transform_func (G_TYPE_FLAGS,        G_TYPE_UINT,            value_transform_uint_uint);
308   g_value_register_transform_func (G_TYPE_FLAGS,        G_TYPE_LONG,            value_transform_uint_long);
309   g_value_register_transform_func (G_TYPE_FLAGS,        G_TYPE_ULONG,           value_transform_uint_ulong);
310   SKIP____register_transform_func (G_TYPE_FLAGS,        G_TYPE_ENUM,            value_transform_uint_int);
311   g_value_register_transform_func (G_TYPE_FLAGS,        G_TYPE_FLAGS,           value_transform_uint_uint);
312   SKIP____register_transform_func (G_TYPE_FLAGS,        G_TYPE_FLOAT,           value_transform_uint_float);
313   SKIP____register_transform_func (G_TYPE_FLAGS,        G_TYPE_DOUBLE,          value_transform_uint_double);
314   g_value_register_transform_func (G_TYPE_FLAGS,        G_TYPE_STRING,          value_transform_flags_string);
315   g_value_register_transform_func (G_TYPE_FLOAT,        G_TYPE_CHAR,            value_transform_float_s8);
316   g_value_register_transform_func (G_TYPE_FLOAT,        G_TYPE_UCHAR,           value_transform_float_u8);
317   SKIP____register_transform_func (G_TYPE_FLOAT,        G_TYPE_BOOLEAN,         value_transform_float_bool);
318   g_value_register_transform_func (G_TYPE_FLOAT,        G_TYPE_INT,             value_transform_float_int);
319   g_value_register_transform_func (G_TYPE_FLOAT,        G_TYPE_UINT,            value_transform_float_uint);
320   g_value_register_transform_func (G_TYPE_FLOAT,        G_TYPE_LONG,            value_transform_float_long);
321   g_value_register_transform_func (G_TYPE_FLOAT,        G_TYPE_ULONG,           value_transform_float_ulong);
322   SKIP____register_transform_func (G_TYPE_FLOAT,        G_TYPE_ENUM,            value_transform_float_int);
323   SKIP____register_transform_func (G_TYPE_FLOAT,        G_TYPE_FLAGS,           value_transform_float_uint);
324   g_value_register_transform_func (G_TYPE_FLOAT,        G_TYPE_FLOAT,           value_transform_float_float);
325   g_value_register_transform_func (G_TYPE_FLOAT,        G_TYPE_DOUBLE,          value_transform_float_double);
326   g_value_register_transform_func (G_TYPE_FLOAT,        G_TYPE_STRING,          value_transform_float_string);
327   g_value_register_transform_func (G_TYPE_DOUBLE,       G_TYPE_CHAR,            value_transform_double_s8);
328   g_value_register_transform_func (G_TYPE_DOUBLE,       G_TYPE_UCHAR,           value_transform_double_u8);
329   SKIP____register_transform_func (G_TYPE_DOUBLE,       G_TYPE_BOOLEAN,         value_transform_double_bool);
330   g_value_register_transform_func (G_TYPE_DOUBLE,       G_TYPE_INT,             value_transform_double_int);
331   g_value_register_transform_func (G_TYPE_DOUBLE,       G_TYPE_UINT,            value_transform_double_uint);
332   g_value_register_transform_func (G_TYPE_DOUBLE,       G_TYPE_LONG,            value_transform_double_long);
333   g_value_register_transform_func (G_TYPE_DOUBLE,       G_TYPE_ULONG,           value_transform_double_ulong);
334   SKIP____register_transform_func (G_TYPE_DOUBLE,       G_TYPE_ENUM,            value_transform_double_int);
335   SKIP____register_transform_func (G_TYPE_DOUBLE,       G_TYPE_FLAGS,           value_transform_double_uint);
336   g_value_register_transform_func (G_TYPE_DOUBLE,       G_TYPE_FLOAT,           value_transform_double_float);
337   g_value_register_transform_func (G_TYPE_DOUBLE,       G_TYPE_DOUBLE,          value_transform_double_double);
338   g_value_register_transform_func (G_TYPE_DOUBLE,       G_TYPE_STRING,          value_transform_double_string);
339   /* string types */
340   g_value_register_transform_func (G_TYPE_STRING,       G_TYPE_STRING,          value_transform_string_string);
341 }