1 /* GObject - GLib Type, Object, Parameter and Signal Library 2 * Copyright (C) 1997-1999, 2000-2001 Tim Janik and 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 20 /* 21 * MT safe 22 */ 23 24 #include "config.h" 25 26 #include <string.h> 27 #include <stdlib.h> /* qsort() */ 28 29 #include "gvaluetypes.h" 30 #include "gvaluecollector.h" 31 #include "gobject.h" 32 #include "gparam.h" 33 #include "gboxed.h" 34 #include "genums.h" 35 #include "gobjectalias.h" 36 37 38 /* --- value functions --- */ 39 static void 40 value_init_long0 (GValue *value) 41 { 42 value->data[0].v_long = 0; 43 } 44 45 static void 46 value_copy_long0 (const GValue *src_value, 47 GValue *dest_value) 48 { 49 dest_value->data[0].v_long = src_value->data[0].v_long; 50 } 51 52 static gchar* 53 value_lcopy_char (const GValue *value, 54 guint n_collect_values, 55 GTypeCValue *collect_values, 56 guint collect_flags) 57 { 58 gint8 *int8_p = collect_values[0].v_pointer; 59 60 if (!int8_p) 61 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); 62 63 *int8_p = value->data[0].v_int; 64 65 return NULL; 66 } 67 68 static gchar* 69 value_lcopy_boolean (const GValue *value, 70 guint n_collect_values, 71 GTypeCValue *collect_values, 72 guint collect_flags) 73 { 74 gboolean *bool_p = collect_values[0].v_pointer; 75 76 if (!bool_p) 77 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); 78 79 *bool_p = value->data[0].v_int; 80 81 return NULL; 82 } 83 84 static gchar* 85 value_collect_int (GValue *value, 86 guint n_collect_values, 87 GTypeCValue *collect_values, 88 guint collect_flags) 89 { 90 value->data[0].v_int = collect_values[0].v_int; 91 92 return NULL; 93 } 94 95 static gchar* 96 value_lcopy_int (const GValue *value, 97 guint n_collect_values, 98 GTypeCValue *collect_values, 99 guint collect_flags) 100 { 101 gint *int_p = collect_values[0].v_pointer; 102 103 if (!int_p) 104 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); 105 106 *int_p = value->data[0].v_int; 107 108 return NULL; 109 } 110 111 static gchar* 112 value_collect_long (GValue *value, 113 guint n_collect_values, 114 GTypeCValue *collect_values, 115 guint collect_flags) 116 { 117 value->data[0].v_long = collect_values[0].v_long; 118 119 return NULL; 120 } 121 122 static gchar* 123 value_lcopy_long (const GValue *value, 124 guint n_collect_values, 125 GTypeCValue *collect_values, 126 guint collect_flags) 127 { 128 glong *long_p = collect_values[0].v_pointer; 129 130 if (!long_p) 131 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); 132 133 *long_p = value->data[0].v_long; 134 135 return NULL; 136 } 137 138 static void 139 value_init_int64 (GValue *value) 140 { 141 value->data[0].v_int64 = 0; 142 } 143 144 static void 145 value_copy_int64 (const GValue *src_value, 146 GValue *dest_value) 147 { 148 dest_value->data[0].v_int64 = src_value->data[0].v_int64; 149 } 150 151 static gchar* 152 value_collect_int64 (GValue *value, 153 guint n_collect_values, 154 GTypeCValue *collect_values, 155 guint collect_flags) 156 { 157 value->data[0].v_int64 = collect_values[0].v_int64; 158 159 return NULL; 160 } 161 162 static gchar* 163 value_lcopy_int64 (const GValue *value, 164 guint n_collect_values, 165 GTypeCValue *collect_values, 166 guint collect_flags) 167 { 168 gint64 *int64_p = collect_values[0].v_pointer; 169 170 if (!int64_p) 171 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); 172 173 *int64_p = value->data[0].v_int64; 174 175 return NULL; 176 } 177 178 static void 179 value_init_float (GValue *value) 180 { 181 value->data[0].v_float = 0.0; 182 } 183 184 static void 185 value_copy_float (const GValue *src_value, 186 GValue *dest_value) 187 { 188 dest_value->data[0].v_float = src_value->data[0].v_float; 189 } 190 191 static gchar* 192 value_collect_float (GValue *value, 193 guint n_collect_values, 194 GTypeCValue *collect_values, 195 guint collect_flags) 196 { 197 value->data[0].v_float = collect_values[0].v_double; 198 199 return NULL; 200 } 201 202 static gchar* 203 value_lcopy_float (const GValue *value, 204 guint n_collect_values, 205 GTypeCValue *collect_values, 206 guint collect_flags) 207 { 208 gfloat *float_p = collect_values[0].v_pointer; 209 210 if (!float_p) 211 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); 212 213 *float_p = value->data[0].v_float; 214 215 return NULL; 216 } 217 218 static void 219 value_init_double (GValue *value) 220 { 221 value->data[0].v_double = 0.0; 222 } 223 224 static void 225 value_copy_double (const GValue *src_value, 226 GValue *dest_value) 227 { 228 dest_value->data[0].v_double = src_value->data[0].v_double; 229 } 230 231 static gchar* 232 value_collect_double (GValue *value, 233 guint n_collect_values, 234 GTypeCValue *collect_values, 235 guint collect_flags) 236 { 237 value->data[0].v_double = collect_values[0].v_double; 238 239 return NULL; 240 } 241 242 static gchar* 243 value_lcopy_double (const GValue *value, 244 guint n_collect_values, 245 GTypeCValue *collect_values, 246 guint collect_flags) 247 { 248 gdouble *double_p = collect_values[0].v_pointer; 249 250 if (!double_p) 251 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); 252 253 *double_p = value->data[0].v_double; 254 255 return NULL; 256 } 257 258 static void 259 value_init_string (GValue *value) 260 { 261 value->data[0].v_pointer = NULL; 262 } 263 264 static void 265 value_free_string (GValue *value) 266 { 267 if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)) 268 g_free (value->data[0].v_pointer); 269 } 270 271 static void 272 value_copy_string (const GValue *src_value, 273 GValue *dest_value) 274 { 275 dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer); 276 } 277 278 static gchar* 279 value_collect_string (GValue *value, 280 guint n_collect_values, 281 GTypeCValue *collect_values, 282 guint collect_flags) 283 { 284 if (!collect_values[0].v_pointer) 285 value->data[0].v_pointer = NULL; 286 else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) 287 { 288 value->data[0].v_pointer = collect_values[0].v_pointer; 289 value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS; 290 } 291 else 292 value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer); 293 294 return NULL; 295 } 296 297 static gchar* 298 value_lcopy_string (const GValue *value, 299 guint n_collect_values, 300 GTypeCValue *collect_values, 301 guint collect_flags) 302 { 303 gchar **string_p = collect_values[0].v_pointer; 304 305 if (!string_p) 306 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); 307 308 if (!value->data[0].v_pointer) 309 *string_p = NULL; 310 else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) 311 *string_p = value->data[0].v_pointer; 312 else 313 *string_p = g_strdup (value->data[0].v_pointer); 314 315 return NULL; 316 } 317 318 static void 319 value_init_pointer (GValue *value) 320 { 321 value->data[0].v_pointer = NULL; 322 } 323 324 static void 325 value_copy_pointer (const GValue *src_value, 326 GValue *dest_value) 327 { 328 dest_value->data[0].v_pointer = src_value->data[0].v_pointer; 329 } 330 331 static gpointer 332 value_peek_pointer0 (const GValue *value) 333 { 334 return value->data[0].v_pointer; 335 } 336 337 static gchar* 338 value_collect_pointer (GValue *value, 339 guint n_collect_values, 340 GTypeCValue *collect_values, 341 guint collect_flags) 342 { 343 value->data[0].v_pointer = collect_values[0].v_pointer; 344 345 return NULL; 346 } 347 348 static gchar* 349 value_lcopy_pointer (const GValue *value, 350 guint n_collect_values, 351 GTypeCValue *collect_values, 352 guint collect_flags) 353 { 354 gpointer *pointer_p = collect_values[0].v_pointer; 355 356 if (!pointer_p) 357 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); 358 359 *pointer_p = value->data[0].v_pointer; 360 361 return NULL; 362 } 363 364 365 /* --- type initialization --- */ 366 void 367 g_value_types_init (void) 368 { 369 GTypeInfo info = { 370 0, /* class_size */ 371 NULL, /* base_init */ 372 NULL, /* base_destroy */ 373 NULL, /* class_init */ 374 NULL, /* class_destroy */ 375 NULL, /* class_data */ 376 0, /* instance_size */ 377 0, /* n_preallocs */ 378 NULL, /* instance_init */ 379 NULL, /* value_table */ 380 }; 381 const GTypeFundamentalInfo finfo = { G_TYPE_FLAG_DERIVABLE, }; 382 GType type; 383 384 /* G_TYPE_CHAR / G_TYPE_UCHAR 385 */ 386 { 387 static const GTypeValueTable value_table = { 388 value_init_long0, /* value_init */ 389 NULL, /* value_free */ 390 value_copy_long0, /* value_copy */ 391 NULL, /* value_peek_pointer */ 392 "i", /* collect_format */ 393 value_collect_int, /* collect_value */ 394 "p", /* lcopy_format */ 395 value_lcopy_char, /* lcopy_value */ 396 }; 397 info.value_table = &value_table; 398 type = g_type_register_fundamental (G_TYPE_CHAR, g_intern_static_string ("gchar"), &info, &finfo, 0); 399 g_assert (type == G_TYPE_CHAR); 400 type = g_type_register_fundamental (G_TYPE_UCHAR, g_intern_static_string ("guchar"), &info, &finfo, 0); 401 g_assert (type == G_TYPE_UCHAR); 402 } 403 404 /* G_TYPE_BOOLEAN 405 */ 406 { 407 static const GTypeValueTable value_table = { 408 value_init_long0, /* value_init */ 409 NULL, /* value_free */ 410 value_copy_long0, /* value_copy */ 411 NULL, /* value_peek_pointer */ 412 "i", /* collect_format */ 413 value_collect_int, /* collect_value */ 414 "p", /* lcopy_format */ 415 value_lcopy_boolean, /* lcopy_value */ 416 }; 417 info.value_table = &value_table; 418 type = g_type_register_fundamental (G_TYPE_BOOLEAN, g_intern_static_string ("gboolean"), &info, &finfo, 0); 419 g_assert (type == G_TYPE_BOOLEAN); 420 } 421 422 /* G_TYPE_INT / G_TYPE_UINT 423 */ 424 { 425 static const GTypeValueTable value_table = { 426 value_init_long0, /* value_init */ 427 NULL, /* value_free */ 428 value_copy_long0, /* value_copy */ 429 NULL, /* value_peek_pointer */ 430 "i", /* collect_format */ 431 value_collect_int, /* collect_value */ 432 "p", /* lcopy_format */ 433 value_lcopy_int, /* lcopy_value */ 434 }; 435 info.value_table = &value_table; 436 type = g_type_register_fundamental (G_TYPE_INT, g_intern_static_string ("gint"), &info, &finfo, 0); 437 g_assert (type == G_TYPE_INT); 438 type = g_type_register_fundamental (G_TYPE_UINT, g_intern_static_string ("guint"), &info, &finfo, 0); 439 g_assert (type == G_TYPE_UINT); 440 } 441 442 /* G_TYPE_LONG / G_TYPE_ULONG 443 */ 444 { 445 static const GTypeValueTable value_table = { 446 value_init_long0, /* value_init */ 447 NULL, /* value_free */ 448 value_copy_long0, /* value_copy */ 449 NULL, /* value_peek_pointer */ 450 "l", /* collect_format */ 451 value_collect_long, /* collect_value */ 452 "p", /* lcopy_format */ 453 value_lcopy_long, /* lcopy_value */ 454 }; 455 info.value_table = &value_table; 456 type = g_type_register_fundamental (G_TYPE_LONG, g_intern_static_string ("glong"), &info, &finfo, 0); 457 g_assert (type == G_TYPE_LONG); 458 type = g_type_register_fundamental (G_TYPE_ULONG, g_intern_static_string ("gulong"), &info, &finfo, 0); 459 g_assert (type == G_TYPE_ULONG); 460 } 461 462 /* G_TYPE_INT64 / G_TYPE_UINT64 463 */ 464 { 465 static const GTypeValueTable value_table = { 466 value_init_int64, /* value_init */ 467 NULL, /* value_free */ 468 value_copy_int64, /* value_copy */ 469 NULL, /* value_peek_pointer */ 470 "q", /* collect_format */ 471 value_collect_int64, /* collect_value */ 472 "p", /* lcopy_format */ 473 value_lcopy_int64, /* lcopy_value */ 474 }; 475 info.value_table = &value_table; 476 type = g_type_register_fundamental (G_TYPE_INT64, g_intern_static_string ("gint64"), &info, &finfo, 0); 477 g_assert (type == G_TYPE_INT64); 478 type = g_type_register_fundamental (G_TYPE_UINT64, g_intern_static_string ("guint64"), &info, &finfo, 0); 479 g_assert (type == G_TYPE_UINT64); 480 } 481 482 /* G_TYPE_FLOAT 483 */ 484 { 485 static const GTypeValueTable value_table = { 486 value_init_float, /* value_init */ 487 NULL, /* value_free */ 488 value_copy_float, /* value_copy */ 489 NULL, /* value_peek_pointer */ 490 "d", /* collect_format */ 491 value_collect_float, /* collect_value */ 492 "p", /* lcopy_format */ 493 value_lcopy_float, /* lcopy_value */ 494 }; 495 info.value_table = &value_table; 496 type = g_type_register_fundamental (G_TYPE_FLOAT, g_intern_static_string ("gfloat"), &info, &finfo, 0); 497 g_assert (type == G_TYPE_FLOAT); 498 } 499 500 /* G_TYPE_DOUBLE 501 */ 502 { 503 static const GTypeValueTable value_table = { 504 value_init_double, /* value_init */ 505 NULL, /* value_free */ 506 value_copy_double, /* value_copy */ 507 NULL, /* value_peek_pointer */ 508 "d", /* collect_format */ 509 value_collect_double, /* collect_value */ 510 "p", /* lcopy_format */ 511 value_lcopy_double, /* lcopy_value */ 512 }; 513 info.value_table = &value_table; 514 type = g_type_register_fundamental (G_TYPE_DOUBLE, g_intern_static_string ("gdouble"), &info, &finfo, 0); 515 g_assert (type == G_TYPE_DOUBLE); 516 } 517 518 /* G_TYPE_STRING 519 */ 520 { 521 static const GTypeValueTable value_table = { 522 value_init_string, /* value_init */ 523 value_free_string, /* value_free */ 524 value_copy_string, /* value_copy */ 525 value_peek_pointer0, /* value_peek_pointer */ 526 "p", /* collect_format */ 527 value_collect_string, /* collect_value */ 528 "p", /* lcopy_format */ 529 value_lcopy_string, /* lcopy_value */ 530 }; 531 info.value_table = &value_table; 532 type = g_type_register_fundamental (G_TYPE_STRING, g_intern_static_string ("gchararray"), &info, &finfo, 0); 533 g_assert (type == G_TYPE_STRING); 534 } 535 536 /* G_TYPE_POINTER 537 */ 538 { 539 static const GTypeValueTable value_table = { 540 value_init_pointer, /* value_init */ 541 NULL, /* value_free */ 542 value_copy_pointer, /* value_copy */ 543 value_peek_pointer0, /* value_peek_pointer */ 544 "p", /* collect_format */ 545 value_collect_pointer, /* collect_value */ 546 "p", /* lcopy_format */ 547 value_lcopy_pointer, /* lcopy_value */ 548 }; 549 info.value_table = &value_table; 550 type = g_type_register_fundamental (G_TYPE_POINTER, g_intern_static_string ("gpointer"), &info, &finfo, 0); 551 g_assert (type == G_TYPE_POINTER); 552 } 553 } 554 555 556 /* --- GValue functions --- */ 557 /** 558 * g_value_set_char: 559 * @value: a valid #GValue of type %G_TYPE_CHAR 560 * @v_char: character value to be set 561 * 562 * Set the contents of a %G_TYPE_CHAR #GValue to @v_char. 563 */ 564 void 565 g_value_set_char (GValue *value, 566 gchar v_char) 567 { 568 g_return_if_fail (G_VALUE_HOLDS_CHAR (value)); 569 570 value->data[0].v_int = v_char; 571 } 572 573 /** 574 * g_value_get_char: 575 * @value: a valid #GValue of type %G_TYPE_CHAR 576 * 577 * Get the contents of a %G_TYPE_CHAR #GValue. 578 * 579 * Returns: character contents of @value 580 */ 581 gchar 582 g_value_get_char (const GValue *value) 583 { 584 g_return_val_if_fail (G_VALUE_HOLDS_CHAR (value), 0); 585 586 return value->data[0].v_int; 587 } 588 589 /** 590 * g_value_set_uchar: 591 * @value: a valid #GValue of type %G_TYPE_UCHAR 592 * @v_uchar: unsigned character value to be set 593 * 594 * Set the contents of a %G_TYPE_UCHAR #GValue to @v_uchar. 595 */ 596 void 597 g_value_set_uchar (GValue *value, 598 guchar v_uchar) 599 { 600 g_return_if_fail (G_VALUE_HOLDS_UCHAR (value)); 601 602 value->data[0].v_uint = v_uchar; 603 } 604 605 /** 606 * g_value_get_uchar: 607 * @value: a valid #GValue of type %G_TYPE_UCHAR 608 * 609 * Get the contents of a %G_TYPE_UCHAR #GValue. 610 * 611 * Returns: unsigned character contents of @value 612 */ 613 guchar 614 g_value_get_uchar (const GValue *value) 615 { 616 g_return_val_if_fail (G_VALUE_HOLDS_UCHAR (value), 0); 617 618 return value->data[0].v_uint; 619 } 620 621 /** 622 * g_value_set_boolean: 623 * @value: a valid #GValue of type %G_TYPE_BOOLEAN 624 * @v_boolean: boolean value to be set 625 * 626 * Set the contents of a %G_TYPE_BOOLEAN #GValue to @v_boolean. 627 */ 628 void 629 g_value_set_boolean (GValue *value, 630 gboolean v_boolean) 631 { 632 g_return_if_fail (G_VALUE_HOLDS_BOOLEAN (value)); 633 634 value->data[0].v_int = v_boolean != FALSE; 635 } 636 637 /** 638 * g_value_get_boolean: 639 * @value: a valid #GValue of type %G_TYPE_BOOLEAN 640 * 641 * Get the contents of a %G_TYPE_BOOLEAN #GValue. 642 * 643 * Returns: boolean contents of @value 644 */ 645 gboolean 646 g_value_get_boolean (const GValue *value) 647 { 648 g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (value), 0); 649 650 return value->data[0].v_int; 651 } 652 653 /** 654 * g_value_set_int: 655 * @value: a valid #GValue of type %G_TYPE_INT 656 * @v_int: integer value to be set 657 * 658 * Set the contents of a %G_TYPE_INT #GValue to @v_int. 659 */ 660 void 661 g_value_set_int (GValue *value, 662 gint v_int) 663 { 664 g_return_if_fail (G_VALUE_HOLDS_INT (value)); 665 666 value->data[0].v_int = v_int; 667 } 668 669 /** 670 * g_value_get_int: 671 * @value: a valid #GValue of type %G_TYPE_INT 672 * 673 * Get the contents of a %G_TYPE_INT #GValue. 674 * 675 * Returns: integer contents of @value 676 */ 677 gint 678 g_value_get_int (const GValue *value) 679 { 680 g_return_val_if_fail (G_VALUE_HOLDS_INT (value), 0); 681 682 return value->data[0].v_int; 683 } 684 685 /** 686 * g_value_set_uint: 687 * @value: a valid #GValue of type %G_TYPE_UINT 688 * @v_uint: unsigned integer value to be set 689 * 690 * Set the contents of a %G_TYPE_UINT #GValue to @v_uint. 691 */ 692 void 693 g_value_set_uint (GValue *value, 694 guint v_uint) 695 { 696 g_return_if_fail (G_VALUE_HOLDS_UINT (value)); 697 698 value->data[0].v_uint = v_uint; 699 } 700 701 /** 702 * g_value_get_uint: 703 * @value: a valid #GValue of type %G_TYPE_UINT 704 * 705 * Get the contents of a %G_TYPE_UINT #GValue. 706 * 707 * Returns: unsigned integer contents of @value 708 */ 709 guint 710 g_value_get_uint (const GValue *value) 711 { 712 g_return_val_if_fail (G_VALUE_HOLDS_UINT (value), 0); 713 714 return value->data[0].v_uint; 715 } 716 717 /** 718 * g_value_set_long: 719 * @value: a valid #GValue of type %G_TYPE_LONG 720 * @v_long: long integer value to be set 721 * 722 * Set the contents of a %G_TYPE_LONG #GValue to @v_long. 723 */ 724 void 725 g_value_set_long (GValue *value, 726 glong v_long) 727 { 728 g_return_if_fail (G_VALUE_HOLDS_LONG (value)); 729 730 value->data[0].v_long = v_long; 731 } 732 733 /** 734 * g_value_get_long: 735 * @value: a valid #GValue of type %G_TYPE_LONG 736 * 737 * Get the contents of a %G_TYPE_LONG #GValue. 738 * 739 * Returns: long integer contents of @value 740 */ 741 glong 742 g_value_get_long (const GValue *value) 743 { 744 g_return_val_if_fail (G_VALUE_HOLDS_LONG (value), 0); 745 746 return value->data[0].v_long; 747 } 748 749 /** 750 * g_value_set_ulong: 751 * @value: a valid #GValue of type %G_TYPE_ULONG 752 * @v_ulong: unsigned long integer value to be set 753 * 754 * Set the contents of a %G_TYPE_ULONG #GValue to @v_ulong. 755 */ 756 void 757 g_value_set_ulong (GValue *value, 758 gulong v_ulong) 759 { 760 g_return_if_fail (G_VALUE_HOLDS_ULONG (value)); 761 762 value->data[0].v_ulong = v_ulong; 763 } 764 765 /** 766 * g_value_get_ulong: 767 * @value: a valid #GValue of type %G_TYPE_ULONG 768 * 769 * Get the contents of a %G_TYPE_ULONG #GValue. 770 * 771 * Returns: unsigned long integer contents of @value 772 */ 773 gulong 774 g_value_get_ulong (const GValue *value) 775 { 776 g_return_val_if_fail (G_VALUE_HOLDS_ULONG (value), 0); 777 778 return value->data[0].v_ulong; 779 } 780 781 /** 782 * g_value_get_int64: 783 * @value: a valid #GValue of type %G_TYPE_INT64 784 * 785 * Get the contents of a %G_TYPE_INT64 #GValue. 786 * 787 * Returns: 64bit integer contents of @value 788 */ 789 void 790 g_value_set_int64 (GValue *value, 791 gint64 v_int64) 792 { 793 g_return_if_fail (G_VALUE_HOLDS_INT64 (value)); 794 795 value->data[0].v_int64 = v_int64; 796 } 797 798 /** 799 * g_value_set_int64: 800 * @value: a valid #GValue of type %G_TYPE_INT64 801 * @v_int64: 64bit integer value to be set 802 * 803 * Set the contents of a %G_TYPE_INT64 #GValue to @v_int64. 804 */ 805 gint64 806 g_value_get_int64 (const GValue *value) 807 { 808 g_return_val_if_fail (G_VALUE_HOLDS_INT64 (value), 0); 809 810 return value->data[0].v_int64; 811 } 812 813 /** 814 * g_value_set_uint64: 815 * @value: a valid #GValue of type %G_TYPE_UINT64 816 * @v_uint64: unsigned 64bit integer value to be set 817 * 818 * Set the contents of a %G_TYPE_UINT64 #GValue to @v_uint64. 819 */ 820 void 821 g_value_set_uint64 (GValue *value, 822 guint64 v_uint64) 823 { 824 g_return_if_fail (G_VALUE_HOLDS_UINT64 (value)); 825 826 value->data[0].v_uint64 = v_uint64; 827 } 828 829 /** 830 * g_value_get_uint64: 831 * @value: a valid #GValue of type %G_TYPE_UINT64 832 * 833 * Get the contents of a %G_TYPE_UINT64 #GValue. 834 * 835 * Returns: unsigned 64bit integer contents of @value 836 */ 837 guint64 838 g_value_get_uint64 (const GValue *value) 839 { 840 g_return_val_if_fail (G_VALUE_HOLDS_UINT64 (value), 0); 841 842 return value->data[0].v_uint64; 843 } 844 845 /** 846 * g_value_set_float: 847 * @value: a valid #GValue of type %G_TYPE_FLOAT 848 * @v_float: float value to be set 849 * 850 * Set the contents of a %G_TYPE_FLOAT #GValue to @v_float. 851 */ 852 void 853 g_value_set_float (GValue *value, 854 gfloat v_float) 855 { 856 g_return_if_fail (G_VALUE_HOLDS_FLOAT (value)); 857 858 value->data[0].v_float = v_float; 859 } 860 861 /** 862 * g_value_get_float: 863 * @value: a valid #GValue of type %G_TYPE_FLOAT 864 * 865 * Get the contents of a %G_TYPE_FLOAT #GValue. 866 * 867 * Returns: float contents of @value 868 */ 869 gfloat 870 g_value_get_float (const GValue *value) 871 { 872 g_return_val_if_fail (G_VALUE_HOLDS_FLOAT (value), 0); 873 874 return value->data[0].v_float; 875 } 876 877 /** 878 * g_value_set_double: 879 * @value: a valid #GValue of type %G_TYPE_DOUBLE 880 * @v_double: double value to be set 881 * 882 * Set the contents of a %G_TYPE_DOUBLE #GValue to @v_double. 883 */ 884 void 885 g_value_set_double (GValue *value, 886 gdouble v_double) 887 { 888 g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value)); 889 890 value->data[0].v_double = v_double; 891 } 892 893 /** 894 * g_value_get_double: 895 * @value: a valid #GValue of type %G_TYPE_DOUBLE 896 * 897 * Get the contents of a %G_TYPE_DOUBLE #GValue. 898 * 899 * Returns: double contents of @value 900 */ 901 gdouble 902 g_value_get_double (const GValue *value) 903 { 904 g_return_val_if_fail (G_VALUE_HOLDS_DOUBLE (value), 0); 905 906 return value->data[0].v_double; 907 } 908 909 /** 910 * g_value_set_string: 911 * @value: a valid #GValue of type %G_TYPE_STRING 912 * @v_string: caller-owned string to be duplicated for the #GValue 913 * 914 * Set the contents of a %G_TYPE_STRING #GValue to @v_string. 915 */ 916 void 917 g_value_set_string (GValue *value, 918 const gchar *v_string) 919 { 920 gchar *new_val; 921 922 g_return_if_fail (G_VALUE_HOLDS_STRING (value)); 923 924 new_val = g_strdup (v_string); 925 926 if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) 927 value->data[1].v_uint = 0; 928 else 929 g_free (value->data[0].v_pointer); 930 931 value->data[0].v_pointer = new_val; 932 } 933 934 /** 935 * g_value_set_static_string: 936 * @value: a valid #GValue of type %G_TYPE_STRING 937 * @v_string: static string to be set 938 * 939 * Set the contents of a %G_TYPE_STRING #GValue to @v_string. 940 * The string is assumed to be static, and is thus not duplicated 941 * when setting the #GValue. 942 */ 943 void 944 g_value_set_static_string (GValue *value, 945 const gchar *v_string) 946 { 947 g_return_if_fail (G_VALUE_HOLDS_STRING (value)); 948 949 if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)) 950 g_free (value->data[0].v_pointer); 951 value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS; 952 value->data[0].v_pointer = (gchar*) v_string; 953 } 954 955 /** 956 * g_value_set_string_take_ownership: 957 * @value: a valid #GValue of type %G_TYPE_STRING 958 * @v_string: duplicated unowned string to be set 959 * 960 * This is an internal function introduced mainly for C marshallers. 961 * 962 * Deprecated: 2.4: Use g_value_take_string() instead. 963 */ 964 void 965 g_value_set_string_take_ownership (GValue *value, 966 gchar *v_string) 967 { 968 g_value_take_string (value, v_string); 969 } 970 971 /** 972 * g_value_take_string: 973 * @value: a valid #GValue of type %G_TYPE_STRING 974 * @v_string: string to take ownership of 975 * 976 * Sets the contents of a %G_TYPE_STRING #GValue to @v_string. 977 * 978 * Since: 2.4 979 */ 980 void 981 g_value_take_string (GValue *value, 982 gchar *v_string) 983 { 984 g_return_if_fail (G_VALUE_HOLDS_STRING (value)); 985 986 if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) 987 value->data[1].v_uint = 0; 988 else 989 g_free (value->data[0].v_pointer); 990 value->data[0].v_pointer = v_string; 991 } 992 993 /** 994 * g_value_get_string: 995 * @value: a valid #GValue of type %G_TYPE_STRING 996 * 997 * Get the contents of a %G_TYPE_STRING #GValue. 998 * 999 * Returns: string content of @value 1000 */ 1001 G_CONST_RETURN gchar* 1002 g_value_get_string (const GValue *value) 1003 { 1004 g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL); 1005 1006 return value->data[0].v_pointer; 1007 } 1008 1009 /** 1010 * g_value_dup_string: 1011 * @value: a valid #GValue of type %G_TYPE_STRING 1012 * 1013 * Get a copy the contents of a %G_TYPE_STRING #GValue. 1014 * 1015 * Returns: a newly allocated copy of the string content of @value 1016 */ 1017 gchar* 1018 g_value_dup_string (const GValue *value) 1019 { 1020 g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL); 1021 1022 return g_strdup (value->data[0].v_pointer); 1023 } 1024 1025 /** 1026 * g_value_set_pointer: 1027 * @value: a valid #GValue of %G_TYPE_POINTER 1028 * @v_pointer: pointer value to be set 1029 * 1030 * Set the contents of a pointer #GValue to @v_pointer. 1031 */ 1032 void 1033 g_value_set_pointer (GValue *value, 1034 gpointer v_pointer) 1035 { 1036 g_return_if_fail (G_VALUE_HOLDS_POINTER (value)); 1037 1038 value->data[0].v_pointer = v_pointer; 1039 } 1040 1041 /** 1042 * g_value_get_pointer: 1043 * @value: a valid #GValue of %G_TYPE_POINTER 1044 * 1045 * Get the contents of a pointer #GValue. 1046 * 1047 * Returns: pointer contents of @value 1048 */ 1049 gpointer 1050 g_value_get_pointer (const GValue *value) 1051 { 1052 g_return_val_if_fail (G_VALUE_HOLDS_POINTER (value), NULL); 1053 1054 return value->data[0].v_pointer; 1055 } 1056 1057 GType 1058 g_gtype_get_type (void) 1059 { 1060 static const GTypeInfo type_info = { 0, }; 1061 static GType type; 1062 if (!type) 1063 type = g_type_register_static (G_TYPE_POINTER, g_intern_static_string ("GType"), &type_info, 0); 1064 return type; 1065 } 1066 1067 /** 1068 * g_value_set_gtype: 1069 * @value: a valid #GValue of type %G_TYPE_GTYPE 1070 * @v_gtype: #GType to be set 1071 * 1072 * Set the contents of a %G_TYPE_GTYPE #GValue to @v_gtype. 1073 * 1074 * Since: 2.12 1075 */ 1076 void 1077 g_value_set_gtype (GValue *value, 1078 GType v_gtype) 1079 { 1080 g_return_if_fail (G_VALUE_HOLDS_GTYPE (value)); 1081 1082 value->data[0].v_long = v_gtype; 1083 1084 } 1085 1086 /** 1087 * g_value_get_gtype: 1088 * @value: a valid #GValue of type %G_TYPE_GTYPE 1089 * 1090 * Get the contents of a %G_TYPE_GTYPE #GValue. 1091 * 1092 * Since: 2.12 1093 * 1094 * Returns: the #GType stored in @value 1095 */ 1096 GType 1097 g_value_get_gtype (const GValue *value) 1098 { 1099 g_return_val_if_fail (G_VALUE_HOLDS_GTYPE (value), 0); 1100 1101 return value->data[0].v_long; 1102 } 1103 1104 /** 1105 * g_strdup_value_contents: 1106 * @value: #GValue which contents are to be described. 1107 * 1108 * Return a newly allocated string, which describes the contents of a 1109 * #GValue. The main purpose of this function is to describe #GValue 1110 * contents for debugging output, the way in which the contents are 1111 * described may change between different GLib versions. 1112 * 1113 * Returns: Newly allocated string. 1114 */ 1115 gchar* 1116 g_strdup_value_contents (const GValue *value) 1117 { 1118 const gchar *src; 1119 gchar *contents; 1120 1121 g_return_val_if_fail (G_IS_VALUE (value), NULL); 1122 1123 if (G_VALUE_HOLDS_STRING (value)) 1124 { 1125 src = g_value_get_string (value); 1126 1127 if (!src) 1128 contents = g_strdup ("NULL"); 1129 else 1130 { 1131 gchar *s = g_strescape (src, NULL); 1132 1133 contents = g_strdup_printf ("\"%s\"", s); 1134 g_free (s); 1135 } 1136 } 1137 else if (g_value_type_transformable (G_VALUE_TYPE (value), G_TYPE_STRING)) 1138 { 1139 GValue tmp_value = { 0, }; 1140 gchar *s; 1141 1142 g_value_init (&tmp_value, G_TYPE_STRING); 1143 g_value_transform (value, &tmp_value); 1144 s = g_strescape (g_value_get_string (&tmp_value), NULL); 1145 g_value_unset (&tmp_value); 1146 if (G_VALUE_HOLDS_ENUM (value) || G_VALUE_HOLDS_FLAGS (value)) 1147 contents = g_strdup_printf ("((%s) %s)", 1148 g_type_name (G_VALUE_TYPE (value)), 1149 s); 1150 else 1151 contents = g_strdup (s ? s : "NULL"); 1152 g_free (s); 1153 } 1154 else if (g_value_fits_pointer (value)) 1155 { 1156 gpointer p = g_value_peek_pointer (value); 1157 1158 if (!p) 1159 contents = g_strdup ("NULL"); 1160 else if (G_VALUE_HOLDS_OBJECT (value)) 1161 contents = g_strdup_printf ("((%s*) %p)", G_OBJECT_TYPE_NAME (p), p); 1162 else if (G_VALUE_HOLDS_PARAM (value)) 1163 contents = g_strdup_printf ("((%s*) %p)", G_PARAM_SPEC_TYPE_NAME (p), p); 1164 else if (G_VALUE_HOLDS_BOXED (value)) 1165 contents = g_strdup_printf ("((%s*) %p)", g_type_name (G_VALUE_TYPE (value)), p); 1166 else if (G_VALUE_HOLDS_POINTER (value)) 1167 contents = g_strdup_printf ("((gpointer) %p)", p); 1168 else 1169 contents = g_strdup ("???"); 1170 } 1171 else 1172 contents = g_strdup ("???"); 1173 1174 return contents; 1175 } 1176 1177 /** 1178 * g_pointer_type_register_static: 1179 * @name: the name of the new pointer type. 1180 * 1181 * Creates a new %G_TYPE_POINTER derived type id for a new 1182 * pointer type with name @name. 1183 * 1184 * Returns: a new %G_TYPE_POINTER derived type id for @name. 1185 */ 1186 GType 1187 g_pointer_type_register_static (const gchar *name) 1188 { 1189 static const GTypeInfo type_info = { 1190 0, /* class_size */ 1191 NULL, /* base_init */ 1192 NULL, /* base_finalize */ 1193 NULL, /* class_init */ 1194 NULL, /* class_finalize */ 1195 NULL, /* class_data */ 1196 0, /* instance_size */ 1197 0, /* n_preallocs */ 1198 NULL, /* instance_init */ 1199 NULL /* value_table */ 1200 }; 1201 GType type; 1202 1203 g_return_val_if_fail (name != NULL, 0); 1204 g_return_val_if_fail (g_type_from_name (name) == 0, 0); 1205 1206 type = g_type_register_static (G_TYPE_POINTER, name, &type_info, 0); 1207 1208 return type; 1209 } 1210 1211 #define __G_VALUETYPES_C__ 1212 #include "gobjectaliasdef.c" 1213