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
, "gchar", &info
, &finfo
, 0);
393 g_assert (type
== G_TYPE_CHAR
);
394 type
= g_type_register_fundamental (G_TYPE_UCHAR
, "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
, "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
, "gint", &info
, &finfo
, 0);
431 g_assert (type
== G_TYPE_INT
);
432 type
= g_type_register_fundamental (G_TYPE_UINT
, "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
, "glong", &info
, &finfo
, 0);
451 g_assert (type
== G_TYPE_LONG
);
452 type
= g_type_register_fundamental (G_TYPE_ULONG
, "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
, "gint64", &info
, &finfo
, 0);
471 g_assert (type
== G_TYPE_INT64
);
472 type
= g_type_register_fundamental (G_TYPE_UINT64
, "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
, "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
, "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
, "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
, "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
)
742 g_return_if_fail (G_VALUE_HOLDS_STRING (value
));
744 if (value
->data
[1].v_uint
& G_VALUE_NOCOPY_CONTENTS
)
745 value
->data
[1].v_uint
= 0;
747 g_free (value
->data
[0].v_pointer
);
748 value
->data
[0].v_pointer
= g_strdup (v_string
);
752 g_value_set_static_string (GValue
*value
,
753 const gchar
*v_string
)
755 g_return_if_fail (G_VALUE_HOLDS_STRING (value
));
757 if (!(value
->data
[1].v_uint
& G_VALUE_NOCOPY_CONTENTS
))
758 g_free (value
->data
[0].v_pointer
);
759 value
->data
[1].v_uint
= G_VALUE_NOCOPY_CONTENTS
;
760 value
->data
[0].v_pointer
= (gchar
*) v_string
;
764 g_value_set_string_take_ownership (GValue
*value
,
767 g_value_take_string (value
, v_string
);
771 g_value_take_string (GValue
*value
,
774 g_return_if_fail (G_VALUE_HOLDS_STRING (value
));
776 if (value
->data
[1].v_uint
& G_VALUE_NOCOPY_CONTENTS
)
777 value
->data
[1].v_uint
= 0;
779 g_free (value
->data
[0].v_pointer
);
780 value
->data
[0].v_pointer
= v_string
;
783 G_CONST_RETURN gchar
*
784 g_value_get_string (const GValue
*value
)
786 g_return_val_if_fail (G_VALUE_HOLDS_STRING (value
), NULL
);
788 return value
->data
[0].v_pointer
;
792 g_value_dup_string (const GValue
*value
)
794 g_return_val_if_fail (G_VALUE_HOLDS_STRING (value
), NULL
);
796 return g_strdup (value
->data
[0].v_pointer
);
800 g_value_set_pointer (GValue
*value
,
803 g_return_if_fail (G_VALUE_HOLDS_POINTER (value
));
805 value
->data
[0].v_pointer
= v_pointer
;
809 g_value_get_pointer (const GValue
*value
)
811 g_return_val_if_fail (G_VALUE_HOLDS_POINTER (value
), NULL
);
813 return value
->data
[0].v_pointer
;
816 /* need extra includes for g_strdup_value_contents() ;( */
823 g_strdup_value_contents (const GValue
*value
)
828 g_return_val_if_fail (G_IS_VALUE (value
), NULL
);
830 if (G_VALUE_HOLDS_STRING (value
))
832 src
= g_value_get_string (value
);
835 contents
= g_strdup ("NULL");
838 gchar
*s
= g_strescape (src
, NULL
);
840 contents
= g_strdup_printf ("\"%s\"", s
);
844 else if (g_value_type_transformable (G_VALUE_TYPE (value
), G_TYPE_STRING
))
846 GValue tmp_value
= { 0, };
849 g_value_init (&tmp_value
, G_TYPE_STRING
);
850 g_value_transform (value
, &tmp_value
);
851 s
= g_strescape (g_value_get_string (&tmp_value
), NULL
);
852 g_value_unset (&tmp_value
);
853 if (G_VALUE_HOLDS_ENUM (value
) || G_VALUE_HOLDS_FLAGS (value
))
854 contents
= g_strdup_printf ("((%s) %s)",
855 g_type_name (G_VALUE_TYPE (value
)),
858 contents
= g_strdup (s
? s
: "NULL");
861 else if (g_value_fits_pointer (value
))
863 gpointer p
= g_value_peek_pointer (value
);
866 contents
= g_strdup ("NULL");
867 else if (G_VALUE_HOLDS_OBJECT (value
))
868 contents
= g_strdup_printf ("((%s*) %p)", G_OBJECT_TYPE_NAME (p
), p
);
869 else if (G_VALUE_HOLDS_PARAM (value
))
870 contents
= g_strdup_printf ("((%s*) %p)", G_PARAM_SPEC_TYPE_NAME (p
), p
);
871 else if (G_VALUE_HOLDS_BOXED (value
))
872 contents
= g_strdup_printf ("((%s*) %p)", g_type_name (G_VALUE_TYPE (value
)), p
);
873 else if (G_VALUE_HOLDS_POINTER (value
))
874 contents
= g_strdup_printf ("((gpointer) %p)", p
);
876 contents
= g_strdup ("???");
879 contents
= g_strdup ("???");
885 g_pointer_type_register_static (const gchar
*name
)
887 static const GTypeInfo type_info
= {
889 NULL
, /* base_init */
890 NULL
, /* base_finalize */
891 NULL
, /* class_init */
892 NULL
, /* class_finalize */
893 NULL
, /* class_data */
894 0, /* instance_size */
896 NULL
, /* instance_init */
897 NULL
/* value_table */
901 g_return_val_if_fail (name
!= NULL
, 0);
902 g_return_val_if_fail (g_type_from_name (name
) == 0, 0);
904 type
= g_type_register_static (G_TYPE_POINTER
, name
, &type_info
, 0);
909 #define __G_VALUETYPES_C__
910 #include "gobjectaliasdef.c"