main.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<glib-object.h>
  4. #include"marshaller.h"
  5. static int singleton = 42;
  6. void foo(gpointer user_data, gpointer data) {
  7. if (user_data != &singleton) {
  8. fprintf(stderr, "Invoked foo function was passed incorrect user data.\n");
  9. exit(1);
  10. }
  11. }
  12. void bar(gpointer user_data, gint param1, gpointer data) {
  13. if (param1 != singleton) {
  14. fprintf(stderr, "Invoked bar function was passed incorrect param1, but %d.\n", param1);
  15. exit(2);
  16. }
  17. if (user_data != &singleton) {
  18. fprintf(stderr, "Invoked bar function was passed incorrect user data.\n");
  19. exit(3);
  20. }
  21. }
  22. gfloat baz(gpointer user_data, gboolean param1, guchar param2, gpointer data) {
  23. if (param1 != TRUE) {
  24. fprintf(stderr, "Invoked baz function was passed incorrect param1.\n");
  25. exit(4);
  26. }
  27. if (param2 != singleton) {
  28. fprintf(stderr, "Invoked baz function was passed incorrect param2.\n");
  29. exit(5);
  30. }
  31. if (user_data != &singleton) {
  32. fprintf(stderr, "Invoked baz function was passed incorrect user data.\n");
  33. exit(6);
  34. }
  35. return (gfloat)param2;
  36. }
  37. int main(int argc, char **argv) {
  38. GClosure *cc_foo, *cc_bar, *cc_baz;
  39. GValue return_value = G_VALUE_INIT;
  40. GValue param_values[3] = {G_VALUE_INIT, G_VALUE_INIT, G_VALUE_INIT};
  41. fprintf(stderr, "Invoking foo function.\n");
  42. cc_foo = g_cclosure_new(G_CALLBACK(foo), NULL, NULL);
  43. g_closure_set_marshal(cc_foo, g_cclosure_user_marshal_VOID__VOID);
  44. g_value_init(&param_values[0], G_TYPE_POINTER);
  45. g_value_set_pointer(&param_values[0], &singleton);
  46. g_closure_invoke(cc_foo, &return_value, 1, param_values, NULL);
  47. if (G_VALUE_TYPE(&return_value) != G_TYPE_INVALID) {
  48. fprintf(stderr, "Invoked foo function did not return empty value, but %s.\n",
  49. G_VALUE_TYPE_NAME(&return_value));
  50. return 7;
  51. }
  52. g_value_unset(&param_values[0]);
  53. g_value_unset(&return_value);
  54. g_closure_unref(cc_foo);
  55. fprintf(stderr, "Invoking bar function.\n");
  56. cc_bar = g_cclosure_new(G_CALLBACK(bar), NULL, NULL);
  57. g_closure_set_marshal(cc_bar, g_cclosure_user_marshal_VOID__INT);
  58. g_value_init(&param_values[0], G_TYPE_POINTER);
  59. g_value_set_pointer(&param_values[0], &singleton);
  60. g_value_init(&param_values[1], G_TYPE_INT);
  61. g_value_set_int(&param_values[1], 42);
  62. g_closure_invoke(cc_bar, &return_value, 2, param_values, NULL);
  63. if (G_VALUE_TYPE(&return_value) != G_TYPE_INVALID) {
  64. fprintf(stderr, "Invoked bar function did not return empty value.\n");
  65. return 8;
  66. }
  67. g_value_unset(&param_values[0]);
  68. g_value_unset(&param_values[1]);
  69. g_value_unset(&return_value);
  70. g_closure_unref(cc_bar);
  71. fprintf(stderr, "Invoking baz function.\n");
  72. cc_baz = g_cclosure_new(G_CALLBACK(baz), NULL, NULL);
  73. g_closure_set_marshal(cc_baz, g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR);
  74. g_value_init(&param_values[0], G_TYPE_POINTER);
  75. g_value_set_pointer(&param_values[0], &singleton);
  76. g_value_init(&param_values[1], G_TYPE_BOOLEAN);
  77. g_value_set_boolean(&param_values[1], TRUE);
  78. g_value_init(&param_values[2], G_TYPE_UCHAR);
  79. g_value_set_uchar(&param_values[2], 42);
  80. g_value_init(&return_value, G_TYPE_FLOAT);
  81. g_closure_invoke(cc_baz, &return_value, 3, param_values, NULL);
  82. if (g_value_get_float(&return_value) != 42.0f) {
  83. fprintf(stderr, "Invoked baz function did not return expected value.\n");
  84. return 9;
  85. }
  86. g_value_unset(&param_values[0]);
  87. g_value_unset(&param_values[1]);
  88. g_value_unset(&param_values[2]);
  89. g_value_unset(&return_value);
  90. g_closure_unref(cc_baz);
  91. fprintf(stderr, "All ok.\n");
  92. return 0;
  93. }