glib2 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/ext/glib2/extconf.rb +1 -0
  2. data/ext/glib2/glib2.def +23 -0
  3. data/ext/glib2/rbgcompat.h +19 -5
  4. data/ext/glib2/rbglib.c +607 -160
  5. data/ext/glib2/rbglib.h +81 -26
  6. data/ext/glib2/rbglib2conversions.h +57 -0
  7. data/ext/glib2/rbglib_bookmarkfile.c +117 -107
  8. data/ext/glib2/rbglib_completion.c +37 -26
  9. data/ext/glib2/rbglib_convert.c +42 -30
  10. data/ext/glib2/rbglib_error.c +20 -10
  11. data/ext/glib2/rbglib_fileutils.c +48 -37
  12. data/ext/glib2/rbglib_i18n.c +24 -14
  13. data/ext/glib2/rbglib_int64.c +24 -16
  14. data/ext/glib2/rbglib_iochannel.c +146 -204
  15. data/ext/glib2/rbglib_iochannel_win32_socket.c +56 -0
  16. data/ext/glib2/rbglib_iochannelerror.c +49 -0
  17. data/ext/glib2/rbglib_keyfile.c +171 -182
  18. data/ext/glib2/rbglib_maincontext.c +107 -92
  19. data/ext/glib2/rbglib_mainloop.c +34 -21
  20. data/ext/glib2/rbglib_messages.c +53 -44
  21. data/ext/glib2/rbglib_pollfd.c +37 -26
  22. data/ext/glib2/rbglib_shell.c +29 -22
  23. data/ext/glib2/rbglib_shellerror.c +34 -0
  24. data/ext/glib2/rbglib_source.c +49 -36
  25. data/ext/glib2/rbglib_spawn.c +50 -61
  26. data/ext/glib2/rbglib_spawnerror.c +53 -0
  27. data/ext/glib2/rbglib_threads.c +28 -16
  28. data/ext/glib2/rbglib_timer.c +35 -24
  29. data/ext/glib2/rbglib_ucs4.c +79 -0
  30. data/ext/glib2/rbglib_unichar.c +209 -0
  31. data/ext/glib2/rbglib_unicode.c +34 -584
  32. data/ext/glib2/rbglib_utf16.c +78 -0
  33. data/ext/glib2/rbglib_utf8.c +259 -0
  34. data/ext/glib2/rbglib_utils.c +95 -91
  35. data/ext/glib2/rbglib_win32.c +52 -45
  36. data/ext/glib2/rbglibdeprecated.c +56 -0
  37. data/ext/glib2/rbglibdeprecated.h +34 -0
  38. data/ext/glib2/rbgobj_boxed.c +40 -33
  39. data/ext/glib2/rbgobj_closure.c +45 -34
  40. data/ext/glib2/rbgobj_convert.c +19 -9
  41. data/ext/glib2/rbgobj_enumflags.c +109 -0
  42. data/ext/glib2/rbgobj_enums.c +67 -646
  43. data/ext/glib2/rbgobj_flags.c +522 -0
  44. data/ext/glib2/rbgobj_fundamental.c +19 -6
  45. data/ext/glib2/rbgobj_object.c +90 -81
  46. data/ext/glib2/rbgobj_param.c +78 -83
  47. data/ext/glib2/rbgobj_paramspecs.c +20 -12
  48. data/ext/glib2/rbgobj_signal.c +248 -193
  49. data/ext/glib2/rbgobj_strv.c +20 -10
  50. data/ext/glib2/rbgobj_type.c +153 -149
  51. data/ext/glib2/rbgobj_typeinstance.c +49 -39
  52. data/ext/glib2/rbgobj_typeinterface.c +37 -27
  53. data/ext/glib2/rbgobj_typemodule.c +39 -29
  54. data/ext/glib2/rbgobj_typeplugin.c +36 -26
  55. data/ext/glib2/rbgobj_value.c +41 -11
  56. data/ext/glib2/rbgobj_valuearray.c +59 -23
  57. data/ext/glib2/rbgobj_valuetypes.c +27 -17
  58. data/ext/glib2/rbgobject.c +26 -40
  59. data/ext/glib2/rbgobject.h +38 -20
  60. data/ext/glib2/rbgprivate.h +87 -5
  61. data/ext/glib2/rbgutil.c +52 -238
  62. data/ext/glib2/rbgutil.h +55 -42
  63. data/ext/glib2/rbgutil_callback.c +47 -12
  64. data/ext/glib2/rbgutil_list.c +173 -0
  65. data/ext/glib2/rbgutil_list.h +85 -0
  66. data/ext/glib2/rbgutildeprecated.c +252 -0
  67. data/ext/glib2/rbgutildeprecated.h +63 -0
  68. data/lib/glib-mkenums.rb +2 -2
  69. data/lib/glib2.rb +2 -25
  70. data/lib/glib2/deprecatable.rb +149 -0
  71. data/lib/gnome2-raketask.rb +45 -15
  72. data/lib/gnome2-win32-binary-downloader.rb +1 -1
  73. data/lib/mkmf-gnome2.rb +37 -18
  74. data/test/test_flags.rb +129 -0
  75. data/test/test_key_file.rb +6 -2
  76. data/test/test_spawn.rb +33 -0
  77. metadata +26 -7
  78. data/ChangeLog +0 -3513
@@ -1,14 +1,23 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
- /**********************************************************************
3
-
4
- utils_callback.c -
5
-
6
- $Author: sakai $
7
- $Date: 2007/07/14 07:16:18 $
8
-
9
- Copyright (C) 2007 Ruby-GNOME2 Project
10
-
11
- **********************************************************************/
2
+ /*
3
+ * Copyright (C) 2011 Ruby-GNOME2 Project Team
4
+ * Copyright (C) 2007 Ruby-GNOME2 Project
5
+ *
6
+ * This library is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * This library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with this library; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
+ * MA 02110-1301 USA
20
+ */
12
21
 
13
22
  #include "rbgprivate.h"
14
23
 
@@ -165,6 +174,18 @@ invoke_callback_in_ruby_thread(VALUE (*func)(VALUE), VALUE arg)
165
174
 
166
175
  return request.result;
167
176
  }
177
+
178
+ #ifdef HAVE_RB_THREAD_CALL_WITH_GVL
179
+ extern void *rb_thread_call_with_gvl(void *(*func)(void *), void *data1);
180
+
181
+ static void *
182
+ invoke_callback_with_gvl(void *arg)
183
+ {
184
+ CallbackRequest *req = (CallbackRequest*)arg;
185
+ return (void *)rbgutil_protect(req->function, req->argument);
186
+ }
187
+ #endif
188
+
168
189
  #endif
169
190
 
170
191
  /**********************************************************************/
@@ -173,7 +194,21 @@ VALUE
173
194
  rbgutil_invoke_callback(VALUE (*func)(VALUE), VALUE arg)
174
195
  {
175
196
  #ifdef HAVE_NATIVETHREAD
176
- if (!ruby_native_thread_p()) {
197
+ if (ruby_native_thread_p()) {
198
+ # ifdef HAVE_RB_THREAD_BLOCKING_REGION
199
+ if (!GPOINTER_TO_INT(g_static_private_get(&rg_polling_key))) {
200
+ return rbgutil_protect(func, arg);
201
+ }
202
+ # endif
203
+ # ifdef HAVE_RB_THREAD_CALL_WITH_GVL
204
+ {
205
+ CallbackRequest req;
206
+ req.function = func;
207
+ req.argument = arg;
208
+ return (VALUE)rb_thread_call_with_gvl(invoke_callback_with_gvl, &req);
209
+ }
210
+ # endif
211
+ } else {
177
212
  return invoke_callback_in_ruby_thread(func, arg);
178
213
  }
179
214
  #endif
@@ -219,7 +254,7 @@ rbgutil_stop_callback_dispatch_thread(void)
219
254
  }
220
255
 
221
256
  void
222
- Init_gutil_callback()
257
+ Init_gutil_callback(void)
223
258
  {
224
259
  id_exit_application = rb_intern("exit_application");
225
260
  rbgutil_eGLibCallbackNotInitializedError =
@@ -0,0 +1,173 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright (C) 2011 Ruby-GNOME2 Project Team
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with this library; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
+ * MA 02110-1301 USA
19
+ */
20
+
21
+ #include "rbgprivate.h"
22
+
23
+ struct list2rval_args {
24
+ gpointer list;
25
+ RBGRValueFunc conv;
26
+ GFreeFunc free_list;
27
+ GFreeFunc free_elem;
28
+ };
29
+
30
+ struct list2rval_with_type_args {
31
+ struct list2rval_args args;
32
+ RBGRValueFuncWithType conv_with_type;
33
+ GType gtype;
34
+ };
35
+
36
+ static VALUE
37
+ glist2rval_body(VALUE data)
38
+ {
39
+ struct list2rval_args *args = (struct list2rval_args *)data;
40
+ RBGRValueFunc conv = args->conv;
41
+ GList *node;
42
+ VALUE ary;
43
+
44
+ ary = rb_ary_new();
45
+ if (conv)
46
+ for (node = args->list; node; node = g_list_next(node))
47
+ rb_ary_push(ary, conv(node->data));
48
+
49
+ return ary;
50
+ }
51
+
52
+ static VALUE
53
+ gslist2rval_body(VALUE data)
54
+ {
55
+ struct list2rval_args *args = (struct list2rval_args *)data;
56
+ RBGRValueFunc conv = args->conv;
57
+ GSList *node;
58
+ VALUE ary;
59
+
60
+ ary = rb_ary_new();
61
+ if (conv)
62
+ for (node = args->list; node; node = g_slist_next(node))
63
+ rb_ary_push(ary, conv(node->data));
64
+
65
+ return ary;
66
+ }
67
+
68
+ static VALUE
69
+ glist2rval_with_type_body(VALUE data)
70
+ {
71
+ struct list2rval_with_type_args *args_with_type = (struct list2rval_with_type_args *)data;
72
+ struct list2rval_args *args = (struct list2rval_args *)data;
73
+ RBGRValueFuncWithType conv = args_with_type->conv_with_type;
74
+ GType gtype = args_with_type->gtype;
75
+ GList *node;
76
+ VALUE ary;
77
+
78
+ ary = rb_ary_new();
79
+ if (conv)
80
+ for (node = args->list; node; node = g_list_next(node))
81
+ rb_ary_push(ary, conv(node->data, gtype));
82
+
83
+ return ary;
84
+ }
85
+
86
+ static VALUE
87
+ gslist2rval_with_type_body(VALUE data)
88
+ {
89
+ struct list2rval_with_type_args *args_with_type = (struct list2rval_with_type_args *)data;
90
+ struct list2rval_args *args = (struct list2rval_args *)data;
91
+ RBGRValueFuncWithType conv = args_with_type->conv_with_type;
92
+ GType gtype = args_with_type->gtype;
93
+ GSList *node;
94
+ VALUE ary;
95
+
96
+ ary = rb_ary_new();
97
+ if (conv)
98
+ for (node = args->list; node; node = g_slist_next(node))
99
+ rb_ary_push(ary, conv(node->data, gtype));
100
+
101
+ return ary;
102
+ }
103
+
104
+ static VALUE
105
+ glist2rval_ensure(VALUE data)
106
+ {
107
+ struct list2rval_args *args = (struct list2rval_args *)data;
108
+ GList *node;
109
+
110
+ if (args->free_elem)
111
+ for (node = args->list; node; node = g_list_next(node))
112
+ args->free_elem(node->data);
113
+ if (args->free_list)
114
+ args->free_list(args->list);
115
+
116
+ return Qnil;
117
+ }
118
+
119
+ static VALUE
120
+ gslist2rval_ensure(VALUE data)
121
+ {
122
+ struct list2rval_args *args = (struct list2rval_args *)data;
123
+ GSList *node;
124
+
125
+ if (args->free_elem)
126
+ for (node = args->list; node; node = g_slist_next(node))
127
+ args->free_elem(node->data);
128
+ if (args->free_list)
129
+ args->free_list(args->list);
130
+
131
+ return Qnil;
132
+ }
133
+
134
+ VALUE
135
+ rbg_glist2rval(GList *const list, RBGRValueFunc conv,
136
+ GFreeFunc free_list, GFreeFunc free_elem)
137
+ {
138
+ struct list2rval_args args = {list, conv, free_list, free_elem};
139
+
140
+ return rb_ensure(glist2rval_body, (VALUE)&args,
141
+ glist2rval_ensure, (VALUE)&args);
142
+ }
143
+
144
+ VALUE
145
+ rbg_gslist2rval(GSList *const list, RBGRValueFunc conv,
146
+ GFreeFunc free_list, GFreeFunc free_elem)
147
+ {
148
+ struct list2rval_args args = {list, conv, free_list, free_elem};
149
+
150
+ return rb_ensure(gslist2rval_body, (VALUE)&args,
151
+ gslist2rval_ensure, (VALUE)&args);
152
+ }
153
+
154
+ VALUE
155
+ rbg_glist2rval_with_type(GList *const list, RBGRValueFuncWithType conv, GType gtype,
156
+ GFreeFunc free_list, GFreeFunc free_elem)
157
+ {
158
+ struct list2rval_with_type_args args = {{list, NULL, free_list, free_elem}, conv, gtype};
159
+
160
+ return rb_ensure(glist2rval_with_type_body, (VALUE)&args,
161
+ glist2rval_ensure, (VALUE)&args);
162
+ }
163
+
164
+ VALUE
165
+ rbg_gslist2rval_with_type(GSList *const list, RBGRValueFuncWithType conv, GType gtype,
166
+ GFreeFunc free_list, GFreeFunc free_elem)
167
+ {
168
+ struct list2rval_with_type_args args = {{list, NULL, free_list, free_elem}, conv, gtype};
169
+
170
+ return rb_ensure(gslist2rval_with_type_body, (VALUE)&args,
171
+ gslist2rval_ensure, (VALUE)&args);
172
+ }
173
+
@@ -0,0 +1,85 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright (C) 2011 Ruby-GNOME2 Project Team
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with this library; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
+ * MA 02110-1301 USA
19
+ */
20
+
21
+ #ifndef __RBGUTIL_LIST_H__
22
+ #define __RBGUTIL_LIST_H__
23
+
24
+ G_BEGIN_DECLS
25
+
26
+ #define CSTRGLIST2RVAL(list) \
27
+ CSTRGLIST2RVAL_FREE(list, NULL, NULL)
28
+ #define CSTRGLIST2RVAL_FREE(list, free_list, free_elem) \
29
+ rbg_glist2rval(list, (RBGRValueFunc)rbg_cstr2rval, \
30
+ (GFreeFunc)free_list, (GFreeFunc)free_elem)
31
+ #define CSTRGSLIST2RVAL(list) \
32
+ CSTRGSLIST2RVAL_FREE(list, NULL, NULL)
33
+ #define CSTRGSLIST2RVAL_FREE(list, free_list, free_elem) \
34
+ rbg_gslist2rval(list, (RBGRValueFunc)rbg_cstr2rval, \
35
+ (GFreeFunc)free_list, (GFreeFunc)free_elem)
36
+
37
+ #define FILENAMEGLIST2RVAL(list) \
38
+ FILENAMEGLIST2RVAL_FREE(list, NULL, NULL)
39
+ #define FILENAMEGLIST2RVAL_FREE(list, free_list, free_elem) \
40
+ rbg_glist2rval(list, (RBGRValueFunc)rbg_filename_to_ruby, \
41
+ (GFreeFunc)free_list, (GFreeFunc)free_elem)
42
+ #define FILENAMEGSLIST2RVAL(list) \
43
+ FILENAMEGSLIST2RVAL_FREE(list, NULL, NULL)
44
+ #define FILENAMEGSLIST2RVAL_FREE(list, free_list, free_elem) \
45
+ rbg_gslist2rval(list, (RBGRValueFunc)rbg_filename_to_ruby, \
46
+ (GFreeFunc)free_list, (GFreeFunc)free_elem)
47
+
48
+ #define GOBJGLIST2RVAL(list) \
49
+ GOBJGLIST2RVAL_FREE(list, NULL, NULL)
50
+ #define GOBJGLIST2RVAL_FREE(list, free_list, free_elem) \
51
+ rbg_glist2rval(list, (RBGRValueFunc)rbgobj_ruby_object_from_instance, \
52
+ (GFreeFunc)free_list, (GFreeFunc)free_elem)
53
+ #define GOBJGSLIST2RVAL(list) \
54
+ GOBJGSLIST2RVAL_FREE(list, NULL, NULL)
55
+ #define GOBJGSLIST2RVAL_FREE(list, free_list, free_elem) \
56
+ rbg_gslist2rval(list, (RBGRValueFunc)rbgobj_ruby_object_from_instance, \
57
+ (GFreeFunc)free_list, (GFreeFunc)free_elem)
58
+
59
+ #define BOXEDGLIST2RVAL(list, gtype) \
60
+ BOXEDGLIST2RVAL_FREE(list, gtype, NULL, NULL)
61
+ #define BOXEDGLIST2RVAL_FREE(list, gtype, free_list, free_elem) \
62
+ rbg_glist2rval_with_type(list, (RBGRValueFuncWithType)rbgobj_make_boxed, gtype, \
63
+ (GFreeFunc)free_list, (GFreeFunc)free_elem)
64
+ #define BOXEDGSLIST2RVAL(list, gtype) \
65
+ BOXEDGSLIST2RVAL_FREE(list, gtype, NULL, NULL)
66
+ #define BOXEDGSLIST2RVAL_FREE(list, gtype, free_list, free_elem) \
67
+ rbg_gslist2rval_with_type(list, (RBGRValueFuncWithType)rbgobj_make_boxed, gtype, \
68
+ (GFreeFunc)free_list, (GFreeFunc)free_elem)
69
+
70
+ typedef VALUE (*RBGRValueFunc)(gpointer obj);
71
+ typedef VALUE (*RBGRValueFuncWithType)(gpointer obj, GType gtype);
72
+
73
+ extern VALUE rbg_glist2rval(GList *const list, RBGRValueFunc conv,
74
+ GFreeFunc free_list, GFreeFunc free_elem);
75
+ extern VALUE rbg_gslist2rval(GSList *const list, RBGRValueFunc conv,
76
+ GFreeFunc free_list, GFreeFunc free_elem);
77
+ extern VALUE rbg_glist2rval_with_type(GList *const list, RBGRValueFuncWithType conv, GType gtype,
78
+ GFreeFunc free_list, GFreeFunc free_elem);
79
+ extern VALUE rbg_gslist2rval_with_type(GSList *const list, RBGRValueFuncWithType conv, GType gtype,
80
+ GFreeFunc free_list, GFreeFunc free_elem);
81
+
82
+ G_END_DECLS
83
+
84
+ #endif /* __RBGUTIL_LIST_H__ */
85
+
@@ -0,0 +1,252 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright (C) 2011 Ruby-GNOME2 Project Team
4
+ * Copyright (C) 2002-2004 Masao Mutoh
5
+ *
6
+ * This library is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * This library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with this library; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
+ * MA 02110-1301 USA
20
+ */
21
+
22
+ #include "rbgprivate.h"
23
+
24
+ VALUE
25
+ rbgutil_glist2ary(const GList *const list)
26
+ {
27
+ VALUE ary;
28
+ const GList *i;
29
+
30
+ ary = rb_ary_new();
31
+ for (i = list; i != NULL; i = i->next)
32
+ rb_ary_push(ary, GOBJ2RVAL(i->data));
33
+
34
+ return ary;
35
+ }
36
+
37
+ static VALUE
38
+ rbgutil_glist2ary_and_free_body(VALUE data)
39
+ {
40
+ VALUE ary;
41
+ GList *i;
42
+
43
+ ary = rb_ary_new();
44
+ for (i = (GList *)data; i != NULL; i = i->next)
45
+ rb_ary_push(ary, GOBJ2RVAL(i->data));
46
+
47
+ return ary;
48
+ }
49
+
50
+ static VALUE
51
+ rbgutil_glist2ary_and_free_ensure(VALUE data)
52
+ {
53
+ g_list_free((GList *)data);
54
+
55
+ return Qnil;
56
+ }
57
+
58
+ VALUE
59
+ rbgutil_glist2ary_and_free(GList *const list)
60
+ {
61
+ return rb_ensure(rbgutil_glist2ary_and_free_body, (VALUE)list,
62
+ rbgutil_glist2ary_and_free_ensure, (VALUE)list);
63
+ }
64
+
65
+ VALUE
66
+ rbgutil_glist2ary_boxed(const GList *const list, GType gtype)
67
+ {
68
+ VALUE ary;
69
+ const GList *i;
70
+
71
+ ary = rb_ary_new();
72
+ for (i = list; i != NULL; i = i->next)
73
+ rb_ary_push(ary, BOXED2RVAL(i->data, gtype));
74
+
75
+ return ary;
76
+ }
77
+
78
+ struct rbgutil_glist2ary_boxed_and_free_data
79
+ {
80
+ GList *const list;
81
+ GType gtype;
82
+ };
83
+
84
+ static VALUE
85
+ rbgutil_glist2ary_boxed_and_free_body(VALUE data)
86
+ {
87
+ struct rbgutil_glist2ary_boxed_and_free_data *real;
88
+ VALUE ary;
89
+ GList *i;
90
+
91
+ real = (struct rbgutil_glist2ary_boxed_and_free_data *)data;
92
+ ary = rb_ary_new();
93
+ for (i = real->list; i != NULL; i = i->next)
94
+ rb_ary_push(ary, BOXED2RVAL(i->data, real->gtype));
95
+
96
+ return ary;
97
+ }
98
+
99
+ static VALUE
100
+ rbgutil_glist2ary_boxed_and_free_ensure(VALUE data)
101
+ {
102
+ g_list_free(((struct rbgutil_glist2ary_boxed_and_free_data *)data)->list);
103
+
104
+ return Qnil;
105
+ }
106
+
107
+ VALUE
108
+ rbgutil_glist2ary_boxed_and_free(GList *const list, GType gtype)
109
+ {
110
+ struct rbgutil_glist2ary_boxed_and_free_data data = { list, gtype };
111
+
112
+ return rb_ensure(rbgutil_glist2ary_boxed_and_free_body, (VALUE)&data,
113
+ rbgutil_glist2ary_boxed_and_free_ensure, (VALUE)&data);
114
+ }
115
+
116
+ VALUE
117
+ rbgutil_glist2ary_string(const GList *const list)
118
+ {
119
+ VALUE ary;
120
+ const GList *i;
121
+
122
+ ary = rb_ary_new();
123
+ for (i = list; i != NULL; i = i->next)
124
+ rb_ary_push(ary, CSTR2RVAL(i->data));
125
+
126
+ return ary;
127
+ }
128
+
129
+ static VALUE
130
+ rbgutil_glist2ary_string_and_free_body(VALUE data)
131
+ {
132
+ VALUE ary;
133
+ GList *i;
134
+
135
+ ary = rb_ary_new();
136
+ for (i = (GList *)data; i != NULL; i = i->next)
137
+ rb_ary_push(ary, CSTR2RVAL(i->data));
138
+
139
+ return ary;
140
+ }
141
+
142
+ static VALUE
143
+ rbgutil_glist2ary_string_and_free_ensure(VALUE data)
144
+ {
145
+ GList *i;
146
+
147
+ for (i = (GList *)data; i != NULL; i = i->next)
148
+ g_free(i->data);
149
+ g_list_free((GList *)data);
150
+
151
+ return Qnil;
152
+ }
153
+
154
+ VALUE
155
+ rbgutil_glist2ary_string_and_free(GList *const list)
156
+ {
157
+ return rb_ensure(rbgutil_glist2ary_string_and_free_body, (VALUE)list,
158
+ rbgutil_glist2ary_string_and_free_ensure, (VALUE)list);
159
+ }
160
+
161
+ VALUE
162
+ rbgutil_gslist2ary(const GSList *const list)
163
+ {
164
+ VALUE ary;
165
+ const GSList *i;
166
+
167
+ ary = rb_ary_new();
168
+ for (i = list; i != NULL; i = i->next)
169
+ rb_ary_push(ary, GOBJ2RVAL(i->data));
170
+
171
+ return ary;
172
+ }
173
+
174
+ static VALUE
175
+ rbgutil_gslist2ary_and_free_body(VALUE data)
176
+ {
177
+ VALUE ary;
178
+ GSList *i;
179
+
180
+ ary = rb_ary_new();
181
+ for (i = (GSList *)data; i != NULL; i = i->next)
182
+ rb_ary_push(ary, GOBJ2RVAL(i->data));
183
+
184
+ return ary;
185
+ }
186
+
187
+ static VALUE
188
+ rbgutil_gslist2ary_and_free_ensure(VALUE data)
189
+ {
190
+ g_slist_free((GSList *)data);
191
+
192
+ return Qnil;
193
+ }
194
+
195
+ VALUE
196
+ rbgutil_gslist2ary_and_free(GSList *const list)
197
+ {
198
+ return rb_ensure(rbgutil_gslist2ary_and_free_body, (VALUE)list,
199
+ rbgutil_gslist2ary_and_free_ensure, (VALUE)list);
200
+ }
201
+
202
+ VALUE
203
+ rbgutil_gslist2ary_boxed(const GSList *const list, GType gtype)
204
+ {
205
+ VALUE ary;
206
+ const GSList *i;
207
+
208
+ ary = rb_ary_new();
209
+ for (i = list; i != NULL; i = i->next)
210
+ rb_ary_push(ary, BOXED2RVAL(i->data, gtype));
211
+
212
+ return ary;
213
+ }
214
+
215
+ struct rbgutil_gslist2ary_boxed_and_free_data
216
+ {
217
+ GSList *const list;
218
+ GType gtype;
219
+ };
220
+
221
+ static VALUE
222
+ rbgutil_gslist2ary_boxed_and_free_body(VALUE data)
223
+ {
224
+ struct rbgutil_gslist2ary_boxed_and_free_data *real;
225
+ VALUE ary;
226
+ GSList *i;
227
+
228
+ real = (struct rbgutil_gslist2ary_boxed_and_free_data *)data;
229
+ ary = rb_ary_new();
230
+ for (i = real->list; i != NULL; i = i->next)
231
+ rb_ary_push(ary, BOXED2RVAL(i->data, real->gtype));
232
+
233
+ return ary;
234
+ }
235
+
236
+ static VALUE
237
+ rbgutil_gslist2ary_boxed_and_free_ensure(VALUE data)
238
+ {
239
+ g_slist_free(((struct rbgutil_gslist2ary_boxed_and_free_data *)data)->list);
240
+
241
+ return Qnil;
242
+ }
243
+
244
+ VALUE
245
+ rbgutil_gslist2ary_boxed_and_free(GSList *const list, GType gtype)
246
+ {
247
+ struct rbgutil_gslist2ary_boxed_and_free_data data = { list, gtype };
248
+
249
+ return rb_ensure(rbgutil_gslist2ary_boxed_and_free_body, (VALUE)&data,
250
+ rbgutil_gslist2ary_boxed_and_free_ensure, (VALUE)&data);
251
+ }
252
+