glib2 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +3023 -0
- data/README +28 -0
- data/Rakefile +87 -0
- data/extconf.rb +61 -0
- data/sample/bookmarkfile.rb +66 -0
- data/sample/completion.rb +45 -0
- data/sample/idle.rb +41 -0
- data/sample/iochannel.rb +44 -0
- data/sample/keyfile.rb +62 -0
- data/sample/shell.rb +36 -0
- data/sample/spawn.rb +25 -0
- data/sample/timeout.rb +28 -0
- data/sample/timeout2.rb +35 -0
- data/sample/timer.rb +40 -0
- data/sample/type-register.rb +103 -0
- data/sample/type-register2.rb +104 -0
- data/sample/utils.rb +54 -0
- data/src/glib-enum-types.c +1032 -0
- data/src/glib-enum-types.h +140 -0
- data/src/lib/glib-mkenums.rb +199 -0
- data/src/lib/glib2.rb +220 -0
- data/src/lib/mkmf-gnome2.rb +390 -0
- data/src/lib/pkg-config.rb +137 -0
- data/src/rbgcompat.h +30 -0
- data/src/rbglib.c +320 -0
- data/src/rbglib.h +96 -0
- data/src/rbglib_bookmarkfile.c +595 -0
- data/src/rbglib_completion.c +192 -0
- data/src/rbglib_convert.c +195 -0
- data/src/rbglib_error.c +95 -0
- data/src/rbglib_fileutils.c +83 -0
- data/src/rbglib_i18n.c +44 -0
- data/src/rbglib_int64.c +157 -0
- data/src/rbglib_iochannel.c +883 -0
- data/src/rbglib_keyfile.c +846 -0
- data/src/rbglib_maincontext.c +917 -0
- data/src/rbglib_mainloop.c +87 -0
- data/src/rbglib_messages.c +150 -0
- data/src/rbglib_pollfd.c +111 -0
- data/src/rbglib_shell.c +68 -0
- data/src/rbglib_source.c +190 -0
- data/src/rbglib_spawn.c +345 -0
- data/src/rbglib_threads.c +51 -0
- data/src/rbglib_timer.c +127 -0
- data/src/rbglib_unicode.c +611 -0
- data/src/rbglib_utils.c +386 -0
- data/src/rbglib_win32.c +136 -0
- data/src/rbgobj_boxed.c +251 -0
- data/src/rbgobj_closure.c +337 -0
- data/src/rbgobj_convert.c +167 -0
- data/src/rbgobj_enums.c +961 -0
- data/src/rbgobj_fundamental.c +30 -0
- data/src/rbgobj_object.c +892 -0
- data/src/rbgobj_param.c +390 -0
- data/src/rbgobj_paramspecs.c +305 -0
- data/src/rbgobj_signal.c +963 -0
- data/src/rbgobj_strv.c +61 -0
- data/src/rbgobj_type.c +851 -0
- data/src/rbgobj_typeinstance.c +121 -0
- data/src/rbgobj_typeinterface.c +148 -0
- data/src/rbgobj_typemodule.c +66 -0
- data/src/rbgobj_typeplugin.c +49 -0
- data/src/rbgobj_value.c +313 -0
- data/src/rbgobj_valuearray.c +59 -0
- data/src/rbgobj_valuetypes.c +298 -0
- data/src/rbgobject.c +406 -0
- data/src/rbgobject.h +265 -0
- data/src/rbgprivate.h +88 -0
- data/src/rbgutil.c +222 -0
- data/src/rbgutil.h +82 -0
- data/src/rbgutil_callback.c +231 -0
- data/test/glib-test-init.rb +6 -0
- data/test/glib-test-utils.rb +12 -0
- data/test/run-test.rb +25 -0
- data/test/test_enum.rb +99 -0
- data/test/test_file_utils.rb +15 -0
- data/test/test_glib2.rb +120 -0
- data/test/test_iochannel.rb +275 -0
- data/test/test_key_file.rb +38 -0
- data/test/test_mkenums.rb +25 -0
- data/test/test_signal.rb +20 -0
- data/test/test_timeout.rb +28 -0
- data/test/test_unicode.rb +369 -0
- data/test/test_utils.rb +37 -0
- data/test/test_win32.rb +13 -0
- metadata +165 -0
@@ -0,0 +1,611 @@
|
|
1
|
+
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
|
+
/**********************************************************************
|
3
|
+
|
4
|
+
rbglib_unicode.c -
|
5
|
+
|
6
|
+
$Author: ktou $
|
7
|
+
$Date: 2007/08/30 10:16:35 $
|
8
|
+
|
9
|
+
Copyright (C) 2006 Kouhei Sutou
|
10
|
+
|
11
|
+
**********************************************************************/
|
12
|
+
#include "rbgprivate.h"
|
13
|
+
#include "rbglib.h"
|
14
|
+
|
15
|
+
static VALUE
|
16
|
+
rbglib_m_charset(VALUE self)
|
17
|
+
{
|
18
|
+
const char *charset;
|
19
|
+
g_get_charset(&charset);
|
20
|
+
return rb_str_new2(charset);
|
21
|
+
}
|
22
|
+
|
23
|
+
#define DEF_IS_UNICHAR(name) \
|
24
|
+
static VALUE \
|
25
|
+
rbglib_m_unichar_is ## name(VALUE self, VALUE unichar) \
|
26
|
+
{ \
|
27
|
+
return CBOOL2RVAL(g_unichar_is ## name(NUM2UINT(unichar))); \
|
28
|
+
}
|
29
|
+
|
30
|
+
DEF_IS_UNICHAR(alnum)
|
31
|
+
DEF_IS_UNICHAR(alpha)
|
32
|
+
DEF_IS_UNICHAR(cntrl)
|
33
|
+
DEF_IS_UNICHAR(digit)
|
34
|
+
DEF_IS_UNICHAR(graph)
|
35
|
+
DEF_IS_UNICHAR(lower)
|
36
|
+
DEF_IS_UNICHAR(print)
|
37
|
+
DEF_IS_UNICHAR(punct)
|
38
|
+
DEF_IS_UNICHAR(space)
|
39
|
+
DEF_IS_UNICHAR(upper)
|
40
|
+
DEF_IS_UNICHAR(xdigit)
|
41
|
+
DEF_IS_UNICHAR(title)
|
42
|
+
DEF_IS_UNICHAR(defined)
|
43
|
+
DEF_IS_UNICHAR(wide)
|
44
|
+
#if GLIB_CHECK_VERSION(2,12,0)
|
45
|
+
DEF_IS_UNICHAR(wide_cjk)
|
46
|
+
#endif
|
47
|
+
|
48
|
+
#undef DEF_IS_UNICHAR
|
49
|
+
|
50
|
+
static VALUE
|
51
|
+
rbglib_m_unichar_toupper(VALUE self, VALUE unichar)
|
52
|
+
{
|
53
|
+
return UINT2NUM(g_unichar_toupper(NUM2UINT(unichar)));
|
54
|
+
}
|
55
|
+
|
56
|
+
static VALUE
|
57
|
+
rbglib_m_unichar_tolower(VALUE self, VALUE unichar)
|
58
|
+
{
|
59
|
+
return UINT2NUM(g_unichar_tolower(NUM2UINT(unichar)));
|
60
|
+
}
|
61
|
+
|
62
|
+
static VALUE
|
63
|
+
rbglib_m_unichar_totitle(VALUE self, VALUE unichar)
|
64
|
+
{
|
65
|
+
return UINT2NUM(g_unichar_totitle(NUM2UINT(unichar)));
|
66
|
+
}
|
67
|
+
|
68
|
+
static VALUE
|
69
|
+
rbglib_m_unichar_digit_value(VALUE self, VALUE unichar)
|
70
|
+
{
|
71
|
+
return INT2NUM(g_unichar_digit_value(NUM2UINT(unichar)));
|
72
|
+
}
|
73
|
+
|
74
|
+
static VALUE
|
75
|
+
rbglib_m_unichar_xdigit_value(VALUE self, VALUE unichar)
|
76
|
+
{
|
77
|
+
return INT2NUM(g_unichar_xdigit_value(NUM2UINT(unichar)));
|
78
|
+
}
|
79
|
+
|
80
|
+
static VALUE
|
81
|
+
rbglib_m_unichar_type(VALUE self, VALUE unichar)
|
82
|
+
{
|
83
|
+
return GENUM2RVAL(g_unichar_type(NUM2UINT(unichar)),
|
84
|
+
G_TYPE_UNICODE_TYPE);
|
85
|
+
}
|
86
|
+
|
87
|
+
static VALUE
|
88
|
+
rbglib_m_unichar_break_type(VALUE self, VALUE unichar)
|
89
|
+
{
|
90
|
+
return GENUM2RVAL(g_unichar_break_type(NUM2UINT(unichar)),
|
91
|
+
G_TYPE_UNICODE_BREAK_TYPE);
|
92
|
+
}
|
93
|
+
|
94
|
+
static VALUE
|
95
|
+
rbglib_m_unicode_canonical_ordering(VALUE self, VALUE rb_ucs4)
|
96
|
+
{
|
97
|
+
VALUE normalized_ucs4;
|
98
|
+
gchar *original_str;
|
99
|
+
gunichar *ucs4;
|
100
|
+
gint len;
|
101
|
+
|
102
|
+
original_str = StringValuePtr(rb_ucs4);
|
103
|
+
len = RSTRING_LEN(rb_ucs4);
|
104
|
+
ucs4 = g_memdup(original_str, len);
|
105
|
+
g_unicode_canonical_ordering(ucs4, len);
|
106
|
+
normalized_ucs4 = rb_str_new((const char *)ucs4, len);
|
107
|
+
g_free(ucs4);
|
108
|
+
return normalized_ucs4;
|
109
|
+
}
|
110
|
+
|
111
|
+
static VALUE
|
112
|
+
rbglib_m_unicode_canonical_decomposition(VALUE self, VALUE unichar)
|
113
|
+
{
|
114
|
+
VALUE normalized_ucs4;
|
115
|
+
gunichar *ucs4;
|
116
|
+
gsize len;
|
117
|
+
|
118
|
+
ucs4 = g_unicode_canonical_decomposition(NUM2UINT(unichar), &len);
|
119
|
+
normalized_ucs4 = rb_str_new((const char *)ucs4, len * sizeof(gunichar));
|
120
|
+
g_free(ucs4);
|
121
|
+
return normalized_ucs4;
|
122
|
+
}
|
123
|
+
|
124
|
+
#if GLIB_CHECK_VERSION(2,4,0)
|
125
|
+
static VALUE
|
126
|
+
rbglib_m_unichar_get_mirror_char(VALUE self, VALUE unichar)
|
127
|
+
{
|
128
|
+
gunichar mirrored_char;
|
129
|
+
|
130
|
+
if (g_unichar_get_mirror_char(NUM2UINT(unichar), &mirrored_char)) {
|
131
|
+
return UINT2NUM(mirrored_char);
|
132
|
+
} else {
|
133
|
+
return unichar;
|
134
|
+
}
|
135
|
+
}
|
136
|
+
#endif
|
137
|
+
|
138
|
+
#if GLIB_CHECK_VERSION(2,14,0)
|
139
|
+
static VALUE
|
140
|
+
rbglib_m_unichar_combining_class(VALUE self, VALUE unichar)
|
141
|
+
{
|
142
|
+
return INT2NUM(g_unichar_combining_class(NUM2UINT(unichar)));
|
143
|
+
}
|
144
|
+
|
145
|
+
static VALUE
|
146
|
+
rbglib_m_unichar_get_script(VALUE self, VALUE unichar)
|
147
|
+
{
|
148
|
+
return GENUM2RVAL(g_unichar_get_script(NUM2UINT(unichar)),
|
149
|
+
G_TYPE_UNICODE_SCRIPT);
|
150
|
+
}
|
151
|
+
|
152
|
+
static VALUE
|
153
|
+
rbglib_m_unichar_ismark(VALUE self, VALUE unichar)
|
154
|
+
{
|
155
|
+
return CBOOL2RVAL(g_unichar_ismark(NUM2UINT(unichar)));
|
156
|
+
}
|
157
|
+
|
158
|
+
static VALUE
|
159
|
+
rbglib_m_unichar_iszerowidth(VALUE self, VALUE unichar)
|
160
|
+
{
|
161
|
+
return CBOOL2RVAL(g_unichar_iszerowidth(NUM2UINT(unichar)));
|
162
|
+
}
|
163
|
+
#endif
|
164
|
+
|
165
|
+
static VALUE
|
166
|
+
rbglib_m_utf8_get_char(int argc, VALUE *argv, VALUE self)
|
167
|
+
{
|
168
|
+
VALUE utf8, validate;
|
169
|
+
gunichar result;
|
170
|
+
|
171
|
+
rb_scan_args(argc, argv, "11", &utf8, &validate);
|
172
|
+
|
173
|
+
if (RVAL2CBOOL(validate)) {
|
174
|
+
StringValue(utf8);
|
175
|
+
result = g_utf8_get_char_validated(RSTRING_PTR(utf8),
|
176
|
+
RSTRING_LEN(utf8));
|
177
|
+
if (result == (gunichar)-1) {
|
178
|
+
return INT2NUM(-1);
|
179
|
+
} else if (result == (gunichar)-2) {
|
180
|
+
return INT2NUM(-2);
|
181
|
+
}
|
182
|
+
} else {
|
183
|
+
result = g_utf8_get_char(StringValueCStr(utf8));
|
184
|
+
}
|
185
|
+
|
186
|
+
return UINT2NUM(result);
|
187
|
+
}
|
188
|
+
|
189
|
+
static VALUE
|
190
|
+
rbglib_m_utf8_strlen(VALUE self, VALUE rb_utf8)
|
191
|
+
{
|
192
|
+
gchar *utf8;
|
193
|
+
|
194
|
+
utf8 = StringValueCStr(rb_utf8);
|
195
|
+
return INT2NUM(g_utf8_strlen(utf8, RSTRING_LEN(rb_utf8)));
|
196
|
+
}
|
197
|
+
|
198
|
+
static VALUE
|
199
|
+
rbglib_m_utf8_strreverse(VALUE self, VALUE rb_utf8)
|
200
|
+
{
|
201
|
+
VALUE result;
|
202
|
+
gchar *utf8, *reversed_utf8;
|
203
|
+
|
204
|
+
utf8 = StringValueCStr(rb_utf8);
|
205
|
+
reversed_utf8 = g_utf8_strreverse(utf8, RSTRING_LEN(rb_utf8));
|
206
|
+
result = rb_str_new2(reversed_utf8);
|
207
|
+
g_free(reversed_utf8);
|
208
|
+
return result;
|
209
|
+
}
|
210
|
+
|
211
|
+
static VALUE
|
212
|
+
rbglib_m_utf8_validate(VALUE self, VALUE str)
|
213
|
+
{
|
214
|
+
StringValue(str);
|
215
|
+
return CBOOL2RVAL(g_utf8_validate(RSTRING_PTR(str), RSTRING_LEN(str),
|
216
|
+
NULL));
|
217
|
+
}
|
218
|
+
|
219
|
+
static VALUE
|
220
|
+
rbglib_m_utf8_strup(VALUE self, VALUE rb_utf8)
|
221
|
+
{
|
222
|
+
VALUE result;
|
223
|
+
gchar *utf8, *upcased_utf8;
|
224
|
+
|
225
|
+
utf8 = StringValueCStr(rb_utf8);
|
226
|
+
upcased_utf8 = g_utf8_strup(utf8, RSTRING_LEN(rb_utf8));
|
227
|
+
result = rb_str_new2(upcased_utf8);
|
228
|
+
g_free(upcased_utf8);
|
229
|
+
return result;
|
230
|
+
}
|
231
|
+
|
232
|
+
static VALUE
|
233
|
+
rbglib_m_utf8_strdown(VALUE self, VALUE rb_utf8)
|
234
|
+
{
|
235
|
+
VALUE result;
|
236
|
+
gchar *utf8, *downcased_utf8;
|
237
|
+
|
238
|
+
utf8 = StringValueCStr(rb_utf8);
|
239
|
+
downcased_utf8 = g_utf8_strdown(utf8, RSTRING_LEN(rb_utf8));
|
240
|
+
result = rb_str_new2(downcased_utf8);
|
241
|
+
g_free(downcased_utf8);
|
242
|
+
return result;
|
243
|
+
}
|
244
|
+
|
245
|
+
static VALUE
|
246
|
+
rbglib_m_utf8_casefold(VALUE self, VALUE rb_utf8)
|
247
|
+
{
|
248
|
+
VALUE result;
|
249
|
+
gchar *utf8, *casefolded_utf8;
|
250
|
+
|
251
|
+
utf8 = StringValueCStr(rb_utf8);
|
252
|
+
casefolded_utf8 = g_utf8_casefold(utf8, RSTRING_LEN(rb_utf8));
|
253
|
+
result = rb_str_new2(casefolded_utf8);
|
254
|
+
g_free(casefolded_utf8);
|
255
|
+
return result;
|
256
|
+
}
|
257
|
+
|
258
|
+
static VALUE
|
259
|
+
rbglib_m_utf8_normalize(int argc, VALUE *argv, VALUE self)
|
260
|
+
{
|
261
|
+
VALUE rb_utf8, rb_mode, result;
|
262
|
+
gchar *utf8, *normalized_utf8;
|
263
|
+
GNormalizeMode mode = G_NORMALIZE_DEFAULT;
|
264
|
+
|
265
|
+
rb_scan_args(argc, argv, "11", &rb_utf8, &rb_mode);
|
266
|
+
|
267
|
+
if (!NIL_P(rb_mode))
|
268
|
+
mode = RVAL2GENUM(rb_mode, G_TYPE_NORMALIZE_MODE);
|
269
|
+
|
270
|
+
utf8 = StringValueCStr(rb_utf8);
|
271
|
+
normalized_utf8 = g_utf8_normalize(utf8, RSTRING_LEN(rb_utf8), mode);
|
272
|
+
result = rb_str_new2(normalized_utf8);
|
273
|
+
g_free(normalized_utf8);
|
274
|
+
return result;
|
275
|
+
}
|
276
|
+
|
277
|
+
static VALUE
|
278
|
+
rbglib_m_utf8_collate(VALUE self, VALUE utf8a, VALUE utf8b)
|
279
|
+
{
|
280
|
+
return INT2NUM(g_utf8_collate(StringValueCStr(utf8a),
|
281
|
+
StringValueCStr(utf8b)));
|
282
|
+
}
|
283
|
+
|
284
|
+
static VALUE
|
285
|
+
rbglib_m_utf8_collate_key(int argc, VALUE *argv, VALUE self)
|
286
|
+
{
|
287
|
+
VALUE result, rb_utf8, for_filename;
|
288
|
+
gchar *key, *utf8;
|
289
|
+
gssize len;
|
290
|
+
|
291
|
+
rb_scan_args(argc, argv, "11", &rb_utf8, &for_filename);
|
292
|
+
|
293
|
+
utf8 = StringValueCStr(rb_utf8);
|
294
|
+
len = RSTRING_LEN(rb_utf8);
|
295
|
+
#if GLIB_CHECK_VERSION(2,8,0)
|
296
|
+
if (RVAL2CBOOL(for_filename))
|
297
|
+
key = g_utf8_collate_key_for_filename(utf8, len);
|
298
|
+
else
|
299
|
+
#endif
|
300
|
+
key = g_utf8_collate_key(utf8, len);
|
301
|
+
|
302
|
+
result = rb_str_new2(key);
|
303
|
+
g_free(key);
|
304
|
+
return result;
|
305
|
+
}
|
306
|
+
|
307
|
+
static VALUE
|
308
|
+
rbglib_m_utf8_to_utf16(VALUE self, VALUE rb_utf8)
|
309
|
+
{
|
310
|
+
VALUE result;
|
311
|
+
gchar *utf8;
|
312
|
+
gunichar2 *utf16;
|
313
|
+
glong len, items_written;
|
314
|
+
GError *error = NULL;
|
315
|
+
|
316
|
+
utf8 = StringValueCStr(rb_utf8);
|
317
|
+
len = RSTRING_LEN(rb_utf8);
|
318
|
+
|
319
|
+
utf16 = g_utf8_to_utf16(utf8, len, NULL, &items_written, &error);
|
320
|
+
|
321
|
+
if (error)
|
322
|
+
RAISE_GERROR(error);
|
323
|
+
|
324
|
+
result = rb_str_new((char *)utf16, items_written * sizeof(*utf16));
|
325
|
+
g_free(utf16);
|
326
|
+
return result;
|
327
|
+
}
|
328
|
+
|
329
|
+
static VALUE
|
330
|
+
rbglib_m_utf8_to_ucs4(int argc, VALUE *argv, VALUE self)
|
331
|
+
{
|
332
|
+
VALUE result, rb_utf8, is_fast;
|
333
|
+
gchar *utf8;
|
334
|
+
gunichar *ucs4;
|
335
|
+
glong len, items_written;
|
336
|
+
|
337
|
+
rb_scan_args(argc, argv, "11", &rb_utf8, &is_fast);
|
338
|
+
|
339
|
+
utf8 = StringValueCStr(rb_utf8);
|
340
|
+
len = RSTRING_LEN(rb_utf8);
|
341
|
+
|
342
|
+
if (RVAL2CBOOL(is_fast)) {
|
343
|
+
ucs4 = g_utf8_to_ucs4_fast(utf8, len, &items_written);
|
344
|
+
} else {
|
345
|
+
GError *error = NULL;
|
346
|
+
ucs4 = g_utf8_to_ucs4(utf8, len, NULL, &items_written, &error);
|
347
|
+
|
348
|
+
if (error)
|
349
|
+
RAISE_GERROR(error);
|
350
|
+
}
|
351
|
+
|
352
|
+
result = rb_str_new((char *)ucs4, items_written * sizeof(*ucs4));
|
353
|
+
g_free(ucs4);
|
354
|
+
return result;
|
355
|
+
}
|
356
|
+
|
357
|
+
static VALUE
|
358
|
+
rbglib_m_utf16_to_ucs4(VALUE self, VALUE rb_utf16)
|
359
|
+
{
|
360
|
+
VALUE result;
|
361
|
+
gunichar *ucs4;
|
362
|
+
gunichar2 *utf16;
|
363
|
+
glong len, items_written;
|
364
|
+
GError *error = NULL;
|
365
|
+
|
366
|
+
utf16 = (gunichar2 *)StringValueCStr(rb_utf16);
|
367
|
+
len = RSTRING_LEN(rb_utf16) / sizeof(*utf16);
|
368
|
+
|
369
|
+
ucs4 = g_utf16_to_ucs4(utf16, len, NULL, &items_written, &error);
|
370
|
+
|
371
|
+
if (error)
|
372
|
+
RAISE_GERROR(error);
|
373
|
+
|
374
|
+
result = rb_str_new((char *)ucs4, items_written * sizeof(*ucs4));
|
375
|
+
g_free(ucs4);
|
376
|
+
return result;
|
377
|
+
}
|
378
|
+
|
379
|
+
static VALUE
|
380
|
+
rbglib_m_utf16_to_utf8(VALUE self, VALUE rb_utf16)
|
381
|
+
{
|
382
|
+
VALUE result;
|
383
|
+
gchar *utf8;
|
384
|
+
gunichar2 *utf16;
|
385
|
+
glong len, items_written;
|
386
|
+
GError *error = NULL;
|
387
|
+
|
388
|
+
utf16 = (gunichar2 *)StringValueCStr(rb_utf16);
|
389
|
+
len = RSTRING_LEN(rb_utf16) / sizeof(*utf16);
|
390
|
+
|
391
|
+
utf8 = g_utf16_to_utf8(utf16, len, NULL, &items_written, &error);
|
392
|
+
|
393
|
+
if (error)
|
394
|
+
RAISE_GERROR(error);
|
395
|
+
|
396
|
+
result = rb_str_new(utf8, items_written * sizeof(*utf8));
|
397
|
+
g_free(utf8);
|
398
|
+
return result;
|
399
|
+
}
|
400
|
+
|
401
|
+
static VALUE
|
402
|
+
rbglib_m_ucs4_to_utf16(VALUE self, VALUE rb_ucs4)
|
403
|
+
{
|
404
|
+
VALUE result;
|
405
|
+
gunichar *ucs4;
|
406
|
+
gunichar2 *utf16;
|
407
|
+
glong len, items_written;
|
408
|
+
GError *error = NULL;
|
409
|
+
|
410
|
+
ucs4 = (gunichar *)StringValuePtr(rb_ucs4);
|
411
|
+
len = RSTRING_LEN(rb_ucs4) / sizeof(*ucs4);
|
412
|
+
|
413
|
+
utf16 = g_ucs4_to_utf16(ucs4, len, NULL, &items_written, &error);
|
414
|
+
|
415
|
+
if (error)
|
416
|
+
RAISE_GERROR(error);
|
417
|
+
|
418
|
+
result = rb_str_new((char *)utf16, items_written * sizeof(*utf16));
|
419
|
+
g_free(utf16);
|
420
|
+
return result;
|
421
|
+
}
|
422
|
+
|
423
|
+
static VALUE
|
424
|
+
rbglib_m_ucs4_to_utf8(VALUE self, VALUE rb_ucs4)
|
425
|
+
{
|
426
|
+
VALUE result;
|
427
|
+
gunichar *ucs4;
|
428
|
+
gchar *utf8;
|
429
|
+
glong len, items_written;
|
430
|
+
GError *error = NULL;
|
431
|
+
|
432
|
+
ucs4 = (gunichar *)StringValuePtr(rb_ucs4);
|
433
|
+
len = RSTRING_LEN(rb_ucs4) / sizeof(*ucs4);
|
434
|
+
|
435
|
+
utf8 = g_ucs4_to_utf8(ucs4, len, NULL, &items_written, &error);
|
436
|
+
|
437
|
+
if (error)
|
438
|
+
RAISE_GERROR(error);
|
439
|
+
|
440
|
+
result = rb_str_new(utf8, items_written);
|
441
|
+
g_free(utf8);
|
442
|
+
return result;
|
443
|
+
}
|
444
|
+
|
445
|
+
static VALUE
|
446
|
+
rbglib_m_unichar_to_utf8(VALUE self, VALUE unichar)
|
447
|
+
{
|
448
|
+
gchar utf8[6];
|
449
|
+
gint len;
|
450
|
+
|
451
|
+
len = g_unichar_to_utf8(NUM2UINT(unichar), utf8);
|
452
|
+
return rb_str_new(utf8, len);
|
453
|
+
}
|
454
|
+
|
455
|
+
void
|
456
|
+
Init_glib_unicode(void)
|
457
|
+
{
|
458
|
+
VALUE mGLibUniChar, mGLibUnicode, mGLibUTF8, mGLibUTF16, mGLibUCS4;
|
459
|
+
|
460
|
+
mGLibUniChar = rb_define_module_under(mGLib, "UniChar");
|
461
|
+
mGLibUnicode = rb_define_module_under(mGLib, "Unicode");
|
462
|
+
mGLibUTF8 = rb_define_module_under(mGLib, "UTF8");
|
463
|
+
mGLibUTF16 = rb_define_module_under(mGLib, "UTF16");
|
464
|
+
mGLibUCS4 = rb_define_module_under(mGLib, "UCS4");
|
465
|
+
|
466
|
+
/* GUnicodeType */
|
467
|
+
G_DEF_CLASS(G_TYPE_UNICODE_TYPE, "Type", mGLibUnicode);
|
468
|
+
G_DEF_CONSTANTS(mGLibUnicode, G_TYPE_UNICODE_TYPE, "G_UNICODE_");
|
469
|
+
/* GUnicodeBreakType */
|
470
|
+
G_DEF_CLASS(G_TYPE_UNICODE_BREAK_TYPE, "BreakType", mGLibUnicode);
|
471
|
+
G_DEF_CONSTANTS(mGLibUnicode, G_TYPE_UNICODE_BREAK_TYPE, "G_UNICODE_");
|
472
|
+
|
473
|
+
#if GLIB_CHECK_VERSION(2,14,0)
|
474
|
+
/* GUnicodeScript */
|
475
|
+
G_DEF_CLASS(G_TYPE_UNICODE_SCRIPT, "Script", mGLibUnicode);
|
476
|
+
G_DEF_CONSTANTS(mGLibUnicode, G_TYPE_UNICODE_SCRIPT, "G_UNICODE_");
|
477
|
+
#endif
|
478
|
+
|
479
|
+
G_DEF_CLASS(G_TYPE_NORMALIZE_MODE, "NormalizeMode", mGLib);
|
480
|
+
|
481
|
+
rb_define_module_function(mGLib, "charset", rbglib_m_charset, 0);
|
482
|
+
|
483
|
+
rb_define_module_function(mGLibUniChar, "alnum?",
|
484
|
+
rbglib_m_unichar_isalnum, 1);
|
485
|
+
rb_define_module_function(mGLibUniChar, "alpha?",
|
486
|
+
rbglib_m_unichar_isalpha, 1);
|
487
|
+
rb_define_module_function(mGLibUniChar, "cntrl?",
|
488
|
+
rbglib_m_unichar_iscntrl, 1);
|
489
|
+
rb_define_module_function(mGLibUniChar, "digit?",
|
490
|
+
rbglib_m_unichar_isdigit, 1);
|
491
|
+
rb_define_module_function(mGLibUniChar, "graph?",
|
492
|
+
rbglib_m_unichar_isgraph, 1);
|
493
|
+
rb_define_module_function(mGLibUniChar, "lower?",
|
494
|
+
rbglib_m_unichar_islower, 1);
|
495
|
+
rb_define_module_function(mGLibUniChar, "print?",
|
496
|
+
rbglib_m_unichar_isprint, 1);
|
497
|
+
rb_define_module_function(mGLibUniChar, "punct?",
|
498
|
+
rbglib_m_unichar_ispunct, 1);
|
499
|
+
rb_define_module_function(mGLibUniChar, "space?",
|
500
|
+
rbglib_m_unichar_isspace, 1);
|
501
|
+
rb_define_module_function(mGLibUniChar, "upper?",
|
502
|
+
rbglib_m_unichar_isupper, 1);
|
503
|
+
rb_define_module_function(mGLibUniChar, "xdigit?",
|
504
|
+
rbglib_m_unichar_isxdigit, 1);
|
505
|
+
rb_define_module_function(mGLibUniChar, "title?",
|
506
|
+
rbglib_m_unichar_istitle, 1);
|
507
|
+
rb_define_module_function(mGLibUniChar, "defined?",
|
508
|
+
rbglib_m_unichar_isdefined, 1);
|
509
|
+
rb_define_module_function(mGLibUniChar, "wide?",
|
510
|
+
rbglib_m_unichar_iswide, 1);
|
511
|
+
#if GLIB_CHECK_VERSION(2,12,0)
|
512
|
+
rb_define_module_function(mGLibUniChar, "wide_cjk?",
|
513
|
+
rbglib_m_unichar_iswide_cjk, 1);
|
514
|
+
#endif
|
515
|
+
|
516
|
+
rb_define_module_function(mGLibUniChar, "to_upper",
|
517
|
+
rbglib_m_unichar_toupper, 1);
|
518
|
+
rb_define_module_function(mGLibUniChar, "to_lower",
|
519
|
+
rbglib_m_unichar_tolower, 1);
|
520
|
+
rb_define_module_function(mGLibUniChar, "to_title",
|
521
|
+
rbglib_m_unichar_totitle, 1);
|
522
|
+
|
523
|
+
rb_define_module_function(mGLibUniChar, "digit_value",
|
524
|
+
rbglib_m_unichar_digit_value, 1);
|
525
|
+
rb_define_module_function(mGLibUniChar, "xdigit_value",
|
526
|
+
rbglib_m_unichar_xdigit_value, 1);
|
527
|
+
|
528
|
+
rb_define_module_function(mGLibUniChar, "type", rbglib_m_unichar_type, 1);
|
529
|
+
rb_define_module_function(mGLibUniChar, "break_type",
|
530
|
+
rbglib_m_unichar_break_type, 1);
|
531
|
+
|
532
|
+
rb_define_singleton_method(mGLibUnicode, "canonical_ordering",
|
533
|
+
rbglib_m_unicode_canonical_ordering, 1);
|
534
|
+
rb_define_singleton_method(mGLibUnicode, "canonical_decomposition",
|
535
|
+
rbglib_m_unicode_canonical_decomposition, 1);
|
536
|
+
|
537
|
+
#if GLIB_CHECK_VERSION(2,4,0)
|
538
|
+
rb_define_module_function(mGLibUniChar, "get_mirror_char",
|
539
|
+
rbglib_m_unichar_get_mirror_char, 1);
|
540
|
+
#endif
|
541
|
+
|
542
|
+
#if GLIB_CHECK_VERSION(2,14,0)
|
543
|
+
rb_define_module_function(mGLibUniChar, "combining_class",
|
544
|
+
rbglib_m_unichar_combining_class, 1);
|
545
|
+
rb_define_module_function(mGLibUniChar, "get_script",
|
546
|
+
rbglib_m_unichar_get_script, 1);
|
547
|
+
rb_define_module_function(mGLibUniChar, "mark?",
|
548
|
+
rbglib_m_unichar_ismark, 1);
|
549
|
+
rb_define_module_function(mGLibUniChar, "zero_width?",
|
550
|
+
rbglib_m_unichar_iszerowidth, 1);
|
551
|
+
#endif
|
552
|
+
|
553
|
+
/*
|
554
|
+
Not implemented.
|
555
|
+
g_utf8_next_char
|
556
|
+
*/
|
557
|
+
rb_define_module_function(mGLibUTF8, "get_char",
|
558
|
+
rbglib_m_utf8_get_char, -1);
|
559
|
+
/*
|
560
|
+
Not implemented.
|
561
|
+
g_utf8_offset_to_pointer
|
562
|
+
g_utf8_pointer_to_offset
|
563
|
+
g_utf8_prev_char
|
564
|
+
g_utf8_find_next_char
|
565
|
+
g_utf8_find_prev_char
|
566
|
+
g_utf8_prev_char
|
567
|
+
*/
|
568
|
+
rb_define_module_function(mGLibUTF8, "size", rbglib_m_utf8_strlen, 1);
|
569
|
+
/*
|
570
|
+
Not implemented.
|
571
|
+
g_utf8_strncpy
|
572
|
+
g_utf8_strrchr
|
573
|
+
*/
|
574
|
+
rb_define_module_function(mGLibUTF8, "reverse",
|
575
|
+
rbglib_m_utf8_strreverse, 1);
|
576
|
+
rb_define_module_function(mGLibUTF8, "validate",
|
577
|
+
rbglib_m_utf8_validate, 1);
|
578
|
+
|
579
|
+
rb_define_module_function(mGLibUTF8, "upcase",
|
580
|
+
rbglib_m_utf8_strup, 1);
|
581
|
+
rb_define_module_function(mGLibUTF8, "downcase",
|
582
|
+
rbglib_m_utf8_strdown, 1);
|
583
|
+
rb_define_module_function(mGLibUTF8, "casefold",
|
584
|
+
rbglib_m_utf8_casefold, 1);
|
585
|
+
|
586
|
+
rb_define_module_function(mGLibUTF8, "normalize",
|
587
|
+
rbglib_m_utf8_normalize, -1);
|
588
|
+
|
589
|
+
rb_define_module_function(mGLibUTF8, "collate",
|
590
|
+
rbglib_m_utf8_collate, 2);
|
591
|
+
rb_define_module_function(mGLibUTF8, "collate_key",
|
592
|
+
rbglib_m_utf8_collate_key, -1);
|
593
|
+
|
594
|
+
rb_define_module_function(mGLibUTF8, "to_utf16",
|
595
|
+
rbglib_m_utf8_to_utf16, 1);
|
596
|
+
rb_define_module_function(mGLibUTF8, "to_ucs4",
|
597
|
+
rbglib_m_utf8_to_ucs4, -1);
|
598
|
+
|
599
|
+
rb_define_module_function(mGLibUTF16, "to_ucs4",
|
600
|
+
rbglib_m_utf16_to_ucs4, 1);
|
601
|
+
rb_define_module_function(mGLibUTF16, "to_utf8",
|
602
|
+
rbglib_m_utf16_to_utf8, 1);
|
603
|
+
|
604
|
+
rb_define_module_function(mGLibUCS4, "to_utf16",
|
605
|
+
rbglib_m_ucs4_to_utf16, 1);
|
606
|
+
rb_define_module_function(mGLibUCS4, "to_utf8",
|
607
|
+
rbglib_m_ucs4_to_utf8, 1);
|
608
|
+
|
609
|
+
rb_define_module_function(mGLibUniChar, "to_utf8",
|
610
|
+
rbglib_m_unichar_to_utf8, 1);
|
611
|
+
}
|