1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 1997-1999, 2000-2001 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"
27 #include "gobjectalias.h"
29 #include <stdlib.h> /* qsort() */
32 /* --- value functions --- */
34 value_init_long0 (GValue *value)
36 value->data[0].v_long = 0;
40 value_copy_long0 (const GValue *src_value,
43 dest_value->data[0].v_long = src_value->data[0].v_long;
47 value_lcopy_char (const GValue *value,
48 guint n_collect_values,
49 GTypeCValue *collect_values,
52 gint8 *int8_p = collect_values[0].v_pointer;
55 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
57 *int8_p = value->data[0].v_int;
63 value_lcopy_boolean (const GValue *value,
64 guint n_collect_values,
65 GTypeCValue *collect_values,
68 gboolean *bool_p = collect_values[0].v_pointer;
71 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
73 *bool_p = value->data[0].v_int;
79 value_collect_int (GValue *value,
80 guint n_collect_values,
81 GTypeCValue *collect_values,
84 value->data[0].v_int = collect_values[0].v_int;
90 value_lcopy_int (const GValue *value,
91 guint n_collect_values,
92 GTypeCValue *collect_values,
95 gint *int_p = collect_values[0].v_pointer;
98 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
100 *int_p = value->data[0].v_int;
106 value_collect_long (GValue *value,
107 guint n_collect_values,
108 GTypeCValue *collect_values,
111 value->data[0].v_long = collect_values[0].v_long;
117 value_lcopy_long (const GValue *value,
118 guint n_collect_values,
119 GTypeCValue *collect_values,
122 glong *long_p = collect_values[0].v_pointer;
125 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
127 *long_p = value->data[0].v_long;
133 value_init_int64 (GValue *value)
135 value->data[0].v_int64 = 0;
139 value_copy_int64 (const GValue *src_value,
142 dest_value->data[0].v_int64 = src_value->data[0].v_int64;
146 value_collect_int64 (GValue *value,
147 guint n_collect_values,
148 GTypeCValue *collect_values,
151 value->data[0].v_int64 = collect_values[0].v_int64;
157 value_lcopy_int64 (const GValue *value,
158 guint n_collect_values,
159 GTypeCValue *collect_values,
162 gint64 *int64_p = collect_values[0].v_pointer;
165 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
167 *int64_p = value->data[0].v_int64;
173 value_init_float (GValue *value)
175 value->data[0].v_float = 0.0;
179 value_copy_float (const GValue *src_value,
182 dest_value->data[0].v_float = src_value->data[0].v_float;
186 value_collect_float (GValue *value,
187 guint n_collect_values,
188 GTypeCValue *collect_values,
191 value->data[0].v_float = collect_values[0].v_double;
197 value_lcopy_float (const GValue *value,
198 guint n_collect_values,
199 GTypeCValue *collect_values,
202 gfloat *float_p = collect_values[0].v_pointer;
205 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
207 *float_p = value->data[0].v_float;
213 value_init_double (GValue *value)
215 value->data[0].v_double = 0.0;
219 value_copy_double (const GValue *src_value,
222 dest_value->data[0].v_double = src_value->data[0].v_double;
226 value_collect_double (GValue *value,
227 guint n_collect_values,
228 GTypeCValue *collect_values,
231 value->data[0].v_double = collect_values[0].v_double;
237 value_lcopy_double (const GValue *value,
238 guint n_collect_values,
239 GTypeCValue *collect_values,
242 gdouble *double_p = collect_values[0].v_pointer;
245 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
247 *double_p = value->data[0].v_double;
253 value_init_string (GValue *value)
255 value->data[0].v_pointer = NULL;
259 value_free_string (GValue *value)
261 if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
262 g_free (value->data[0].v_pointer);
266 value_copy_string (const GValue *src_value,
269 dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
273 value_collect_string (GValue *value,
274 guint n_collect_values,
275 GTypeCValue *collect_values,
278 if (!collect_values[0].v_pointer)
279 value->data[0].v_pointer = NULL;
280 else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
282 value->data[0].v_pointer = collect_values[0].v_pointer;
283 value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
286 value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
292 value_lcopy_string (const GValue *value,
293 guint n_collect_values,
294 GTypeCValue *collect_values,
297 gchar **string_p = collect_values[0].v_pointer;
300 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
302 if (!value->data[0].v_pointer)
304 else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
305 *string_p = value->data[0].v_pointer;
307 *string_p = g_strdup (value->data[0].v_pointer);
313 value_init_pointer (GValue *value)
315 value->data[0].v_pointer = NULL;
319 value_copy_pointer (const GValue *src_value,
322 dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
326 value_peek_pointer0 (const GValue *value)
328 return value->data[0].v_pointer;
332 value_collect_pointer (GValue *value,
333 guint n_collect_values,
334 GTypeCValue *collect_values,
337 value->data[0].v_pointer = collect_values[0].v_pointer;
343 value_lcopy_pointer (const GValue *value,
344 guint n_collect_values,
345 GTypeCValue *collect_values,
348 gpointer *pointer_p = collect_values[0].v_pointer;
351 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
353 *pointer_p = value->data[0].v_pointer;
359 /* --- type initialization --- */
361 g_value_types_init (void)
365 NULL, /* base_init */
366 NULL, /* base_destroy */
367 NULL, /* class_init */
368 NULL, /* class_destroy */
369 NULL, /* class_data */
370 0, /* instance_size */
372 NULL, /* instance_init */
373 NULL, /* value_table */
375 const GTypeFundamentalInfo finfo = { G_TYPE_FLAG_DERIVABLE, };
378 /* G_TYPE_CHAR / G_TYPE_UCHAR
381 static const GTypeValueTable value_table = {
382 value_init_long0, /* value_init */
383 NULL, /* value_free */
384 value_copy_long0, /* value_copy */
385 NULL, /* value_peek_pointer */
386 "i", /* collect_format */
387 value_collect_int, /* collect_value */
388 "p", /* lcopy_format */
389 value_lcopy_char, /* lcopy_value */
391 info.value_table = &value_table;
392 type = g_type_register_fundamental (G_TYPE_CHAR, g_intern_static_string ("gchar"), &info, &finfo, 0);
393 g_assert (type == G_TYPE_CHAR);
394 type = g_type_register_fundamental (G_TYPE_UCHAR, g_intern_static_string ("guchar"), &info, &finfo, 0);
395 g_assert (type == G_TYPE_UCHAR);
401 static const GTypeValueTable value_table = {
402 value_init_long0, /* value_init */
403 NULL, /* value_free */
404 value_copy_long0, /* value_copy */
405 NULL, /* value_peek_pointer */
406 "i", /* collect_format */
407 value_collect_int, /* collect_value */
408 "p", /* lcopy_format */
409 value_lcopy_boolean, /* lcopy_value */
411 info.value_table = &value_table;
412 type = g_type_register_fundamental (G_TYPE_BOOLEAN, g_intern_static_string ("gboolean"), &info, &finfo, 0);
413 g_assert (type == G_TYPE_BOOLEAN);
416 /* G_TYPE_INT / G_TYPE_UINT
419 static const GTypeValueTable value_table = {
420 value_init_long0, /* value_init */
421 NULL, /* value_free */
422 value_copy_long0, /* value_copy */
423 NULL, /* value_peek_pointer */
424 "i", /* collect_format */
425 value_collect_int, /* collect_value */
426 "p", /* lcopy_format */
427 value_lcopy_int, /* lcopy_value */
429 info.value_table = &value_table;
430 type = g_type_register_fundamental (G_TYPE_INT, g_intern_static_string ("gint"), &info, &finfo, 0);
431 g_assert (type == G_TYPE_INT);
432 type = g_type_register_fundamental (G_TYPE_UINT, g_intern_static_string ("guint"), &info, &finfo, 0);
433 g_assert (type == G_TYPE_UINT);
436 /* G_TYPE_LONG / G_TYPE_ULONG
439 static const GTypeValueTable value_table = {
440 value_init_long0, /* value_init */
441 NULL, /* value_free */
442 value_copy_long0, /* value_copy */
443 NULL, /* value_peek_pointer */
444 "l", /* collect_format */
445 value_collect_long, /* collect_value */
446 "p", /* lcopy_format */
447 value_lcopy_long, /* lcopy_value */
449 info.value_table = &value_table;
450 type = g_type_register_fundamental (G_TYPE_LONG, g_intern_static_string ("glong"), &info, &finfo, 0);
451 g_assert (type == G_TYPE_LONG);
452 type = g_type_register_fundamental (G_TYPE_ULONG, g_intern_static_string ("gulong"), &info, &finfo, 0);
453 g_assert (type == G_TYPE_ULONG);
456 /* G_TYPE_INT64 / G_TYPE_UINT64
459 static const GTypeValueTable value_table = {
460 value_init_int64, /* value_init */
461 NULL, /* value_free */
462 value_copy_int64, /* value_copy */
463 NULL, /* value_peek_pointer */
464 "q", /* collect_format */
465 value_collect_int64, /* collect_value */
466 "p", /* lcopy_format */
467 value_lcopy_int64, /* lcopy_value */
469 info.value_table = &value_table;
470 type = g_type_register_fundamental (G_TYPE_INT64, g_intern_static_string ("gint64"), &info, &finfo, 0);
471 g_assert (type == G_TYPE_INT64);
472 type = g_type_register_fundamental (G_TYPE_UINT64, g_intern_static_string ("guint64"), &info, &finfo, 0);
473 g_assert (type == G_TYPE_UINT64);
479 static const GTypeValueTable value_table = {
480 value_init_float, /* value_init */
481 NULL, /* value_free */
482 value_copy_float, /* value_copy */
483 NULL, /* value_peek_pointer */
484 "d", /* collect_format */
485 value_collect_float, /* collect_value */
486 "p", /* lcopy_format */
487 value_lcopy_float, /* lcopy_value */
489 info.value_table = &value_table;
490 type = g_type_register_fundamental (G_TYPE_FLOAT, g_intern_static_string ("gfloat"), &info, &finfo, 0);
491 g_assert (type == G_TYPE_FLOAT);
497 static const GTypeValueTable value_table = {
498 value_init_double, /* value_init */
499 NULL, /* value_free */
500 value_copy_double, /* value_copy */
501 NULL, /* value_peek_pointer */
502 "d", /* collect_format */
503 value_collect_double, /* collect_value */
504 "p", /* lcopy_format */
505 value_lcopy_double, /* lcopy_value */
507 info.value_table = &value_table;
508 type = g_type_register_fundamental (G_TYPE_DOUBLE, g_intern_static_string ("gdouble"), &info, &finfo, 0);
509 g_assert (type == G_TYPE_DOUBLE);
515 static const GTypeValueTable value_table = {
516 value_init_string, /* value_init */
517 value_free_string, /* value_free */
518 value_copy_string, /* value_copy */
519 value_peek_pointer0, /* value_peek_pointer */
520 "p", /* collect_format */
521 value_collect_string, /* collect_value */
522 "p", /* lcopy_format */
523 value_lcopy_string, /* lcopy_value */
525 info.value_table = &value_table;
526 type = g_type_register_fundamental (G_TYPE_STRING, g_intern_static_string ("gchararray"), &info, &finfo, 0);
527 g_assert (type == G_TYPE_STRING);
533 static const GTypeValueTable value_table = {
534 value_init_pointer, /* value_init */
535 NULL, /* value_free */
536 value_copy_pointer, /* value_copy */
537 value_peek_pointer0, /* value_peek_pointer */
538 "p", /* collect_format */
539 value_collect_pointer, /* collect_value */
540 "p", /* lcopy_format */
541 value_lcopy_pointer, /* lcopy_value */
543 info.value_table = &value_table;
544 type = g_type_register_fundamental (G_TYPE_POINTER, g_intern_static_string ("gpointer"), &info, &finfo, 0);
545 g_assert (type == G_TYPE_POINTER);
550 /* --- GValue functions --- */
552 g_value_set_char (GValue *value,
555 g_return_if_fail (G_VALUE_HOLDS_CHAR (value));
557 value->data[0].v_int = v_char;
561 g_value_get_char (const GValue *value)
563 g_return_val_if_fail (G_VALUE_HOLDS_CHAR (value), 0);
565 return value->data[0].v_int;
569 g_value_set_uchar (GValue *value,
572 g_return_if_fail (G_VALUE_HOLDS_UCHAR (value));
574 value->data[0].v_uint = v_uchar;
578 g_value_get_uchar (const GValue *value)
580 g_return_val_if_fail (G_VALUE_HOLDS_UCHAR (value), 0);
582 return value->data[0].v_uint;
586 g_value_set_boolean (GValue *value,
589 g_return_if_fail (G_VALUE_HOLDS_BOOLEAN (value));
591 value->data[0].v_int = v_boolean != FALSE;
595 g_value_get_boolean (const GValue *value)
597 g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (value), 0);
599 return value->data[0].v_int;
603 g_value_set_int (GValue *value,
606 g_return_if_fail (G_VALUE_HOLDS_INT (value));
608 value->data[0].v_int = v_int;
612 g_value_get_int (const GValue *value)
614 g_return_val_if_fail (G_VALUE_HOLDS_INT (value), 0);
616 return value->data[0].v_int;
620 g_value_set_uint (GValue *value,
623 g_return_if_fail (G_VALUE_HOLDS_UINT (value));
625 value->data[0].v_uint = v_uint;
629 g_value_get_uint (const GValue *value)
631 g_return_val_if_fail (G_VALUE_HOLDS_UINT (value), 0);
633 return value->data[0].v_uint;
637 g_value_set_long (GValue *value,
640 g_return_if_fail (G_VALUE_HOLDS_LONG (value));
642 value->data[0].v_long = v_long;
646 g_value_get_long (const GValue *value)
648 g_return_val_if_fail (G_VALUE_HOLDS_LONG (value), 0);
650 return value->data[0].v_long;
654 g_value_set_ulong (GValue *value,
657 g_return_if_fail (G_VALUE_HOLDS_ULONG (value));
659 value->data[0].v_ulong = v_ulong;
663 g_value_get_ulong (const GValue *value)
665 g_return_val_if_fail (G_VALUE_HOLDS_ULONG (value), 0);
667 return value->data[0].v_ulong;
671 g_value_set_int64 (GValue *value,
674 g_return_if_fail (G_VALUE_HOLDS_INT64 (value));
676 value->data[0].v_int64 = v_int64;
680 g_value_get_int64 (const GValue *value)
682 g_return_val_if_fail (G_VALUE_HOLDS_INT64 (value), 0);
684 return value->data[0].v_int64;
688 g_value_set_uint64 (GValue *value,
691 g_return_if_fail (G_VALUE_HOLDS_UINT64 (value));
693 value->data[0].v_uint64 = v_uint64;
697 g_value_get_uint64 (const GValue *value)
699 g_return_val_if_fail (G_VALUE_HOLDS_UINT64 (value), 0);
701 return value->data[0].v_uint64;
705 g_value_set_float (GValue *value,
708 g_return_if_fail (G_VALUE_HOLDS_FLOAT (value));
710 value->data[0].v_float = v_float;
714 g_value_get_float (const GValue *value)
716 g_return_val_if_fail (G_VALUE_HOLDS_FLOAT (value), 0);
718 return value->data[0].v_float;
722 g_value_set_double (GValue *value,
725 g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value));
727 value->data[0].v_double = v_double;
731 g_value_get_double (const GValue *value)
733 g_return_val_if_fail (G_VALUE_HOLDS_DOUBLE (value), 0);
735 return value->data[0].v_double;
739 g_value_set_string (GValue *value,
740 const gchar *v_string)
744 g_return_if_fail (G_VALUE_HOLDS_STRING (value));
746 new_val = g_strdup (v_string);
748 if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
749 value->data[1].v_uint = 0;
751 g_free (value->data[0].v_pointer);
753 value->data[0].v_pointer = new_val;
757 g_value_set_static_string (GValue *value,
758 const gchar *v_string)
760 g_return_if_fail (G_VALUE_HOLDS_STRING (value));
762 if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
763 g_free (value->data[0].v_pointer);
764 value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
765 value->data[0].v_pointer = (gchar*) v_string;
769 g_value_set_string_take_ownership (GValue *value,
772 g_value_take_string (value, v_string);
776 g_value_take_string (GValue *value,
779 g_return_if_fail (G_VALUE_HOLDS_STRING (value));
781 if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
782 value->data[1].v_uint = 0;
784 g_free (value->data[0].v_pointer);
785 value->data[0].v_pointer = v_string;
788 G_CONST_RETURN gchar*
789 g_value_get_string (const GValue *value)
791 g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL);
793 return value->data[0].v_pointer;
797 g_value_dup_string (const GValue *value)
799 g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL);
801 return g_strdup (value->data[0].v_pointer);
805 g_value_set_pointer (GValue *value,
808 g_return_if_fail (G_VALUE_HOLDS_POINTER (value));
810 value->data[0].v_pointer = v_pointer;
814 g_value_get_pointer (const GValue *value)
816 g_return_val_if_fail (G_VALUE_HOLDS_POINTER (value), NULL);
818 return value->data[0].v_pointer;
822 g_gtype_get_type (void)
824 static const GTypeInfo type_info = { 0, };
827 type = g_type_register_static (G_TYPE_POINTER, g_intern_static_string ("GType"), &type_info, 0);
832 g_value_set_gtype (GValue *value,
835 g_return_if_fail (G_VALUE_HOLDS_GTYPE (value));
837 value->data[0].v_long = v_gtype;
842 g_value_get_gtype (const GValue *value)
844 g_return_val_if_fail (G_VALUE_HOLDS_GTYPE (value), 0);
846 return value->data[0].v_long;
850 /* need extra includes for g_strdup_value_contents() ;( */
857 g_strdup_value_contents (const GValue *value)
862 g_return_val_if_fail (G_IS_VALUE (value), NULL);
864 if (G_VALUE_HOLDS_STRING (value))
866 src = g_value_get_string (value);
869 contents = g_strdup ("NULL");
872 gchar *s = g_strescape (src, NULL);
874 contents = g_strdup_printf ("\"%s\"", s);
878 else if (g_value_type_transformable (G_VALUE_TYPE (value), G_TYPE_STRING))
880 GValue tmp_value = { 0, };
883 g_value_init (&tmp_value, G_TYPE_STRING);
884 g_value_transform (value, &tmp_value);
885 s = g_strescape (g_value_get_string (&tmp_value), NULL);
886 g_value_unset (&tmp_value);
887 if (G_VALUE_HOLDS_ENUM (value) || G_VALUE_HOLDS_FLAGS (value))
888 contents = g_strdup_printf ("((%s) %s)",
889 g_type_name (G_VALUE_TYPE (value)),
892 contents = g_strdup (s ? s : "NULL");
895 else if (g_value_fits_pointer (value))
897 gpointer p = g_value_peek_pointer (value);
900 contents = g_strdup ("NULL");
901 else if (G_VALUE_HOLDS_OBJECT (value))
902 contents = g_strdup_printf ("((%s*) %p)", G_OBJECT_TYPE_NAME (p), p);
903 else if (G_VALUE_HOLDS_PARAM (value))
904 contents = g_strdup_printf ("((%s*) %p)", G_PARAM_SPEC_TYPE_NAME (p), p);
905 else if (G_VALUE_HOLDS_BOXED (value))
906 contents = g_strdup_printf ("((%s*) %p)", g_type_name (G_VALUE_TYPE (value)), p);
907 else if (G_VALUE_HOLDS_POINTER (value))
908 contents = g_strdup_printf ("((gpointer) %p)", p);
910 contents = g_strdup ("???");
913 contents = g_strdup ("???");
919 g_pointer_type_register_static (const gchar *name)
921 static const GTypeInfo type_info = {
923 NULL, /* base_init */
924 NULL, /* base_finalize */
925 NULL, /* class_init */
926 NULL, /* class_finalize */
927 NULL, /* class_data */
928 0, /* instance_size */
930 NULL, /* instance_init */
931 NULL /* value_table */
935 g_return_val_if_fail (name != NULL, 0);
936 g_return_val_if_fail (g_type_from_name (name) == 0, 0);
938 type = g_type_register_static (G_TYPE_POINTER, name, &type_info, 0);
943 #define __G_VALUETYPES_C__
944 #include "gobjectaliasdef.c"