2
0

gvaluecollector.inc 8.9 KB

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