gvaluecollector.inc 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // included by glib2.pas
  2. {$IFDEF read_forward_definitions}
  3. { vararg union holding actuall values collected
  4. }
  5. PGTypeCValue = ^TGTypeCValue;
  6. TGTypeCValue = record
  7. case longint of
  8. 0 : ( v_int : gint );
  9. 1 : ( v_long : glong );
  10. 2 : ( v_int64 : gint64 );
  11. 3 : ( v_double : gdouble );
  12. 4 : ( v_pointer : gpointer );
  13. end;
  14. {$ENDIF read_forward_definitions}
  15. //------------------------------------------------------------------------------
  16. {$IFDEF read_interface_rest}
  17. { we may want to add aggregate types here some day, if requested
  18. by users. the basic C types are covered already, everything
  19. smaller than an int is promoted to an integer and floats are
  20. always promoted to doubles for varargs call constructions.
  21. }
  22. {< skip > }
  23. const
  24. G_VALUE_COLLECT_INT = 'i';
  25. G_VALUE_COLLECT_LONG = 'l';
  26. G_VALUE_COLLECT_INT64 = 'q';
  27. G_VALUE_COLLECT_DOUBLE = 'd';
  28. G_VALUE_COLLECT_POINTER = 'p';
  29. { G_VALUE_COLLECT() collects a variable argument value
  30. from a va_list. we have to implement the varargs collection as a
  31. macro, because on some systems va_list variables cannot be passed
  32. by reference.
  33. value is supposed to be initialized according to the value
  34. type to be collected.
  35. var_args is the va_list variable and may be evaluated multiple times.
  36. __error is a gchar variable that will be modified to hold a g_new()
  37. allocated error messages if something fails.
  38. }
  39. (* ToDo: #define G_VALUE_COLLECT(value, var_args, flags, __error) \
  40. G_STMT_START { \
  41. GValue _value = (value); \
  42. guint _flags = (flags); \
  43. GType _value_type = G_VALUE_TYPE (_value); \
  44. GTypeValueTable _vtable = g_type_value_table_peek (_value_type); \
  45. gchar _collect_format = _vtable->collect_format; \
  46. GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, }; \
  47. guint _n_values = 0; \
  48. \
  49. if (_vtable->value_free) \
  50. _vtable->value_free (_value); \
  51. _value->g_type = _value_type; // value_meminit() from gvalue.c \
  52. memset (_value->data, 0, sizeof (_value->data)); \
  53. while ( _collect_format) \
  54. { \
  55. GTypeCValue _cvalue = _cvalues + _n_values++; \
  56. \
  57. switch ( _collect_format++) \
  58. { \
  59. case G_VALUE_COLLECT_INT: \
  60. _cvalue->v_int = va_arg ((var_args), gint); \
  61. break; \
  62. case G_VALUE_COLLECT_LONG: \
  63. _cvalue->v_long = va_arg ((var_args), glong); \
  64. break; \
  65. case G_VALUE_COLLECT_INT64: \
  66. _cvalue->v_int64 = va_arg ((var_args), gint64); \
  67. break; \
  68. case G_VALUE_COLLECT_DOUBLE: \
  69. _cvalue->v_double = va_arg ((var_args), gdouble); \
  70. break; \
  71. case G_VALUE_COLLECT_POINTER: \
  72. _cvalue->v_pointer = va_arg ((var_args), gpointer); \
  73. break; \
  74. default: \
  75. g_assert_not_reached (); \
  76. } \
  77. } \
  78. (__error) = _vtable->collect_value (_value, \
  79. _n_values, \
  80. _cvalues, \
  81. _flags); \
  82. } G_STMT_END
  83. *)
  84. { G_VALUE_LCOPY() collects a value's variable argument
  85. locations from a va_list. usage is analogous to G_VALUE_COLLECT().
  86. }
  87. (* ToDo: #define G_VALUE_LCOPY(value, var_args, flags, __error) \
  88. G_STMT_START { \
  89. const GValue _value = (value); \
  90. guint _flags = (flags); \
  91. GType _value_type = G_VALUE_TYPE (_value); \
  92. GTypeValueTable _vtable = g_type_value_table_peek (_value_type); \
  93. gchar _lcopy_format = _vtable->lcopy_format; \
  94. GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, }; \
  95. guint _n_values = 0; \
  96. \
  97. while ( _lcopy_format) \
  98. { \
  99. GTypeCValue _cvalue = _cvalues + _n_values++; \
  100. \
  101. switch ( _lcopy_format++) \
  102. { \
  103. case G_VALUE_COLLECT_INT: \
  104. _cvalue->v_int = va_arg ((var_args), gint); \
  105. break; \
  106. case G_VALUE_COLLECT_LONG: \
  107. _cvalue->v_long = va_arg ((var_args), glong); \
  108. break; \
  109. case G_VALUE_COLLECT_INT64: \
  110. _cvalue->v_int64 = va_arg ((var_args), gint64); \
  111. break; \
  112. case G_VALUE_COLLECT_DOUBLE: \
  113. _cvalue->v_double = va_arg ((var_args), gdouble); \
  114. break; \
  115. case G_VALUE_COLLECT_POINTER: \
  116. _cvalue->v_pointer = va_arg ((var_args), gpointer); \
  117. break; \
  118. default: \
  119. g_assert_not_reached (); \
  120. } \
  121. } \
  122. (__error) = _vtable->lcopy_value (_value, \
  123. _n_values, \
  124. _cvalues, \
  125. _flags); \
  126. } G_STMT_END
  127. *)
  128. const
  129. G_VALUE_COLLECT_FORMAT_MAX_LENGTH = 8;
  130. {$ENDIF read_interface_rest}
  131. // included by glib2.pas