1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
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.
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.
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.
24 #include "gvaluetypes.h"
26 #include "gvaluecollector.h"
30 /* --- value functions --- */
32 value_long0_init (GValue *value)
34 value->data[0].v_long = 0;
38 value_long0_copy (const GValue *src_value,
41 dest_value->data[0].v_long = src_value->data[0].v_long;
45 value_char_lcopy_value (const GValue *value,
46 guint n_collect_values,
47 GTypeCValue *collect_values,
50 gint8 *int8_p = collect_values[0].v_pointer;
53 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
55 *int8_p = value->data[0].v_int;
61 value_boolean_lcopy_value (const GValue *value,
62 guint n_collect_values,
63 GTypeCValue *collect_values,
66 gboolean *bool_p = collect_values[0].v_pointer;
69 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
71 *bool_p = value->data[0].v_int;
77 value_int_collect_value (GValue *value,
78 guint n_collect_values,
79 GTypeCValue *collect_values,
82 value->data[0].v_int = collect_values[0].v_int;
88 value_int_lcopy_value (const GValue *value,
89 guint n_collect_values,
90 GTypeCValue *collect_values,
93 gint *int_p = collect_values[0].v_pointer;
96 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
98 *int_p = value->data[0].v_int;
104 value_long_collect_value (GValue *value,
105 guint n_collect_values,
106 GTypeCValue *collect_values,
109 value->data[0].v_long = collect_values[0].v_long;
115 value_long_lcopy_value (const GValue *value,
116 guint n_collect_values,
117 GTypeCValue *collect_values,
120 glong *long_p = collect_values[0].v_pointer;
123 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
125 *long_p = value->data[0].v_long;
131 value_float_init (GValue *value)
133 value->data[0].v_float = 0.0;
137 value_float_copy (const GValue *src_value,
140 dest_value->data[0].v_float = src_value->data[0].v_float;
144 value_float_collect_value (GValue *value,
145 guint n_collect_values,
146 GTypeCValue *collect_values,
149 value->data[0].v_float = collect_values[0].v_double;
155 value_float_lcopy_value (const GValue *value,
156 guint n_collect_values,
157 GTypeCValue *collect_values,
160 gfloat *float_p = collect_values[0].v_pointer;
163 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
165 *float_p = value->data[0].v_float;
171 value_double_init (GValue *value)
173 value->data[0].v_double = 0.0;
177 value_double_copy (const GValue *src_value,
180 dest_value->data[0].v_double = src_value->data[0].v_double;
184 value_double_collect_value (GValue *value,
185 guint n_collect_values,
186 GTypeCValue *collect_values,
189 value->data[0].v_double = collect_values[0].v_double;
195 value_double_lcopy_value (const GValue *value,
196 guint n_collect_values,
197 GTypeCValue *collect_values,
200 gdouble *double_p = collect_values[0].v_pointer;
203 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
205 *double_p = value->data[0].v_double;
211 value_string_init (GValue *value)
213 value->data[0].v_pointer = NULL;
217 value_string_free_value (GValue *value)
219 if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
220 g_free (value->data[0].v_pointer);
224 value_string_copy_value (const GValue *src_value,
227 dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
231 value_string_collect_value (GValue *value,
232 guint n_collect_values,
233 GTypeCValue *collect_values,
236 if (!collect_values[0].v_pointer)
237 value->data[0].v_pointer = NULL;
238 else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
240 value->data[0].v_pointer = collect_values[0].v_pointer;
241 value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
244 value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
250 value_string_lcopy_value (const GValue *value,
251 guint n_collect_values,
252 GTypeCValue *collect_values,
255 gchar **string_p = collect_values[0].v_pointer;
258 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
260 if (!value->data[0].v_pointer)
262 else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
263 *string_p = value->data[0].v_pointer;
265 *string_p = g_strdup (value->data[0].v_pointer);
271 value_pointer_init (GValue *value)
273 value->data[0].v_pointer = NULL;
277 value_pointer_copy (const GValue *src_value,
280 dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
284 value_pointer_peek_pointer (const GValue *value)
286 return value->data[0].v_pointer;
290 value_pointer_collect_value (GValue *value,
291 guint n_collect_values,
292 GTypeCValue *collect_values,
295 value->data[0].v_pointer = collect_values[0].v_pointer;
301 value_pointer_lcopy_value (const GValue *value,
302 guint n_collect_values,
303 GTypeCValue *collect_values,
306 gpointer *pointer_p = collect_values[0].v_pointer;
309 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
311 *pointer_p = value->data[0].v_pointer;
317 value_ccallback_init (GValue *value)
319 value->data[0].v_pointer = NULL;
320 value->data[1].v_pointer = NULL;
324 value_ccallback_copy (const GValue *src_value,
327 dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
328 dest_value->data[1].v_pointer = src_value->data[1].v_pointer;
332 value_ccallback_collect_value (GValue *value,
333 guint n_collect_values,
334 GTypeCValue *collect_values,
339 if (!collect_values[0].v_pointer)
340 error = g_strconcat ("invalid (NULL) pointer callback function for value type `",
341 G_VALUE_TYPE_NAME (value),
344 value->data[0].v_pointer = collect_values[0].v_pointer;
345 value->data[1].v_pointer = collect_values[1].v_pointer;
351 value_ccallback_lcopy_value (const GValue *value,
352 guint n_collect_values,
353 GTypeCValue *collect_values,
356 gpointer *callback_p = collect_values[0].v_pointer;
357 gpointer *data_p = collect_values[1].v_pointer;
359 if (!callback_p || !data_p)
360 return g_strdup_printf ("%s location for `%s' passed as NULL",
361 callback_p ? "data" : "callback",
362 G_VALUE_TYPE_NAME (value));
363 *callback_p = value->data[0].v_pointer;
364 *data_p = value->data[1].v_pointer;
370 /* --- type initialization --- */
372 g_value_types_init (void) /* sync with gtype.c */
376 NULL, /* base_init */
377 NULL, /* base_destroy */
378 NULL, /* class_init */
379 NULL, /* class_destroy */
380 NULL, /* class_data */
381 0, /* instance_size */
383 NULL, /* instance_init */
384 NULL, /* value_table */
386 const GTypeFundamentalInfo finfo = { G_TYPE_FLAG_DERIVABLE, };
389 /* G_TYPE_CHAR / G_TYPE_UCHAR
392 static const GTypeValueTable value_table = {
393 value_long0_init, /* value_init */
394 NULL, /* value_free */
395 value_long0_copy, /* value_copy */
396 NULL, /* value_peek_pointer */
397 "i", /* collect_format */
398 value_int_collect_value, /* collect_value */
399 "p", /* lcopy_format */
400 value_char_lcopy_value, /* lcopy_value */
402 info.value_table = &value_table;
403 type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &info, &finfo, 0);
404 g_assert (type == G_TYPE_CHAR);
405 type = g_type_register_fundamental (G_TYPE_UCHAR, "guchar", &info, &finfo, 0);
406 g_assert (type == G_TYPE_UCHAR);
412 static const GTypeValueTable value_table = {
413 value_long0_init, /* value_init */
414 NULL, /* value_free */
415 value_long0_copy, /* value_copy */
416 NULL, /* value_peek_pointer */
417 "i", /* collect_format */
418 value_int_collect_value, /* collect_value */
419 "p", /* lcopy_format */
420 value_boolean_lcopy_value, /* lcopy_value */
422 info.value_table = &value_table;
423 type = g_type_register_fundamental (G_TYPE_BOOLEAN, "gboolean", &info, &finfo, 0);
424 g_assert (type == G_TYPE_BOOLEAN);
427 /* G_TYPE_INT / G_TYPE_UINT
430 static const GTypeValueTable value_table = {
431 value_long0_init, /* value_init */
432 NULL, /* value_free */
433 value_long0_copy, /* value_copy */
434 NULL, /* value_peek_pointer */
435 "i", /* collect_format */
436 value_int_collect_value, /* collect_value */
437 "p", /* lcopy_format */
438 value_int_lcopy_value, /* lcopy_value */
440 info.value_table = &value_table;
441 type = g_type_register_fundamental (G_TYPE_INT, "gint", &info, &finfo, 0);
442 g_assert (type == G_TYPE_INT);
443 type = g_type_register_fundamental (G_TYPE_UINT, "guint", &info, &finfo, 0);
444 g_assert (type == G_TYPE_UINT);
447 /* G_TYPE_LONG / G_TYPE_ULONG
450 static const GTypeValueTable value_table = {
451 value_long0_init, /* value_init */
452 NULL, /* value_free */
453 value_long0_copy, /* value_copy */
454 NULL, /* value_peek_pointer */
455 "l", /* collect_format */
456 value_long_collect_value, /* collect_value */
457 "p", /* lcopy_format */
458 value_long_lcopy_value, /* lcopy_value */
460 info.value_table = &value_table;
461 type = g_type_register_fundamental (G_TYPE_LONG, "glong", &info, &finfo, 0);
462 g_assert (type == G_TYPE_LONG);
463 type = g_type_register_fundamental (G_TYPE_ULONG, "gulong", &info, &finfo, 0);
464 g_assert (type == G_TYPE_ULONG);
470 static const GTypeValueTable value_table = {
471 value_float_init, /* value_init */
472 NULL, /* value_free */
473 value_float_copy, /* value_copy */
474 NULL, /* value_peek_pointer */
475 "d", /* collect_format */
476 value_float_collect_value, /* collect_value */
477 "p", /* lcopy_format */
478 value_float_lcopy_value, /* lcopy_value */
480 info.value_table = &value_table;
481 type = g_type_register_fundamental (G_TYPE_FLOAT, "gfloat", &info, &finfo, 0);
482 g_assert (type == G_TYPE_FLOAT);
488 static const GTypeValueTable value_table = {
489 value_double_init, /* value_init */
490 NULL, /* value_free */
491 value_double_copy, /* value_copy */
492 NULL, /* value_peek_pointer */
493 "d", /* collect_format */
494 value_double_collect_value, /* collect_value */
495 "p", /* lcopy_format */
496 value_double_lcopy_value, /* lcopy_value */
498 info.value_table = &value_table;
499 type = g_type_register_fundamental (G_TYPE_DOUBLE, "gdouble", &info, &finfo, 0);
500 g_assert (type == G_TYPE_DOUBLE);
506 static const GTypeValueTable value_table = {
507 value_string_init, /* value_init */
508 value_string_free_value, /* value_free */
509 value_string_copy_value, /* value_copy */
510 value_pointer_peek_pointer, /* value_peek_pointer */
511 "p", /* collect_format */
512 value_string_collect_value, /* collect_value */
513 "p", /* lcopy_format */
514 value_string_lcopy_value, /* lcopy_value */
516 info.value_table = &value_table;
517 type = g_type_register_fundamental (G_TYPE_STRING, "gstring", &info, &finfo, 0);
518 g_assert (type == G_TYPE_STRING);
524 static const GTypeValueTable value_table = {
525 value_pointer_init, /* value_init */
526 NULL, /* value_free */
527 value_pointer_copy, /* value_copy */
528 value_pointer_peek_pointer, /* value_peek_pointer */
529 "p", /* collect_format */
530 value_pointer_collect_value, /* collect_value */
531 "p", /* lcopy_format */
532 value_pointer_lcopy_value, /* lcopy_value */
534 info.value_table = &value_table;
535 type = g_type_register_fundamental (G_TYPE_POINTER, "gpointer", &info, &finfo, 0);
536 g_assert (type == G_TYPE_POINTER);
542 static const GTypeValueTable value_table = {
543 value_ccallback_init, /* value_init */
544 NULL, /* value_free */
545 value_ccallback_copy, /* value_copy */
546 NULL, /* value_peek_pointer */
547 "pp", /* collect_format */
548 value_ccallback_collect_value, /* collect_value */
549 "pp", /* lcopy_format */
550 value_ccallback_lcopy_value, /* lcopy_value */
552 info.value_table = &value_table;
553 type = g_type_register_fundamental (G_TYPE_CCALLBACK, "GCCallback", &info, &finfo, 0);
554 g_assert (type == G_TYPE_CCALLBACK);
559 /* --- GValue functions --- */
561 g_value_set_char (GValue *value,
564 g_return_if_fail (G_IS_VALUE_CHAR (value));
566 value->data[0].v_int = v_char;
570 g_value_get_char (const GValue *value)
572 g_return_val_if_fail (G_IS_VALUE_CHAR (value), 0);
574 return value->data[0].v_int;
578 g_value_set_uchar (GValue *value,
581 g_return_if_fail (G_IS_VALUE_UCHAR (value));
583 value->data[0].v_uint = v_uchar;
587 g_value_get_uchar (const GValue *value)
589 g_return_val_if_fail (G_IS_VALUE_UCHAR (value), 0);
591 return value->data[0].v_uint;
595 g_value_set_boolean (GValue *value,
598 g_return_if_fail (G_IS_VALUE_BOOLEAN (value));
600 value->data[0].v_int = v_boolean;
604 g_value_get_boolean (const GValue *value)
606 g_return_val_if_fail (G_IS_VALUE_BOOLEAN (value), 0);
608 return value->data[0].v_int;
612 g_value_set_int (GValue *value,
615 g_return_if_fail (G_IS_VALUE_INT (value));
617 value->data[0].v_int = v_int;
621 g_value_get_int (const GValue *value)
623 g_return_val_if_fail (G_IS_VALUE_INT (value), 0);
625 return value->data[0].v_int;
629 g_value_set_uint (GValue *value,
632 g_return_if_fail (G_IS_VALUE_UINT (value));
634 value->data[0].v_uint = v_uint;
638 g_value_get_uint (const GValue *value)
640 g_return_val_if_fail (G_IS_VALUE_UINT (value), 0);
642 return value->data[0].v_uint;
646 g_value_set_long (GValue *value,
649 g_return_if_fail (G_IS_VALUE_LONG (value));
651 value->data[0].v_long = v_long;
655 g_value_get_long (const GValue *value)
657 g_return_val_if_fail (G_IS_VALUE_LONG (value), 0);
659 return value->data[0].v_long;
663 g_value_set_ulong (GValue *value,
666 g_return_if_fail (G_IS_VALUE_ULONG (value));
668 value->data[0].v_ulong = v_ulong;
672 g_value_get_ulong (const GValue *value)
674 g_return_val_if_fail (G_IS_VALUE_ULONG (value), 0);
676 return value->data[0].v_ulong;
680 g_value_set_float (GValue *value,
683 g_return_if_fail (G_IS_VALUE_FLOAT (value));
685 value->data[0].v_float = v_float;
689 g_value_get_float (const GValue *value)
691 g_return_val_if_fail (G_IS_VALUE_FLOAT (value), 0);
693 return value->data[0].v_float;
697 g_value_set_double (GValue *value,
700 g_return_if_fail (G_IS_VALUE_DOUBLE (value));
702 value->data[0].v_double = v_double;
706 g_value_get_double (const GValue *value)
708 g_return_val_if_fail (G_IS_VALUE_DOUBLE (value), 0);
710 return value->data[0].v_double;
714 g_value_set_string (GValue *value,
715 const gchar *v_string)
717 g_return_if_fail (G_IS_VALUE_STRING (value));
719 if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
720 value->data[1].v_uint = 0;
722 g_free (value->data[0].v_pointer);
723 value->data[0].v_pointer = g_strdup (v_string);
727 g_value_set_static_string (GValue *value,
728 const gchar *v_string)
730 g_return_if_fail (G_IS_VALUE_STRING (value));
732 if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
733 g_free (value->data[0].v_pointer);
734 value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
735 value->data[0].v_pointer = (gchar*) v_string;
739 g_value_get_string (const GValue *value)
741 g_return_val_if_fail (G_IS_VALUE_STRING (value), NULL);
743 return value->data[0].v_pointer;
747 g_value_dup_string (const GValue *value)
749 g_return_val_if_fail (G_IS_VALUE_STRING (value), NULL);
751 return g_strdup (value->data[0].v_pointer);
755 g_value_set_pointer (GValue *value,
758 g_return_if_fail (G_IS_VALUE_POINTER (value));
760 value->data[0].v_pointer = v_pointer;
764 g_value_get_pointer (const GValue *value)
766 g_return_val_if_fail (G_IS_VALUE_POINTER (value), NULL);
768 return value->data[0].v_pointer;
772 g_value_set_ccallback (GValue *value,
773 gpointer callback_func,
774 gpointer callback_data)
776 g_return_if_fail (G_IS_VALUE_CCALLBACK (value));
778 value->data[0].v_pointer = callback_func;
779 value->data[1].v_pointer = callback_data;
783 g_value_get_ccallback (const GValue *value,
784 gpointer *callback_func,
785 gpointer *callback_data)
787 g_return_if_fail (G_IS_VALUE_CCALLBACK (value));
790 *callback_func = value->data[0].v_pointer;
792 *callback_data = value->data[1].v_pointer;