gettextpo 0.2.0 → 0.2.1

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/src/mrb_gettextpo.c DELETED
@@ -1,942 +0,0 @@
1
- /**
2
- * Copyright (C) 2026 gemmaro
3
- *
4
- * This program is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * This program is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
- */
17
-
18
- #include "mrb_gettextpo.h"
19
- #include <gettext-po.h>
20
- #include <mruby.h>
21
- #include <mruby/array.h>
22
- #include <mruby/boxing_word.h>
23
- #include <mruby/class.h>
24
- #include <mruby/data.h>
25
- #include <mruby/hash.h>
26
- #include <mruby/object.h>
27
- #include <mruby/presym.h>
28
- #include <mruby/range.h>
29
- #include <mruby/value.h>
30
- #include <mruby/variable.h>
31
- #include <stdbool.h>
32
- #include <stddef.h>
33
- #include <stdio.h>
34
- #include <stdlib.h>
35
-
36
- #define DONE mrb_gc_arena_restore (mrb, 0);
37
-
38
- #define MODULE mrb_module_get_id (mrb, MRB_SYM (GettextPO))
39
- #define MESSAGE mrb_class_get_under_id (mrb, MODULE, MRB_SYM (Message))
40
- #define FLAG_ITERATOR \
41
- mrb_class_get_under_id (mrb, MODULE, MRB_SYM (FlagIterator))
42
- #define ERROR mrb_class_get_under_id (mrb, MODULE, MRB_SYM (Error))
43
-
44
- #define NIL mrb_nil_value ()
45
- #define STOP_ITERATION mrb_class_get_id (mrb, MRB_SYM (StopIteration))
46
-
47
- static mrb_value
48
- gettextpo_m_header_entry_value (mrb_state *mrb, mrb_value klass)
49
- {
50
- char *header = NULL, *field = NULL;
51
- mrb_get_args (mrb, "zz", &header, &field);
52
-
53
- char *string = po_header_field (header, field);
54
- if (string)
55
- {
56
- mrb_value value = mrb_str_new_cstr (mrb, string);
57
- free (string);
58
- return value;
59
- }
60
- else
61
- return NIL;
62
- }
63
-
64
- static mrb_value
65
- gettextpo_m_header_with_updated_entry_value (mrb_state *mrb, mrb_value klass)
66
- {
67
- char *header = NULL, *field = NULL, *value = NULL;
68
- mrb_get_args (mrb, "zzz", &header, &field, &value);
69
-
70
- char *updated_header = po_header_set_field (header, field, value);
71
- mrb_value header_value = mrb_str_new_cstr (mrb, updated_header);
72
- free (updated_header);
73
- return header_value;
74
- }
75
-
76
- static void
77
- gettextpo_flag_iterator_free (mrb_state *mrb, void *iter)
78
- {
79
- if (iter)
80
- po_flag_iterator_free (iter);
81
- }
82
-
83
- static const struct mrb_data_type gettextpo_flag_iterator_data_type = {
84
- .struct_name = "gettextpo flag iterator",
85
- .dfree = gettextpo_flag_iterator_free,
86
- };
87
-
88
- static mrb_value
89
- gettextpo_flag_iterator_m_next (mrb_state *mrb, mrb_value self)
90
- {
91
- const char *flag = po_flag_next (DATA_PTR (self));
92
- if (flag)
93
- return mrb_str_new_cstr (mrb, flag);
94
- else
95
- mrb_raise (mrb, STOP_ITERATION, "no more flag");
96
- }
97
-
98
- static void
99
- gettextpo_message_free (mrb_state *mrb, void *message)
100
- {
101
- /* NOTE: memory is freed by libgettextpo file struct */
102
- }
103
-
104
- static const struct mrb_data_type gettextpo_message_data_type = {
105
- .struct_name = "gettextpo message",
106
- .dfree = gettextpo_message_free,
107
- };
108
-
109
- #define OPTIONAL_STRING_GETTER(field) \
110
- static mrb_value gettextpo_message_m_##field (mrb_state *mrb, \
111
- mrb_value self) \
112
- { \
113
- const char *string = po_message_##field (DATA_PTR (self)); \
114
- return string ? mrb_str_new_cstr (mrb, string) : NIL; \
115
- }
116
- #define OPTIONAL_STRING_SETTER(field) \
117
- static mrb_value gettextpo_message_m_##field##_set (mrb_state *mrb, \
118
- mrb_value self) \
119
- { \
120
- char *string = NULL; \
121
- mrb_get_args (mrb, "z!", &string); \
122
- po_message_set_##field (DATA_PTR (self), string); \
123
- return NIL; \
124
- }
125
-
126
- OPTIONAL_STRING_GETTER (msgctxt);
127
- OPTIONAL_STRING_SETTER (msgctxt);
128
-
129
- #define STRING_GETTER(field) \
130
- static mrb_value gettextpo_message_m_##field (mrb_state *mrb, \
131
- mrb_value self) \
132
- { \
133
- return mrb_str_new_cstr (mrb, po_message_##field (DATA_PTR (self))); \
134
- }
135
- #define STRING_SETTER(field) \
136
- static mrb_value gettextpo_message_m_##field##_set (mrb_state *mrb, \
137
- mrb_value self) \
138
- { \
139
- char *string = NULL; \
140
- mrb_get_args (mrb, "z", &string); \
141
- po_message_set_##field (DATA_PTR (self), string); \
142
- return NIL; \
143
- }
144
-
145
- STRING_GETTER (msgid);
146
- STRING_SETTER (msgid);
147
- STRING_GETTER (msgid_plural);
148
- STRING_SETTER (msgid_plural);
149
- STRING_GETTER (msgstr);
150
- STRING_SETTER (msgstr);
151
-
152
- static mrb_value
153
- gettextpo_message_m_msgstr_plural (mrb_state *mrb, mrb_value self)
154
- {
155
- mrb_int index = 0;
156
- mrb_get_args (mrb, "i", &index);
157
-
158
- const char *msgstr_plural
159
- = po_message_msgstr_plural (DATA_PTR (self), index);
160
- return msgstr_plural ? mrb_str_new_cstr (mrb, msgstr_plural) : NIL;
161
- }
162
-
163
- static mrb_value
164
- gettextpo_message_m_msgstr_plural_set (mrb_state *mrb, mrb_value self)
165
- {
166
- int index = 0;
167
- char *msgstr_plural = NULL;
168
- mrb_get_args (mrb, "iz!", &index, &msgstr_plural);
169
-
170
- po_message_set_msgstr_plural (DATA_PTR (self), index, msgstr_plural);
171
- return NIL;
172
- }
173
-
174
- STRING_GETTER (comments);
175
- STRING_SETTER (comments);
176
- STRING_GETTER (extracted_comments);
177
- STRING_SETTER (extracted_comments);
178
- OPTIONAL_STRING_GETTER (prev_msgctxt);
179
- OPTIONAL_STRING_SETTER (prev_msgctxt);
180
- OPTIONAL_STRING_GETTER (prev_msgid);
181
- OPTIONAL_STRING_SETTER (prev_msgid);
182
- OPTIONAL_STRING_GETTER (prev_msgid_plural);
183
- OPTIONAL_STRING_SETTER (prev_msgid_plural);
184
-
185
- #define BOOL_GETTER(field) \
186
- static mrb_value gettextpo_message_m_##field (mrb_state *mrb, \
187
- mrb_value self) \
188
- { \
189
- return mrb_bool_value (po_message_is_##field (DATA_PTR (self))); \
190
- }
191
- #define BOOL_SETTER(field) \
192
- static mrb_value gettextpo_message_m_##field##_set (mrb_state *mrb, \
193
- mrb_value self) \
194
- { \
195
- bool boolean = true; \
196
- mrb_get_args (mrb, "b", &boolean); \
197
- \
198
- po_message_set_##field (DATA_PTR (self), boolean); \
199
- return NIL; \
200
- }
201
-
202
- BOOL_GETTER (obsolete);
203
- BOOL_SETTER (obsolete);
204
- BOOL_GETTER (fuzzy);
205
- BOOL_SETTER (fuzzy);
206
-
207
- #define QUERY_FLAG(name) \
208
- static mrb_value gettextpo_message_m_##name##_flag_q (mrb_state *mrb, \
209
- mrb_value self) \
210
- { \
211
- char *flag = NULL; \
212
- mrb_get_args (mrb, "z", &flag); \
213
- \
214
- return mrb_bool_value ( \
215
- po_message_has_##name##_flag (DATA_PTR (self), flag)); \
216
- }
217
- #define UPDATE_FLAG(name) \
218
- static mrb_value gettextpo_message_m_##name##_flag_update (mrb_state *mrb, \
219
- mrb_value self) \
220
- { \
221
- char *flag = NULL; \
222
- mrb_sym table[] = { MRB_SYM (set) }; \
223
- size_t num = sizeof (table) / sizeof (table[0]); \
224
- mrb_value values[] = { mrb_undef_value () }; \
225
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values }; \
226
- mrb_get_args (mrb, "z:", &flag, &kwargs); \
227
- \
228
- po_message_set_##name##_flag (DATA_PTR (self), flag, \
229
- mrb_undef_p (values[0]) \
230
- || mrb_test (values[0])); \
231
- return mrb_nil_value (); \
232
- }
233
- #define FLAG_ITERATOR_METHOD(name) \
234
- static mrb_value gettextpo_message_m_##name##_flag_iterator ( \
235
- mrb_state *mrb, mrb_value self) \
236
- { \
237
- return mrb_obj_value (mrb_data_object_alloc ( \
238
- mrb, FLAG_ITERATOR, \
239
- po_message_##name##_flags_iterator (DATA_PTR (self)), \
240
- &gettextpo_flag_iterator_data_type)); \
241
- }
242
-
243
- QUERY_FLAG (workflow);
244
- UPDATE_FLAG (workflow);
245
- FLAG_ITERATOR_METHOD (workflow);
246
-
247
- static mrb_value
248
- gettextpo_message_m_format_q (mrb_state *mrb, mrb_value self)
249
- {
250
- char *format = NULL;
251
- mrb_get_args (mrb, "z", &format);
252
-
253
- return mrb_bool_value (po_message_is_format (DATA_PTR (self), format));
254
- }
255
-
256
- static mrb_value
257
- gettextpo_message_m_format (mrb_state *mrb, mrb_value self)
258
- {
259
- char *format = NULL;
260
- mrb_get_args (mrb, "z", &format);
261
-
262
- switch (po_message_get_format (DATA_PTR (self), format))
263
- {
264
- case 1:
265
- return mrb_true_value ();
266
- break;
267
- case 0:
268
- return mrb_false_value ();
269
- break;
270
- case -1:
271
- return mrb_nil_value ();
272
- break;
273
- default:
274
- mrb_raise (mrb, ERROR, "unreachable");
275
- }
276
- }
277
-
278
- static mrb_value
279
- gettextpo_message_m_format_set (mrb_state *mrb, mrb_value self)
280
- {
281
- char *format = NULL;
282
- mrb_sym table[] = { MRB_SYM (opposite), MRB_SYM (remove) };
283
- size_t num = sizeof (table) / sizeof (table[0]);
284
- mrb_value values[] = { mrb_false_value (), mrb_false_value () };
285
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
286
- mrb_get_args (mrb, "z:", &format, &kwargs);
287
-
288
- bool opposite = !mrb_undef_p (values[0]) && mrb_test (values[0]);
289
- bool remove = !mrb_undef_p (values[1]) && mrb_test (values[1]);
290
- if (opposite && remove)
291
- mrb_raise (mrb, ERROR,
292
- "opposite and remove cannot be set at the same time");
293
- po_message_set_format (DATA_PTR (self), format,
294
- opposite ? 0 : (remove ? -1 : 1));
295
- return NIL;
296
- }
297
-
298
- QUERY_FLAG (sticky);
299
- UPDATE_FLAG (sticky);
300
- FLAG_ITERATOR_METHOD (sticky);
301
-
302
- static mrb_value
303
- gettextpo_message_m_range (mrb_state *mrb, mrb_value self)
304
- {
305
- mrb_value range;
306
- mrb_get_args (mrb, "o", &range);
307
-
308
- int min = mrb_integer (mrb_range_beg (mrb, range));
309
- int max = mrb_integer (mrb_range_end (mrb, range));
310
- return mrb_bool_value (po_message_is_range (DATA_PTR (self), &min, &max));
311
- }
312
-
313
- static mrb_value
314
- gettextpo_message_m_range_set (mrb_state *mrb, mrb_value self)
315
- {
316
- mrb_value range;
317
- mrb_get_args (mrb, "o", &range);
318
-
319
- po_message_set_range (DATA_PTR (self),
320
- mrb_integer (mrb_range_beg (mrb, range)),
321
- mrb_integer (mrb_range_end (mrb, range)));
322
- return NIL;
323
- }
324
-
325
- static struct
326
- {
327
- bool error;
328
- mrb_value *xerror;
329
- mrb_value *xerror2;
330
- mrb_state *state;
331
- mrb_value *file;
332
- } gettextpo_xerror_context = {};
333
-
334
- static void
335
- gettextpo_xerror_context_reset (mrb_state *state)
336
- {
337
- gettextpo_xerror_context.error = false;
338
- gettextpo_xerror_context.xerror = NULL;
339
- gettextpo_xerror_context.xerror2 = NULL;
340
- gettextpo_xerror_context.state = state;
341
- gettextpo_xerror_context.file = NULL;
342
- }
343
-
344
- static void
345
- gettextpo_xerror (const int severity, const po_message_t message,
346
- const char *const filename, const size_t lineno,
347
- const size_t column, const int multiline_p,
348
- const char *const message_text)
349
- {
350
- gettextpo_xerror_context.error = true;
351
- if (!gettextpo_xerror_context.xerror
352
- || mrb_nil_p (*gettextpo_xerror_context.xerror)
353
- || mrb_undef_p (*gettextpo_xerror_context.xerror))
354
- return;
355
-
356
- mrb_state *mrb = gettextpo_xerror_context.state;
357
- mrb_value kwargs = mrb_hash_new (mrb);
358
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (severity)),
359
- mrb_int_value (mrb, severity));
360
- if (message)
361
- {
362
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
363
- mrb, MESSAGE, message, &gettextpo_message_data_type));
364
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
365
- *gettextpo_xerror_context.file);
366
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message)), value);
367
- }
368
- if (filename)
369
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (filename)),
370
- mrb_str_new_cstr (mrb, filename));
371
- if (filename && (lineno != (size_t)(-1)))
372
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (lineno)),
373
- mrb_int_value (mrb, lineno));
374
- if (filename && lineno != (size_t)(-1) && column != (size_t)(-1))
375
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (column)),
376
- mrb_int_value (mrb, column));
377
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (multiline)),
378
- mrb_bool_value (multiline_p));
379
- if (message_text)
380
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message_text)),
381
- mrb_str_new_cstr (mrb, message_text));
382
- /* If someday proc calling supports keyword arguments, update
383
- this. */
384
- mrb_funcall_id (mrb, *gettextpo_xerror_context.xerror, MRB_SYM (call), 1,
385
- kwargs);
386
-
387
- if (severity == PO_SEVERITY_FATAL_ERROR)
388
- abort ();
389
- }
390
-
391
- static void
392
- gettextpo_xerror2 (const int severity, const po_message_t message1,
393
- const char *const filename1, const size_t lineno1,
394
- const size_t column1, const int multiline_p1,
395
- const char *const message_text1,
396
- const po_message_t message2, const char *const filename2,
397
- const size_t lineno2, const size_t column2,
398
- const int multiline_p2, const char *const message_text2)
399
- {
400
- gettextpo_xerror_context.error = true;
401
- if (!gettextpo_xerror_context.xerror2
402
- || mrb_nil_p (*gettextpo_xerror_context.xerror2)
403
- || mrb_undef_p (*gettextpo_xerror_context.xerror2))
404
- return;
405
-
406
- mrb_state *mrb = gettextpo_xerror_context.state;
407
- mrb_value kwargs = mrb_hash_new (mrb);
408
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (severity)),
409
- mrb_int_value (mrb, severity));
410
- if (message1)
411
- {
412
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
413
- mrb, MESSAGE, message1, &gettextpo_message_data_type));
414
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
415
- *gettextpo_xerror_context.file);
416
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message1)), value);
417
- }
418
- if (filename1)
419
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (filename1)),
420
- mrb_str_new_cstr (mrb, filename1));
421
- if (filename1 && (lineno1 != (size_t)(-1)))
422
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (lineno1)),
423
- mrb_int_value (mrb, lineno1));
424
- if (filename1 && lineno1 != (size_t)(-1) && column1 != (size_t)(-1))
425
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (column1)),
426
- mrb_int_value (mrb, column1));
427
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (multiline1)),
428
- mrb_bool_value (multiline_p1));
429
- if (message_text1)
430
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message_text1)),
431
- mrb_str_new_cstr (mrb, message_text1));
432
- if (message2)
433
- {
434
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
435
- mrb, MESSAGE, message2, &gettextpo_message_data_type));
436
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
437
- *gettextpo_xerror_context.file);
438
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message2)), value);
439
- }
440
- if (filename2)
441
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (filename2)),
442
- mrb_str_new_cstr (mrb, filename2));
443
- if (filename2 && (lineno2 != (size_t)(-1)))
444
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (lineno2)),
445
- mrb_int_value (mrb, lineno2));
446
- if (filename2 && lineno2 != (size_t)(-1) && column2 != (size_t)(-1))
447
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (column2)),
448
- mrb_int_value (mrb, column2));
449
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (multiline2)),
450
- mrb_bool_value (multiline_p2));
451
- if (message_text2)
452
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message_text2)),
453
- mrb_str_new_cstr (mrb, message_text2));
454
- /* If someday proc calling supports keyword arguments, update
455
- this. */
456
- mrb_funcall_id (mrb, *gettextpo_xerror_context.xerror2, MRB_SYM (call), 1,
457
- kwargs);
458
-
459
- if (severity == PO_SEVERITY_FATAL_ERROR)
460
- abort ();
461
- }
462
-
463
- static const struct po_xerror_handler gettextpo_xerror_handler = {
464
- .xerror = gettextpo_xerror,
465
- .xerror2 = gettextpo_xerror2,
466
- };
467
-
468
- static mrb_value
469
- gettextpo_m_formats (mrb_state *mrb, mrb_value self)
470
- {
471
- mrb_value value = mrb_ary_new (mrb);
472
- const char *const *formats = po_format_list ();
473
- for (size_t index = 0; formats[index]; index++)
474
- mrb_ary_push (mrb, value, mrb_str_new_cstr (mrb, formats[index]));
475
- return value;
476
- }
477
-
478
- static mrb_value
479
- gettextpo_m_format_pretty_name (mrb_state *mrb, mrb_value self)
480
- {
481
- char *format = NULL;
482
- mrb_get_args (mrb, "z", &format);
483
- const char *name = po_format_pretty_name (format);
484
- return name ? mrb_str_new_cstr (mrb, name) : NIL;
485
- }
486
-
487
- static void
488
- gettextpo_file_free (mrb_state *mrb, void *file)
489
- {
490
- if (file)
491
- po_file_free (file);
492
- }
493
-
494
- static const struct mrb_data_type gettextpo_file_data_type = {
495
- .struct_name = "gettextpo file",
496
- .dfree = gettextpo_file_free,
497
- };
498
-
499
- static mrb_value
500
- gettextpo_file_m_initialize (mrb_state *mrb, mrb_value self)
501
- {
502
- mrb_data_init (self, po_file_create (), &gettextpo_file_data_type);
503
- return self;
504
- }
505
-
506
- /**
507
- * call-seq: read(filename)
508
- *
509
- * +filename+ must be resolved.
510
- */
511
- static mrb_value
512
- gettextpo_file_m_read (mrb_state *mrb, mrb_value klass)
513
- {
514
- char *filename = NULL;
515
- mrb_sym table[] = { MRB_SYM (xerror), MRB_SYM (xerror2) };
516
- size_t num = sizeof (table) / sizeof (table[0]);
517
- mrb_value values[] = { NIL, NIL };
518
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
519
- mrb_get_args (mrb, "z:", &filename, &kwargs);
520
-
521
- gettextpo_xerror_context_reset (mrb);
522
- gettextpo_xerror_context.xerror = &values[0];
523
- gettextpo_xerror_context.xerror2 = &values[1];
524
- mrb_value file = mrb_obj_value (mrb_data_object_alloc (
525
- mrb, mrb_class_ptr (klass), NULL, &gettextpo_file_data_type));
526
- gettextpo_xerror_context.file = &file;
527
-
528
- po_file_t po_file = po_file_read (filename, &gettextpo_xerror_handler);
529
- if (gettextpo_xerror_context.error || !po_file)
530
- mrb_raise (mrb, ERROR, "failed to read file");
531
- DATA_PTR (file) = po_file;
532
- return file;
533
- }
534
-
535
- static mrb_value
536
- gettextpo_file_m_write (mrb_state *mrb, mrb_value file)
537
- {
538
- char *filename = NULL;
539
- mrb_sym table[] = { MRB_SYM (xerror), MRB_SYM (xerror2) };
540
- size_t num = sizeof (table) / sizeof (table[0]);
541
- mrb_value values[] = { NIL, NIL };
542
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
543
- mrb_get_args (mrb, "z:", &filename, &kwargs);
544
-
545
- gettextpo_xerror_context_reset (mrb);
546
- gettextpo_xerror_context.xerror = &values[0];
547
- gettextpo_xerror_context.xerror2 = &values[1];
548
- gettextpo_xerror_context.file = &file;
549
-
550
- po_file_write (DATA_PTR (file), filename, &gettextpo_xerror_handler);
551
- if (gettextpo_xerror_context.error)
552
- mrb_raise (mrb, ERROR, "failed to write file");
553
- return NIL;
554
- }
555
-
556
- static mrb_value
557
- gettextpo_file_m_domains (mrb_state *mrb, mrb_value file)
558
- {
559
- const char *const *domains = po_file_domains (DATA_PTR (file));
560
- mrb_value value = mrb_ary_new (mrb);
561
- for (size_t index = 0; domains[index]; index++)
562
- mrb_ary_push (mrb, value, mrb_str_new_cstr (mrb, domains[index]));
563
- return value;
564
- }
565
-
566
- static mrb_value
567
- gettextpo_file_m_domain_header (mrb_state *mrb, mrb_value file)
568
- {
569
- char *domain = NULL;
570
- mrb_get_args (mrb, "|z", &domain);
571
-
572
- const char *header = po_file_domain_header (DATA_PTR (file), domain);
573
- return header ? mrb_str_new_cstr (mrb, header) : NIL;
574
- }
575
-
576
- static void
577
- gettextpo_message_iterator_free (mrb_state *mrb, void *message_iterator)
578
- {
579
- if (message_iterator)
580
- po_message_iterator_free (message_iterator);
581
- }
582
-
583
- static const struct mrb_data_type gettextpo_message_iterator_data_type = {
584
- .struct_name = "gettextpo message iterator",
585
- .dfree = gettextpo_message_iterator_free,
586
- };
587
-
588
- static mrb_value
589
- gettextpo_file_m_message_iterator (mrb_state *mrb, mrb_value file)
590
- {
591
- const char *domain = NULL;
592
- mrb_get_args (mrb, "|z", &domain);
593
-
594
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
595
- mrb,
596
- mrb_class_get_under_id (mrb,
597
- mrb_module_get_id (mrb, MRB_SYM (GettextPO)),
598
- MRB_SYM (MessageIterator)),
599
- po_message_iterator (DATA_PTR (file), domain),
600
- &gettextpo_message_iterator_data_type));
601
- mrb_iv_set (mrb, value, MRB_IVSYM (file), file);
602
- return value;
603
- }
604
-
605
- static mrb_value
606
- gettextpo_message_iterator_m_next (mrb_state *mrb, mrb_value message_iterator)
607
- {
608
- po_message_t message = po_next_message (DATA_PTR (message_iterator));
609
- if (message)
610
- {
611
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
612
- mrb,
613
- mrb_class_get_under_id (mrb,
614
- mrb_module_get_id (mrb, MRB_SYM (GettextPO)),
615
- MRB_SYM (Message)),
616
- message, &gettextpo_message_data_type));
617
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
618
- mrb_iv_get (mrb, message_iterator, MRB_IVSYM (file)));
619
- return value;
620
- }
621
- else
622
- mrb_raise (mrb, STOP_ITERATION, "end of PO message iterator");
623
- }
624
-
625
- static mrb_value
626
- gettextpo_message_iterator_m_insert (mrb_state *mrb,
627
- mrb_value message_iterator)
628
- {
629
- char *msgid, *msgstr;
630
- mrb_get_args (mrb, "zz", &msgid, &msgstr);
631
-
632
- po_message_t message = po_message_create ();
633
- po_message_set_msgid (message, msgid);
634
- po_message_set_msgstr (message, msgstr);
635
- po_message_insert (DATA_PTR (message_iterator), message);
636
-
637
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
638
- mrb,
639
- mrb_class_get_under_id (mrb,
640
- mrb_module_get_id (mrb, MRB_SYM (GettextPO)),
641
- MRB_SYM (Message)),
642
- message, &gettextpo_message_data_type));
643
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
644
- mrb_iv_get (mrb, message_iterator, MRB_IVSYM (file)));
645
- return value;
646
- }
647
-
648
- static void
649
- gettextpo_filepos_free (mrb_state *mrb, void *filepos)
650
- {
651
- /* NOTE: filepos is freed by file struct */
652
- }
653
-
654
- static const mrb_data_type gettextpo_filepos_data_type = {
655
- .struct_name = "gettextpo filepos",
656
- .dfree = gettextpo_filepos_free,
657
- };
658
-
659
- static mrb_value
660
- gettextpo_message_m_filepos (mrb_state *mrb, mrb_value self)
661
- {
662
- mrb_int index = 0;
663
- mrb_get_args (mrb, "i", &index);
664
-
665
- po_filepos_t pos = po_message_filepos (DATA_PTR (self), index);
666
- if (pos)
667
- {
668
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
669
- mrb, mrb_class_get_under_id (mrb, MODULE, MRB_SYM (FilePos)), pos,
670
- &gettextpo_filepos_data_type));
671
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
672
- mrb_iv_get (mrb, self, MRB_IVSYM (file)));
673
- return value;
674
- }
675
- else
676
- return NIL;
677
- }
678
-
679
- static mrb_value
680
- gettextpo_filepos_m_file (mrb_state *mrb, mrb_value self)
681
- {
682
- const char *file = po_filepos_file (DATA_PTR (self));
683
- return file ? mrb_str_new_cstr (mrb, file) : NIL;
684
- }
685
-
686
- static mrb_value
687
- gettextpo_filepos_m_start_line (mrb_state *mrb, mrb_value self)
688
- {
689
- size_t start_line = po_filepos_start_line (DATA_PTR (self));
690
- return start_line == (size_t)(-1) ? NIL : mrb_int_value (mrb, start_line);
691
- }
692
-
693
- static mrb_value
694
- gettextpo_message_m_add_filepos (mrb_state *mrb, mrb_value self)
695
- {
696
- char *file = NULL;
697
- size_t start_line = 0;
698
- mrb_get_args (mrb, "zi", &file, &start_line);
699
-
700
- po_message_add_filepos (DATA_PTR (self), file, start_line);
701
- return NIL;
702
- }
703
-
704
- static mrb_value
705
- gettextpo_message_m_remove_filepos (mrb_state *mrb, mrb_value self)
706
- {
707
- mrb_int start_line = 0;
708
- mrb_get_args (mrb, "i", &start_line);
709
-
710
- po_message_remove_filepos (DATA_PTR (self), start_line);
711
- return NIL;
712
- }
713
-
714
- static mrb_value
715
- gettextpo_file_m_check_all (mrb_state *mrb, mrb_value self)
716
- {
717
- mrb_sym table[] = { MRB_SYM (xerror), MRB_SYM (xerror2) };
718
- size_t num = sizeof (table) / sizeof (table[0]);
719
- mrb_value values[] = { NIL, NIL };
720
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
721
- mrb_get_args (mrb, ":", &kwargs);
722
-
723
- gettextpo_xerror_context_reset (mrb);
724
- gettextpo_xerror_context.xerror = &values[0];
725
- gettextpo_xerror_context.xerror2 = &values[1];
726
- gettextpo_xerror_context.file = &self;
727
-
728
- po_file_check_all (DATA_PTR (self), &gettextpo_xerror_handler);
729
- if (gettextpo_xerror_context.error)
730
- mrb_raise (mrb, ERROR, "check all for file failed");
731
- return NIL;
732
- }
733
-
734
- static mrb_value
735
- gettextpo_message_m_check_all (mrb_state *mrb, mrb_value self)
736
- {
737
- mrb_value iterator;
738
- mrb_sym table[] = { MRB_SYM (xerror), MRB_SYM (xerror2) };
739
- size_t num = sizeof (table) / sizeof (table[0]);
740
- mrb_value values[] = { NIL, NIL };
741
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
742
- mrb_get_args (mrb, "o:", &iterator, &kwargs);
743
-
744
- gettextpo_xerror_context_reset (mrb);
745
- gettextpo_xerror_context.xerror = &values[0];
746
- gettextpo_xerror_context.xerror2 = &values[1];
747
- mrb_value file = mrb_iv_get (mrb, self, MRB_IVSYM (file));
748
- gettextpo_xerror_context.file = &file;
749
-
750
- po_message_check_all (DATA_PTR (self), DATA_PTR (iterator),
751
- &gettextpo_xerror_handler);
752
- if (gettextpo_xerror_context.error)
753
- mrb_raise (mrb, ERROR, "check all for message failed");
754
- return NIL;
755
- }
756
-
757
- static mrb_value
758
- gettextpo_message_m_check_format (mrb_state *mrb, mrb_value self)
759
- {
760
- mrb_sym table[] = { MRB_SYM (xerror), MRB_SYM (xerror2) };
761
- size_t num = sizeof (table) / sizeof (table[0]);
762
- mrb_value values[] = { NIL, NIL };
763
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
764
- mrb_get_args (mrb, ":", &kwargs);
765
-
766
- gettextpo_xerror_context_reset (mrb);
767
- gettextpo_xerror_context.xerror = &values[0];
768
- gettextpo_xerror_context.xerror2 = &values[1];
769
- mrb_value file = mrb_iv_get (mrb, self, MRB_IVSYM (file));
770
- gettextpo_xerror_context.file = &file;
771
-
772
- po_message_check_format (DATA_PTR (self), &gettextpo_xerror_handler);
773
- if (gettextpo_xerror_context.error)
774
- mrb_raise (mrb, ERROR, "check format for message failed");
775
- return NIL;
776
- }
777
-
778
- void
779
- mrb_mruby_gettextpo_gem_init (mrb_state *const mrb)
780
- {
781
- struct RClass *const mrb_mGettextPO
782
- = mrb_define_module_id (mrb, MRB_SYM (GettextPO));
783
- mrb_define_const_id (mrb, mrb_mGettextPO, MRB_SYM (LIBGETTEXTPO_VERSION),
784
- mrb_int_value (mrb, libgettextpo_version));
785
- mrb_define_const_id (mrb, mrb_mGettextPO, MRB_SYM (SEVERITY_WARNING),
786
- mrb_int_value (mrb, PO_SEVERITY_WARNING));
787
- mrb_define_const_id (mrb, mrb_mGettextPO, MRB_SYM (SEVERITY_ERROR),
788
- mrb_int_value (mrb, PO_SEVERITY_ERROR));
789
- mrb_define_const_id (mrb, mrb_mGettextPO, MRB_SYM (SEVERITY_FATAL_ERROR),
790
- mrb_int_value (mrb, PO_SEVERITY_FATAL_ERROR));
791
- mrb_define_module_function_id (mrb, mrb_mGettextPO, MRB_SYM (formats),
792
- gettextpo_m_formats, MRB_ARGS_NONE ());
793
- mrb_define_module_function_id (
794
- mrb, mrb_mGettextPO, MRB_SYM (format_pretty_name),
795
- gettextpo_m_format_pretty_name, MRB_ARGS_REQ (1));
796
- mrb_define_module_function_id (
797
- mrb, mrb_mGettextPO, MRB_SYM (header_entry_value),
798
- gettextpo_m_header_entry_value, MRB_ARGS_REQ (2));
799
- mrb_define_module_function_id (
800
- mrb, mrb_mGettextPO, MRB_SYM (header_with_updated_entry_value),
801
- gettextpo_m_header_with_updated_entry_value, MRB_ARGS_REQ (3));
802
- struct RClass *const mrb_cFile = mrb_define_class_under_id (
803
- mrb, mrb_mGettextPO, MRB_SYM (File), mrb->object_class);
804
- MRB_SET_INSTANCE_TT (mrb_cFile, MRB_TT_CDATA);
805
- mrb_define_class_method_id (mrb, mrb_cFile, MRB_SYM (read),
806
- gettextpo_file_m_read, MRB_ARGS_ANY ());
807
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (initialize),
808
- gettextpo_file_m_initialize, MRB_ARGS_NONE ());
809
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (write),
810
- gettextpo_file_m_write, MRB_ARGS_ANY ());
811
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (domains),
812
- gettextpo_file_m_domains, MRB_ARGS_NONE ());
813
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (message_iterator),
814
- gettextpo_file_m_message_iterator, MRB_ARGS_OPT (1));
815
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (domain_header),
816
- gettextpo_file_m_domain_header, MRB_ARGS_OPT (1));
817
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (check_all),
818
- gettextpo_file_m_check_all, MRB_ARGS_ANY ());
819
- struct RClass *const mrb_cMessage = mrb_define_class_under_id (
820
- mrb, mrb_mGettextPO, MRB_SYM (Message), mrb->object_class);
821
- MRB_SET_INSTANCE_TT (mrb_cMessage, MRB_TT_CDATA);
822
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (msgctxt),
823
- gettextpo_message_m_msgctxt, MRB_ARGS_NONE ());
824
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (msgctxt),
825
- gettextpo_message_m_msgctxt_set, MRB_ARGS_REQ (1));
826
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (msgid),
827
- gettextpo_message_m_msgid, MRB_ARGS_NONE ());
828
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (msgid),
829
- gettextpo_message_m_msgid_set, MRB_ARGS_REQ (1));
830
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (msgid_plural),
831
- gettextpo_message_m_msgid_plural, MRB_ARGS_NONE ());
832
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (msgid_plural),
833
- gettextpo_message_m_msgid_plural_set,
834
- MRB_ARGS_REQ (1));
835
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (msgstr),
836
- gettextpo_message_m_msgstr, MRB_ARGS_NONE ());
837
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (msgstr),
838
- gettextpo_message_m_msgstr_set, MRB_ARGS_REQ (1));
839
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (msgstr_plural),
840
- gettextpo_message_m_msgstr_plural, MRB_ARGS_REQ (1));
841
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (set_msgstr_plural),
842
- gettextpo_message_m_msgstr_plural_set,
843
- MRB_ARGS_REQ (2));
844
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (comments),
845
- gettextpo_message_m_comments, MRB_ARGS_NONE ());
846
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (comments),
847
- gettextpo_message_m_comments_set, MRB_ARGS_REQ (1));
848
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (extracted_comments),
849
- gettextpo_message_m_extracted_comments,
850
- MRB_ARGS_NONE ());
851
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (extracted_comments),
852
- gettextpo_message_m_extracted_comments_set,
853
- MRB_ARGS_REQ (1));
854
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (prev_msgctxt),
855
- gettextpo_message_m_prev_msgctxt, MRB_ARGS_NONE ());
856
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (prev_msgctxt),
857
- gettextpo_message_m_prev_msgctxt_set,
858
- MRB_ARGS_REQ (1));
859
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (prev_msgid),
860
- gettextpo_message_m_prev_msgid, MRB_ARGS_NONE ());
861
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (prev_msgid),
862
- gettextpo_message_m_prev_msgid_set, MRB_ARGS_REQ (1));
863
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (prev_msgid_plural),
864
- gettextpo_message_m_prev_msgid_plural,
865
- MRB_ARGS_NONE ());
866
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (prev_msgid_plural),
867
- gettextpo_message_m_prev_msgid_plural_set,
868
- MRB_ARGS_REQ (1));
869
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_Q (obsolete),
870
- gettextpo_message_m_obsolete, MRB_ARGS_NONE ());
871
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (obsolete),
872
- gettextpo_message_m_obsolete_set, MRB_ARGS_REQ (1));
873
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_Q (fuzzy),
874
- gettextpo_message_m_fuzzy, MRB_ARGS_NONE ());
875
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (fuzzy),
876
- gettextpo_message_m_fuzzy_set, MRB_ARGS_REQ (1));
877
-
878
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_Q (workflow_flag),
879
- gettextpo_message_m_workflow_flag_q, MRB_ARGS_REQ (1));
880
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (update_workflow_flag),
881
- gettextpo_message_m_workflow_flag_update,
882
- MRB_ARGS_ANY ());
883
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (workflow_flag_iterator),
884
- gettextpo_message_m_workflow_flag_iterator,
885
- MRB_ARGS_NONE ());
886
-
887
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_Q (format),
888
- gettextpo_message_m_format_q, MRB_ARGS_REQ (1));
889
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (format),
890
- gettextpo_message_m_format, MRB_ARGS_REQ (1));
891
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (update_format),
892
- gettextpo_message_m_format_set, MRB_ARGS_ANY ());
893
-
894
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_Q (sticky_flag),
895
- gettextpo_message_m_sticky_flag_q, MRB_ARGS_REQ (1));
896
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (update_sticky_flag),
897
- gettextpo_message_m_sticky_flag_update,
898
- MRB_ARGS_ANY ());
899
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (sticky_flag_iterator),
900
- gettextpo_message_m_sticky_flag_iterator,
901
- MRB_ARGS_NONE ());
902
-
903
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_Q (range),
904
- gettextpo_message_m_range, MRB_ARGS_REQ (1));
905
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (range),
906
- gettextpo_message_m_range_set, MRB_ARGS_REQ (1));
907
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (filepos),
908
- gettextpo_message_m_filepos, MRB_ARGS_REQ (1));
909
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (add_filepos),
910
- gettextpo_message_m_add_filepos, MRB_ARGS_REQ (2));
911
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (remove_filepos),
912
- gettextpo_message_m_remove_filepos, MRB_ARGS_REQ (1));
913
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (check_all),
914
- gettextpo_message_m_check_all, MRB_ARGS_ANY ());
915
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (check_format),
916
- gettextpo_message_m_check_format, MRB_ARGS_ANY ());
917
- struct RClass *const mrb_cMessageIterator = mrb_define_class_under_id (
918
- mrb, mrb_mGettextPO, MRB_SYM (MessageIterator), mrb->object_class);
919
- MRB_SET_INSTANCE_TT (mrb_cMessageIterator, MRB_TT_CDATA);
920
- mrb_define_method_id (mrb, mrb_cMessageIterator, MRB_SYM (next),
921
- gettextpo_message_iterator_m_next, MRB_ARGS_NONE ());
922
- mrb_define_method_id (mrb, mrb_cMessageIterator, MRB_SYM (insert),
923
- gettextpo_message_iterator_m_insert, MRB_ARGS_REQ (2));
924
- struct RClass *const mrb_cFilePos = mrb_define_class_under_id (
925
- mrb, mrb_mGettextPO, MRB_SYM (FilePos), mrb->object_class);
926
- MRB_SET_INSTANCE_TT (mrb_cFilePos, MRB_TT_CDATA);
927
- mrb_define_method_id (mrb, mrb_cFilePos, MRB_SYM (file),
928
- gettextpo_filepos_m_file, MRB_ARGS_NONE ());
929
- mrb_define_method_id (mrb, mrb_cFilePos, MRB_SYM (start_line),
930
- gettextpo_filepos_m_start_line, MRB_ARGS_NONE ());
931
- struct RClass *const mrb_cFlagIterator = mrb_define_class_under_id (
932
- mrb, mrb_mGettextPO, MRB_SYM (FlagIterator), mrb->object_class);
933
- MRB_SET_INSTANCE_TT (mrb_cFlagIterator, MRB_TT_CDATA);
934
- mrb_define_method_id (mrb, mrb_cFlagIterator, MRB_SYM (next),
935
- gettextpo_flag_iterator_m_next, MRB_ARGS_NONE ());
936
- DONE;
937
- }
938
-
939
- void
940
- mrb_mruby_gettextpo_gem_final (const mrb_state *const mrb)
941
- {
942
- }