gettextpo 0.1.3 → 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,825 +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 ERROR mrb_class_get_under_id (mrb, MODULE, MRB_SYM (Error))
41
-
42
- #define NIL mrb_nil_value ()
43
-
44
- static mrb_value
45
- gettextpo_m_header_entry_value (mrb_state *mrb, mrb_value klass)
46
- {
47
- char *header = NULL, *field = NULL;
48
- mrb_get_args (mrb, "zz", &header, &field);
49
-
50
- char *string = po_header_field (header, field);
51
- if (string)
52
- {
53
- mrb_value value = mrb_str_new_cstr (mrb, string);
54
- free (string);
55
- return value;
56
- }
57
- else
58
- return NIL;
59
- }
60
-
61
- static mrb_value
62
- gettextpo_m_header_with_updated_entry_value (mrb_state *mrb, mrb_value klass)
63
- {
64
- char *header = NULL, *field = NULL, *value = NULL;
65
- mrb_get_args (mrb, "zzz", &header, &field, &value);
66
-
67
- char *updated_header = po_header_set_field (header, field, value);
68
- mrb_value header_value = mrb_str_new_cstr (mrb, updated_header);
69
- free (updated_header);
70
- return header_value;
71
- }
72
-
73
- static void
74
- gettextpo_message_free (mrb_state *mrb, void *message)
75
- {
76
- /* NOTE: memory is freed by libgettextpo file struct */
77
- }
78
-
79
- static const struct mrb_data_type gettextpo_message_data_type = {
80
- .struct_name = "gettextpo message",
81
- .dfree = gettextpo_message_free,
82
- };
83
-
84
- #define OPTIONAL_STRING_GETTER(field) \
85
- static mrb_value gettextpo_message_m_##field (mrb_state *mrb, \
86
- mrb_value self) \
87
- { \
88
- const char *string = po_message_##field (DATA_PTR (self)); \
89
- return string ? mrb_str_new_cstr (mrb, string) : NIL; \
90
- }
91
- #define OPTIONAL_STRING_SETTER(field) \
92
- static mrb_value gettextpo_message_m_##field##_set (mrb_state *mrb, \
93
- mrb_value self) \
94
- { \
95
- char *string = NULL; \
96
- mrb_get_args (mrb, "z!", &string); \
97
- po_message_set_##field (DATA_PTR (self), string); \
98
- return NIL; \
99
- }
100
-
101
- OPTIONAL_STRING_GETTER (msgctxt);
102
- OPTIONAL_STRING_SETTER (msgctxt);
103
-
104
- #define STRING_GETTER(field) \
105
- static mrb_value gettextpo_message_m_##field (mrb_state *mrb, \
106
- mrb_value self) \
107
- { \
108
- return mrb_str_new_cstr (mrb, po_message_##field (DATA_PTR (self))); \
109
- }
110
- #define STRING_SETTER(field) \
111
- static mrb_value gettextpo_message_m_##field##_set (mrb_state *mrb, \
112
- mrb_value self) \
113
- { \
114
- char *string = NULL; \
115
- mrb_get_args (mrb, "z", &string); \
116
- po_message_set_##field (DATA_PTR (self), string); \
117
- return NIL; \
118
- }
119
-
120
- STRING_GETTER (msgid);
121
- STRING_SETTER (msgid);
122
- STRING_GETTER (msgid_plural);
123
- STRING_SETTER (msgid_plural);
124
- STRING_GETTER (msgstr);
125
- STRING_SETTER (msgstr);
126
-
127
- static mrb_value
128
- gettextpo_message_m_msgstr_plural (mrb_state *mrb, mrb_value self)
129
- {
130
- mrb_int index = 0;
131
- mrb_get_args (mrb, "i", &index);
132
-
133
- const char *msgstr_plural
134
- = po_message_msgstr_plural (DATA_PTR (self), index);
135
- return msgstr_plural ? mrb_str_new_cstr (mrb, msgstr_plural) : NIL;
136
- }
137
-
138
- static mrb_value
139
- gettextpo_message_m_msgstr_plural_set (mrb_state *mrb, mrb_value self)
140
- {
141
- int index = 0;
142
- char *msgstr_plural = NULL;
143
- mrb_get_args (mrb, "iz!", &index, &msgstr_plural);
144
-
145
- po_message_set_msgstr_plural (DATA_PTR (self), index, msgstr_plural);
146
- return NIL;
147
- }
148
-
149
- STRING_GETTER (comments);
150
- STRING_SETTER (comments);
151
- STRING_GETTER (extracted_comments);
152
- STRING_SETTER (extracted_comments);
153
- OPTIONAL_STRING_GETTER (prev_msgctxt);
154
- OPTIONAL_STRING_SETTER (prev_msgctxt);
155
- OPTIONAL_STRING_GETTER (prev_msgid);
156
- OPTIONAL_STRING_SETTER (prev_msgid);
157
- OPTIONAL_STRING_GETTER (prev_msgid_plural);
158
- OPTIONAL_STRING_SETTER (prev_msgid_plural);
159
-
160
- #define BOOL_GETTER(field) \
161
- static mrb_value gettextpo_message_m_##field (mrb_state *mrb, \
162
- mrb_value self) \
163
- { \
164
- return mrb_bool_value (po_message_is_##field (DATA_PTR (self))); \
165
- }
166
- #define BOOL_SETTER(field) \
167
- static mrb_value gettextpo_message_m_##field##_set (mrb_state *mrb, \
168
- mrb_value self) \
169
- { \
170
- bool boolean = true; \
171
- mrb_get_args (mrb, "b", &boolean); \
172
- \
173
- po_message_set_##field (DATA_PTR (self), boolean); \
174
- return NIL; \
175
- }
176
-
177
- BOOL_GETTER (obsolete);
178
- BOOL_SETTER (obsolete);
179
- BOOL_GETTER (fuzzy);
180
- BOOL_SETTER (fuzzy);
181
-
182
- static mrb_value
183
- gettextpo_message_m_format (mrb_state *mrb, mrb_value self)
184
- {
185
- char *format = NULL;
186
- mrb_get_args (mrb, "z", &format);
187
-
188
- return mrb_bool_value (po_message_is_format (DATA_PTR (self), format));
189
- }
190
-
191
- static mrb_value
192
- gettextpo_message_m_format_set (mrb_state *mrb, mrb_value self)
193
- {
194
- char *format = NULL;
195
- mrb_sym table[] = { MRB_SYM (opposite), MRB_SYM (remove) };
196
- size_t num = sizeof (table) / sizeof (table[0]);
197
- mrb_value values[] = { mrb_false_value (), mrb_false_value () };
198
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
199
- mrb_get_args (mrb, "z:", &format, &kwargs);
200
-
201
- bool opposite = !mrb_undef_p (values[0]) && mrb_test (values[0]);
202
- bool remove = !mrb_undef_p (values[1]) && mrb_test (values[1]);
203
- if (opposite && remove)
204
- mrb_raise (mrb, ERROR,
205
- "opposite and remove cannot be set at the same time");
206
- po_message_set_format (DATA_PTR (self), format,
207
- opposite ? 0 : (remove ? -1 : 1));
208
- return NIL;
209
- }
210
-
211
- static mrb_value
212
- gettextpo_message_m_range (mrb_state *mrb, mrb_value self)
213
- {
214
- mrb_value range;
215
- mrb_get_args (mrb, "o", &range);
216
-
217
- int min = mrb_integer (mrb_range_beg (mrb, range));
218
- int max = mrb_integer (mrb_range_end (mrb, range));
219
- return mrb_bool_value (po_message_is_range (DATA_PTR (self), &min, &max));
220
- }
221
-
222
- static mrb_value
223
- gettextpo_message_m_range_set (mrb_state *mrb, mrb_value self)
224
- {
225
- mrb_value range;
226
- mrb_get_args (mrb, "o", &range);
227
-
228
- po_message_set_range (DATA_PTR (self),
229
- mrb_integer (mrb_range_beg (mrb, range)),
230
- mrb_integer (mrb_range_end (mrb, range)));
231
- return NIL;
232
- }
233
-
234
- static struct
235
- {
236
- bool error;
237
- mrb_value *xerror;
238
- mrb_value *xerror2;
239
- mrb_state *state;
240
- mrb_value *file;
241
- } gettextpo_xerror_context = {};
242
-
243
- static void
244
- gettextpo_xerror_context_reset (mrb_state *state)
245
- {
246
- gettextpo_xerror_context.error = false;
247
- gettextpo_xerror_context.xerror = NULL;
248
- gettextpo_xerror_context.xerror2 = NULL;
249
- gettextpo_xerror_context.state = state;
250
- gettextpo_xerror_context.file = NULL;
251
- }
252
-
253
- static void
254
- gettextpo_xerror (const int severity, const po_message_t message,
255
- const char *const filename, const size_t lineno,
256
- const size_t column, const int multiline_p,
257
- const char *const message_text)
258
- {
259
- gettextpo_xerror_context.error = true;
260
- if (!gettextpo_xerror_context.xerror
261
- || mrb_nil_p (*gettextpo_xerror_context.xerror)
262
- || mrb_undef_p (*gettextpo_xerror_context.xerror))
263
- return;
264
-
265
- mrb_state *mrb = gettextpo_xerror_context.state;
266
- mrb_value kwargs = mrb_hash_new (mrb);
267
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (severity)),
268
- mrb_int_value (mrb, severity));
269
- if (message)
270
- {
271
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
272
- mrb, MESSAGE, message, &gettextpo_message_data_type));
273
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
274
- *gettextpo_xerror_context.file);
275
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message)), value);
276
- }
277
- if (filename)
278
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (filename)),
279
- mrb_str_new_cstr (mrb, filename));
280
- if (filename && (lineno != (size_t)(-1)))
281
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (lineno)),
282
- mrb_int_value (mrb, lineno));
283
- if (filename && lineno != (size_t)(-1) && column != (size_t)(-1))
284
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (column)),
285
- mrb_int_value (mrb, column));
286
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (multiline)),
287
- mrb_bool_value (multiline_p));
288
- if (message_text)
289
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message_text)),
290
- mrb_str_new_cstr (mrb, message_text));
291
- /* If someday proc calling supports keyword arguments, update
292
- this. */
293
- mrb_funcall_id (mrb, *gettextpo_xerror_context.xerror, MRB_SYM (call), 1,
294
- kwargs);
295
-
296
- if (severity == PO_SEVERITY_FATAL_ERROR)
297
- abort ();
298
- }
299
-
300
- static void
301
- gettextpo_xerror2 (const int severity, const po_message_t message1,
302
- const char *const filename1, const size_t lineno1,
303
- const size_t column1, const int multiline_p1,
304
- const char *const message_text1,
305
- const po_message_t message2, const char *const filename2,
306
- const size_t lineno2, const size_t column2,
307
- const int multiline_p2, const char *const message_text2)
308
- {
309
- gettextpo_xerror_context.error = true;
310
- if (!gettextpo_xerror_context.xerror2
311
- || mrb_nil_p (*gettextpo_xerror_context.xerror2)
312
- || mrb_undef_p (*gettextpo_xerror_context.xerror2))
313
- return;
314
-
315
- mrb_state *mrb = gettextpo_xerror_context.state;
316
- mrb_value kwargs = mrb_hash_new (mrb);
317
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (severity)),
318
- mrb_int_value (mrb, severity));
319
- if (message1)
320
- {
321
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
322
- mrb, MESSAGE, message1, &gettextpo_message_data_type));
323
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
324
- *gettextpo_xerror_context.file);
325
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message1)), value);
326
- }
327
- if (filename1)
328
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (filename1)),
329
- mrb_str_new_cstr (mrb, filename1));
330
- if (filename1 && (lineno1 != (size_t)(-1)))
331
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (lineno1)),
332
- mrb_int_value (mrb, lineno1));
333
- if (filename1 && lineno1 != (size_t)(-1) && column1 != (size_t)(-1))
334
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (column1)),
335
- mrb_int_value (mrb, column1));
336
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (multiline1)),
337
- mrb_bool_value (multiline_p1));
338
- if (message_text1)
339
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message_text1)),
340
- mrb_str_new_cstr (mrb, message_text1));
341
- if (message2)
342
- {
343
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
344
- mrb, MESSAGE, message2, &gettextpo_message_data_type));
345
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
346
- *gettextpo_xerror_context.file);
347
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message2)), value);
348
- }
349
- if (filename2)
350
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (filename2)),
351
- mrb_str_new_cstr (mrb, filename2));
352
- if (filename2 && (lineno2 != (size_t)(-1)))
353
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (lineno2)),
354
- mrb_int_value (mrb, lineno2));
355
- if (filename2 && lineno2 != (size_t)(-1) && column2 != (size_t)(-1))
356
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (column2)),
357
- mrb_int_value (mrb, column2));
358
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (multiline2)),
359
- mrb_bool_value (multiline_p2));
360
- if (message_text2)
361
- mrb_hash_set (mrb, kwargs, mrb_symbol_value (MRB_SYM (message_text2)),
362
- mrb_str_new_cstr (mrb, message_text2));
363
- /* If someday proc calling supports keyword arguments, update
364
- this. */
365
- mrb_funcall_id (mrb, *gettextpo_xerror_context.xerror2, MRB_SYM (call), 1,
366
- kwargs);
367
-
368
- if (severity == PO_SEVERITY_FATAL_ERROR)
369
- abort ();
370
- }
371
-
372
- static const struct po_xerror_handler gettextpo_xerror_handler = {
373
- .xerror = gettextpo_xerror,
374
- .xerror2 = gettextpo_xerror2,
375
- };
376
-
377
- static mrb_value
378
- gettextpo_m_formats (mrb_state *mrb, mrb_value self)
379
- {
380
- mrb_value value = mrb_ary_new (mrb);
381
- const char *const *formats = po_format_list ();
382
- for (size_t index = 0; formats[index]; index++)
383
- mrb_ary_push (mrb, value, mrb_str_new_cstr (mrb, formats[index]));
384
- return value;
385
- }
386
-
387
- static mrb_value
388
- gettextpo_m_format_pretty_name (mrb_state *mrb, mrb_value self)
389
- {
390
- char *format = NULL;
391
- mrb_get_args (mrb, "z", &format);
392
- const char *name = po_format_pretty_name (format);
393
- return name ? mrb_str_new_cstr (mrb, name) : NIL;
394
- }
395
-
396
- static void
397
- gettextpo_file_free (mrb_state *mrb, void *file)
398
- {
399
- if (file)
400
- po_file_free (file);
401
- }
402
-
403
- static const struct mrb_data_type gettextpo_file_data_type = {
404
- .struct_name = "gettextpo file",
405
- .dfree = gettextpo_file_free,
406
- };
407
-
408
- static mrb_value
409
- gettextpo_file_m_initialize (mrb_state *mrb, mrb_value self)
410
- {
411
- mrb_data_init (self, po_file_create (), &gettextpo_file_data_type);
412
- return self;
413
- }
414
-
415
- /**
416
- * call-seq: read(filename)
417
- *
418
- * +filename+ must be resolved.
419
- */
420
- static mrb_value
421
- gettextpo_file_m_read (mrb_state *mrb, mrb_value klass)
422
- {
423
- char *filename = NULL;
424
- mrb_sym table[] = { MRB_SYM (xerror), MRB_SYM (xerror2) };
425
- size_t num = sizeof (table) / sizeof (table[0]);
426
- mrb_value values[] = { NIL, NIL };
427
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
428
- mrb_get_args (mrb, "z:", &filename, &kwargs);
429
-
430
- gettextpo_xerror_context_reset (mrb);
431
- gettextpo_xerror_context.xerror = &values[0];
432
- gettextpo_xerror_context.xerror2 = &values[1];
433
- mrb_value file = mrb_obj_value (mrb_data_object_alloc (
434
- mrb, mrb_class_ptr (klass), NULL, &gettextpo_file_data_type));
435
- gettextpo_xerror_context.file = &file;
436
-
437
- po_file_t po_file = po_file_read (filename, &gettextpo_xerror_handler);
438
- if (gettextpo_xerror_context.error || !po_file)
439
- mrb_raise (mrb, ERROR, "failed to read file");
440
- DATA_PTR (file) = po_file;
441
- return file;
442
- }
443
-
444
- static mrb_value
445
- gettextpo_file_m_write (mrb_state *mrb, mrb_value file)
446
- {
447
- char *filename = NULL;
448
- mrb_sym table[] = { MRB_SYM (xerror), MRB_SYM (xerror2) };
449
- size_t num = sizeof (table) / sizeof (table[0]);
450
- mrb_value values[] = { NIL, NIL };
451
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
452
- mrb_get_args (mrb, "z:", &filename, &kwargs);
453
-
454
- gettextpo_xerror_context_reset (mrb);
455
- gettextpo_xerror_context.xerror = &values[0];
456
- gettextpo_xerror_context.xerror2 = &values[1];
457
- gettextpo_xerror_context.file = &file;
458
-
459
- po_file_write (DATA_PTR (file), filename, &gettextpo_xerror_handler);
460
- if (gettextpo_xerror_context.error)
461
- mrb_raise (mrb, ERROR, "failed to write file");
462
- return NIL;
463
- }
464
-
465
- static mrb_value
466
- gettextpo_file_m_domains (mrb_state *mrb, mrb_value file)
467
- {
468
- const char *const *domains = po_file_domains (DATA_PTR (file));
469
- mrb_value value = mrb_ary_new (mrb);
470
- for (size_t index = 0; domains[index]; index++)
471
- mrb_ary_push (mrb, value, mrb_str_new_cstr (mrb, domains[index]));
472
- return value;
473
- }
474
-
475
- static mrb_value
476
- gettextpo_file_m_domain_header (mrb_state *mrb, mrb_value file)
477
- {
478
- char *domain = NULL;
479
- mrb_get_args (mrb, "|z", &domain);
480
-
481
- const char *header = po_file_domain_header (DATA_PTR (file), domain);
482
- return header ? mrb_str_new_cstr (mrb, header) : NIL;
483
- }
484
-
485
- static void
486
- gettextpo_message_iterator_free (mrb_state *mrb, void *message_iterator)
487
- {
488
- if (message_iterator)
489
- po_message_iterator_free (message_iterator);
490
- }
491
-
492
- static const struct mrb_data_type gettextpo_message_iterator_data_type = {
493
- .struct_name = "gettextpo message iterator",
494
- .dfree = gettextpo_message_iterator_free,
495
- };
496
-
497
- static mrb_value
498
- gettextpo_file_m_message_iterator (mrb_state *mrb, mrb_value file)
499
- {
500
- const char *domain = NULL;
501
- mrb_get_args (mrb, "|z", &domain);
502
-
503
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
504
- mrb,
505
- mrb_class_get_under_id (mrb,
506
- mrb_module_get_id (mrb, MRB_SYM (GettextPO)),
507
- MRB_SYM (MessageIterator)),
508
- po_message_iterator (DATA_PTR (file), domain),
509
- &gettextpo_message_iterator_data_type));
510
- mrb_iv_set (mrb, value, MRB_IVSYM (file), file);
511
- return value;
512
- }
513
-
514
- static mrb_value
515
- gettextpo_message_iterator_m_next (mrb_state *mrb, mrb_value message_iterator)
516
- {
517
- po_message_t message = po_next_message (DATA_PTR (message_iterator));
518
- if (message)
519
- {
520
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
521
- mrb,
522
- mrb_class_get_under_id (mrb,
523
- mrb_module_get_id (mrb, MRB_SYM (GettextPO)),
524
- MRB_SYM (Message)),
525
- message, &gettextpo_message_data_type));
526
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
527
- mrb_iv_get (mrb, message_iterator, MRB_IVSYM (file)));
528
- return value;
529
- }
530
- else
531
- mrb_raise (mrb, mrb_class_get_id (mrb, MRB_SYM (StopIteration)),
532
- "end of PO message iterator");
533
- }
534
-
535
- static mrb_value
536
- gettextpo_message_iterator_m_insert (mrb_state *mrb,
537
- mrb_value message_iterator)
538
- {
539
- char *msgid, *msgstr;
540
- mrb_get_args (mrb, "zz", &msgid, &msgstr);
541
-
542
- po_message_t message = po_message_create ();
543
- po_message_set_msgid (message, msgid);
544
- po_message_set_msgstr (message, msgstr);
545
- po_message_insert (DATA_PTR (message_iterator), message);
546
-
547
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
548
- mrb,
549
- mrb_class_get_under_id (mrb,
550
- mrb_module_get_id (mrb, MRB_SYM (GettextPO)),
551
- MRB_SYM (Message)),
552
- message, &gettextpo_message_data_type));
553
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
554
- mrb_iv_get (mrb, message_iterator, MRB_IVSYM (file)));
555
- return value;
556
- }
557
-
558
- static void
559
- gettextpo_filepos_free (mrb_state *mrb, void *filepos)
560
- {
561
- /* NOTE: filepos is freed by file struct */
562
- }
563
-
564
- static const mrb_data_type gettextpo_filepos_data_type = {
565
- .struct_name = "gettextpo filepos",
566
- .dfree = gettextpo_filepos_free,
567
- };
568
-
569
- static mrb_value
570
- gettextpo_message_m_filepos (mrb_state *mrb, mrb_value self)
571
- {
572
- mrb_int index = 0;
573
- mrb_get_args (mrb, "i", &index);
574
-
575
- po_filepos_t pos = po_message_filepos (DATA_PTR (self), index);
576
- if (pos)
577
- {
578
- mrb_value value = mrb_obj_value (mrb_data_object_alloc (
579
- mrb, mrb_class_get_under_id (mrb, MODULE, MRB_SYM (FilePos)), pos,
580
- &gettextpo_filepos_data_type));
581
- mrb_iv_set (mrb, value, MRB_IVSYM (file),
582
- mrb_iv_get (mrb, self, MRB_IVSYM (file)));
583
- return value;
584
- }
585
- else
586
- return NIL;
587
- }
588
-
589
- static mrb_value
590
- gettextpo_filepos_m_file (mrb_state *mrb, mrb_value self)
591
- {
592
- const char *file = po_filepos_file (DATA_PTR (self));
593
- return file ? mrb_str_new_cstr (mrb, file) : NIL;
594
- }
595
-
596
- static mrb_value
597
- gettextpo_filepos_m_start_line (mrb_state *mrb, mrb_value self)
598
- {
599
- size_t start_line = po_filepos_start_line (DATA_PTR (self));
600
- return start_line == (size_t)(-1) ? NIL : mrb_int_value (mrb, start_line);
601
- }
602
-
603
- static mrb_value
604
- gettextpo_message_m_add_filepos (mrb_state *mrb, mrb_value self)
605
- {
606
- char *file = NULL;
607
- size_t start_line = 0;
608
- mrb_get_args (mrb, "zi", &file, &start_line);
609
-
610
- po_message_add_filepos (DATA_PTR (self), file, start_line);
611
- return NIL;
612
- }
613
-
614
- static mrb_value
615
- gettextpo_message_m_remove_filepos (mrb_state *mrb, mrb_value self)
616
- {
617
- mrb_int start_line = 0;
618
- mrb_get_args (mrb, "i", &start_line);
619
-
620
- po_message_remove_filepos (DATA_PTR (self), start_line);
621
- return NIL;
622
- }
623
-
624
- static mrb_value
625
- gettextpo_file_m_check_all (mrb_state *mrb, mrb_value self)
626
- {
627
- mrb_sym table[] = { MRB_SYM (xerror), MRB_SYM (xerror2) };
628
- size_t num = sizeof (table) / sizeof (table[0]);
629
- mrb_value values[] = { NIL, NIL };
630
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
631
- mrb_get_args (mrb, ":", &kwargs);
632
-
633
- gettextpo_xerror_context_reset (mrb);
634
- gettextpo_xerror_context.xerror = &values[0];
635
- gettextpo_xerror_context.xerror2 = &values[1];
636
- gettextpo_xerror_context.file = &self;
637
-
638
- po_file_check_all (DATA_PTR (self), &gettextpo_xerror_handler);
639
- if (gettextpo_xerror_context.error)
640
- mrb_raise (mrb, ERROR, "check all for file failed");
641
- return NIL;
642
- }
643
-
644
- static mrb_value
645
- gettextpo_message_m_check_all (mrb_state *mrb, mrb_value self)
646
- {
647
- mrb_value iterator;
648
- mrb_sym table[] = { MRB_SYM (xerror), MRB_SYM (xerror2) };
649
- size_t num = sizeof (table) / sizeof (table[0]);
650
- mrb_value values[] = { NIL, NIL };
651
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
652
- mrb_get_args (mrb, "o:", &iterator, &kwargs);
653
-
654
- gettextpo_xerror_context_reset (mrb);
655
- gettextpo_xerror_context.xerror = &values[0];
656
- gettextpo_xerror_context.xerror2 = &values[1];
657
- mrb_value file = mrb_iv_get (mrb, self, MRB_IVSYM (file));
658
- gettextpo_xerror_context.file = &file;
659
-
660
- po_message_check_all (DATA_PTR (self), DATA_PTR (iterator),
661
- &gettextpo_xerror_handler);
662
- if (gettextpo_xerror_context.error)
663
- mrb_raise (mrb, ERROR, "check all for message failed");
664
- return NIL;
665
- }
666
-
667
- static mrb_value
668
- gettextpo_message_m_check_format (mrb_state *mrb, mrb_value self)
669
- {
670
- mrb_sym table[] = { MRB_SYM (xerror), MRB_SYM (xerror2) };
671
- size_t num = sizeof (table) / sizeof (table[0]);
672
- mrb_value values[] = { NIL, NIL };
673
- mrb_kwargs kwargs = { .num = num, .table = table, .values = values };
674
- mrb_get_args (mrb, ":", &kwargs);
675
-
676
- gettextpo_xerror_context_reset (mrb);
677
- gettextpo_xerror_context.xerror = &values[0];
678
- gettextpo_xerror_context.xerror2 = &values[1];
679
- mrb_value file = mrb_iv_get (mrb, self, MRB_IVSYM (file));
680
- gettextpo_xerror_context.file = &file;
681
-
682
- po_message_check_format (DATA_PTR (self), &gettextpo_xerror_handler);
683
- if (gettextpo_xerror_context.error)
684
- mrb_raise (mrb, ERROR, "check format for message failed");
685
- return NIL;
686
- }
687
-
688
- void
689
- mrb_mruby_gettextpo_gem_init (mrb_state *const mrb)
690
- {
691
- struct RClass *const mrb_mGettextPO
692
- = mrb_define_module_id (mrb, MRB_SYM (GettextPO));
693
- mrb_define_const_id (mrb, mrb_mGettextPO, MRB_SYM (LIBGETTEXTPO_VERSION),
694
- mrb_int_value (mrb, libgettextpo_version));
695
- mrb_define_const_id (mrb, mrb_mGettextPO, MRB_SYM (SEVERITY_WARNING),
696
- mrb_int_value (mrb, PO_SEVERITY_WARNING));
697
- mrb_define_const_id (mrb, mrb_mGettextPO, MRB_SYM (SEVERITY_ERROR),
698
- mrb_int_value (mrb, PO_SEVERITY_ERROR));
699
- mrb_define_const_id (mrb, mrb_mGettextPO, MRB_SYM (SEVERITY_FATAL_ERROR),
700
- mrb_int_value (mrb, PO_SEVERITY_FATAL_ERROR));
701
- mrb_define_module_function_id (mrb, mrb_mGettextPO, MRB_SYM (formats),
702
- gettextpo_m_formats, MRB_ARGS_NONE ());
703
- mrb_define_module_function_id (
704
- mrb, mrb_mGettextPO, MRB_SYM (format_pretty_name),
705
- gettextpo_m_format_pretty_name, MRB_ARGS_REQ (1));
706
- mrb_define_module_function_id (
707
- mrb, mrb_mGettextPO, MRB_SYM (header_entry_value),
708
- gettextpo_m_header_entry_value, MRB_ARGS_REQ (2));
709
- mrb_define_module_function_id (
710
- mrb, mrb_mGettextPO, MRB_SYM (header_with_updated_entry_value),
711
- gettextpo_m_header_with_updated_entry_value, MRB_ARGS_REQ (3));
712
- struct RClass *const mrb_cFile = mrb_define_class_under_id (
713
- mrb, mrb_mGettextPO, MRB_SYM (File), mrb->object_class);
714
- MRB_SET_INSTANCE_TT (mrb_cFile, MRB_TT_CDATA);
715
- mrb_define_class_method_id (mrb, mrb_cFile, MRB_SYM (read),
716
- gettextpo_file_m_read, MRB_ARGS_ANY ());
717
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (initialize),
718
- gettextpo_file_m_initialize, MRB_ARGS_NONE ());
719
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (write),
720
- gettextpo_file_m_write, MRB_ARGS_ANY ());
721
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (domains),
722
- gettextpo_file_m_domains, MRB_ARGS_NONE ());
723
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (message_iterator),
724
- gettextpo_file_m_message_iterator, MRB_ARGS_OPT (1));
725
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (domain_header),
726
- gettextpo_file_m_domain_header, MRB_ARGS_OPT (1));
727
- mrb_define_method_id (mrb, mrb_cFile, MRB_SYM (check_all),
728
- gettextpo_file_m_check_all, MRB_ARGS_ANY ());
729
- struct RClass *const mrb_cMessage = mrb_define_class_under_id (
730
- mrb, mrb_mGettextPO, MRB_SYM (Message), mrb->object_class);
731
- MRB_SET_INSTANCE_TT (mrb_cMessage, MRB_TT_CDATA);
732
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (msgctxt),
733
- gettextpo_message_m_msgctxt, MRB_ARGS_NONE ());
734
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (msgctxt),
735
- gettextpo_message_m_msgctxt_set, MRB_ARGS_REQ (1));
736
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (msgid),
737
- gettextpo_message_m_msgid, MRB_ARGS_NONE ());
738
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (msgid),
739
- gettextpo_message_m_msgid_set, MRB_ARGS_REQ (1));
740
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (msgid_plural),
741
- gettextpo_message_m_msgid_plural, MRB_ARGS_NONE ());
742
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (msgid_plural),
743
- gettextpo_message_m_msgid_plural_set,
744
- MRB_ARGS_REQ (1));
745
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (msgstr),
746
- gettextpo_message_m_msgstr, MRB_ARGS_NONE ());
747
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (msgstr),
748
- gettextpo_message_m_msgstr_set, MRB_ARGS_REQ (1));
749
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (msgstr_plural),
750
- gettextpo_message_m_msgstr_plural, MRB_ARGS_REQ (1));
751
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (set_msgstr_plural),
752
- gettextpo_message_m_msgstr_plural_set,
753
- MRB_ARGS_REQ (2));
754
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (comments),
755
- gettextpo_message_m_comments, MRB_ARGS_NONE ());
756
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (comments),
757
- gettextpo_message_m_comments_set, MRB_ARGS_REQ (1));
758
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (extracted_comments),
759
- gettextpo_message_m_extracted_comments,
760
- MRB_ARGS_NONE ());
761
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (extracted_comments),
762
- gettextpo_message_m_extracted_comments_set,
763
- MRB_ARGS_REQ (1));
764
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (prev_msgctxt),
765
- gettextpo_message_m_prev_msgctxt, MRB_ARGS_NONE ());
766
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (prev_msgctxt),
767
- gettextpo_message_m_prev_msgctxt_set,
768
- MRB_ARGS_REQ (1));
769
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (prev_msgid),
770
- gettextpo_message_m_prev_msgid, MRB_ARGS_NONE ());
771
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (prev_msgid),
772
- gettextpo_message_m_prev_msgid_set, MRB_ARGS_REQ (1));
773
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (prev_msgid_plural),
774
- gettextpo_message_m_prev_msgid_plural,
775
- MRB_ARGS_NONE ());
776
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (prev_msgid_plural),
777
- gettextpo_message_m_prev_msgid_plural_set,
778
- MRB_ARGS_REQ (1));
779
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_Q (obsolete),
780
- gettextpo_message_m_obsolete, MRB_ARGS_NONE ());
781
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (obsolete),
782
- gettextpo_message_m_obsolete_set, MRB_ARGS_REQ (1));
783
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_Q (fuzzy),
784
- gettextpo_message_m_fuzzy, MRB_ARGS_NONE ());
785
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (fuzzy),
786
- gettextpo_message_m_fuzzy_set, MRB_ARGS_REQ (1));
787
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_Q (format),
788
- gettextpo_message_m_format, MRB_ARGS_REQ (1));
789
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (update_format),
790
- gettextpo_message_m_format_set, MRB_ARGS_ANY ());
791
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_Q (range),
792
- gettextpo_message_m_range, MRB_ARGS_REQ (1));
793
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM_E (range),
794
- gettextpo_message_m_range_set, MRB_ARGS_REQ (1));
795
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (filepos),
796
- gettextpo_message_m_filepos, MRB_ARGS_REQ (1));
797
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (add_filepos),
798
- gettextpo_message_m_add_filepos, MRB_ARGS_REQ (2));
799
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (remove_filepos),
800
- gettextpo_message_m_remove_filepos, MRB_ARGS_REQ (1));
801
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (check_all),
802
- gettextpo_message_m_check_all, MRB_ARGS_ANY ());
803
- mrb_define_method_id (mrb, mrb_cMessage, MRB_SYM (check_format),
804
- gettextpo_message_m_check_format, MRB_ARGS_ANY ());
805
- struct RClass *const mrb_cMessageIterator = mrb_define_class_under_id (
806
- mrb, mrb_mGettextPO, MRB_SYM (MessageIterator), mrb->object_class);
807
- MRB_SET_INSTANCE_TT (mrb_cMessageIterator, MRB_TT_CDATA);
808
- mrb_define_method_id (mrb, mrb_cMessageIterator, MRB_SYM (next),
809
- gettextpo_message_iterator_m_next, MRB_ARGS_NONE ());
810
- mrb_define_method_id (mrb, mrb_cMessageIterator, MRB_SYM (insert),
811
- gettextpo_message_iterator_m_insert, MRB_ARGS_REQ (2));
812
- struct RClass *const mrb_cFilePos = mrb_define_class_under_id (
813
- mrb, mrb_mGettextPO, MRB_SYM (FilePos), mrb->object_class);
814
- MRB_SET_INSTANCE_TT (mrb_cFilePos, MRB_TT_CDATA);
815
- mrb_define_method_id (mrb, mrb_cFilePos, MRB_SYM (file),
816
- gettextpo_filepos_m_file, MRB_ARGS_NONE ());
817
- mrb_define_method_id (mrb, mrb_cFilePos, MRB_SYM (start_line),
818
- gettextpo_filepos_m_start_line, MRB_ARGS_NONE ());
819
- DONE;
820
- }
821
-
822
- void
823
- mrb_mruby_gettextpo_gem_final (const mrb_state *const mrb)
824
- {
825
- }