1 /* Contributor(s):
2  *
3  * Boris Buklov (BBV) <buklov@mail.ru>
4  *
5  * mod_say_ru.c -- Say for Russian
6  *
7  */
8 
9 
10 //слишком много падежей поэтому пришлось сделать массив значений
11 //пример таблицы склонений для 1 ниже по ссылкам
12 //http://ru.wiktionary.org/wiki/%D0%BE%D0%B4%D0%B8%D0%BD
13 //http://ru.wiktionary.org/wiki/%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9
14 
15 
16 
17 typedef enum {
18 	million,
19 	thousand,
20 	zero,
21 	empty
22 } unit_t;
23 
24 //тип числа порядковое или количественное
25 typedef enum {
26 	nominativus,				// именительный Кто? Что?
27 	genitivus,				// Родительный  Кого? Чего?
28 	dativus,				// дательный    Кого? Что?
29 	accusativus_a,				// Винительный  Кого? animate - одушевлённый
30 	accusativus_i,				// Винительный  Что?  inanimate - неодушевлённый
31 	instrumentalis,				// Творительный Кем? Чем?
32 	prepositive				// Предложный   О ком? О чём?
33 } cases_t;
34 
35 
36 typedef enum {
37 	//количественный
38 	male,					//мужского пола
39 	it,					//среднего
40 	female,					//женского
41 	plural,					//множественное число
42 	//порядковый
43 	male_h,					//порядковое мужского пола
44 	it_h,					//порядковое среднего
45 	female_h,				//порядковое женского
46 	plural_h				//порядковое множественное число
47 } say_gender_t;
48 
49 
50 typedef enum {
51 	ruble,
52 	dollar,
53 	euro
54 } currency_t;
55 
56 
57 
58 typedef struct {
59 	say_gender_t gender;
60 	cases_t    cases;
61 	currency_t currency;
62 } say_opt_t;
63 
64 
65 struct say_t {
66 	char *num[8];
67 	char *thousand[14];
68 	char *million[14];
69 	int all;
70 };
71 struct say_cur_t {
72 	char *first[6];
73 	say_gender_t first_gender;
74 	cases_t first_cases;
75 	char *second[6];
76 	say_gender_t second_gender;
77 	cases_t second_cases;
78 
79 };
80 
81 // описываем как произносить валяюты от 0 до 5 дальше идёт номер рода и падежа (с нуля)
82 //рубли
83 #define c_0 {{"rubles","ruble","ruble-a","ruble-a","ruble-a","rubles"},male,nominativus,\
84 	     {"kopecks","kopeck","kopeck-i","kopeck-i","kopeck-i","kopecks"},female,nominativus}
85 
86 #define c_1 {{"dollars","dollar","dollara","dollara","dollara","dollars"},male,nominativus,\
87 	     {"centov","cent","centa","centa","centa","centov"},male,nominativus}
88 
89 #define c_2 {{"rubles","ruble","ruble-a","ruble-a","ruble-a","rubles"},male,nominativus,\
90 	     {"kopecks","kopeck","kopeck-i","kopeck-i","kopeck-i","kopecks"},female,nominativus}
91 
92 
93 
94 
95 typedef switch_status_t (*switch_new_say_callback_ru_t) (switch_say_file_handle_t *sh, char *tosay, switch_say_args_t *say_args,say_opt_t *say_opt);
96 
97 //именительный
98 //именительный количественный/числительное
99 
100 //мужской род родительный падеж
101 
102 //первая строка описывае как произносить цифры от 0 до 5 потом пристаставка и окончания для остальных
103 // тоже самое для тысяч и миллионов, только ещё с произношением тысяч и миллионов в конце так же окончание для цифр
104 // как произносить тысячи и миллионы берёт с цифры 5
105 
106 #define m_00 {\
107 	{"0","1","2","3","4","5","",""},\
108 	{"","","1f","thousand","2f","thousands-i","3","thousands-i","4","thousands-i","5","thousands","",""},\
109 	{"","","1","million","2","million-a","3","million-a","4","million-a","5","millions","",""},\
110 	0,\
111 }\
112 								//средний род именительный падеж
113 #define m_01 {\
114 	{"0","1n","2","3","4","5","",""},\
115 	{"","","1f","thousand","2f","thousands-i","3","thousands-i","4","thousands-i","5","thousands","",""},\
116 	{"","","","million","2","million-a","3","million-a","4","million-a","5","millions","",""},\
117 	0,\
118 }\
119 
120 //женский
121 #define m_02 {\
122 	{"0","1f","2f","3","4","5","",""},\
123 	{"","","1f","thousand","2f","thousands-i","3","thousands-i","4","thousands-i","5","thousands","",""},\
124 	{"","","1","million","2","million-a","3","million-a","4","million-a","5","millions","",""},\
125 	0,\
126 }\
127 
128 //множественное число
129 #define m_03 {\
130 	{"","","","","","","",""},\
131 	{"","","","","","","","","","","","","",""},\
132 	{"","","","","","","","","","","","","",""},\
133 	0,\
134 }\
135 
136 //порядковый
137 //мужской
138 #define m_04 {\
139 	{"h-0m","h-1m","h-2m","h-3m","h-4m","h-5m","h-","m"},\
140 	{"","","1f","thousand","2f","thousands-i","3","thousands-i","4","thousands-i","5","thousands","",""},\
141 	{"","","","million","2","million-a","3","million-a","4","million-a","5","millions","",""},\
142 	0,\
143 }\
144 								//средний
145 
146 #define m_05 {\
147 	{"0","1n","2","3","4","5","",""},\
148 	{"","","1f","thousand","2f","thousands-i","3","thousands-i","4","thousands-i","5","thousands","",""},\
149 	{"","","","million","2","million-a","3","million-a","4","million-a","5","millions","",""},\
150 	0,\
151 }\
152 
153 								//женский
154 #define m_06 {\
155 	{"h-0f","h-1f","h-2f","h-3f","h-4f","h-5f","h-","f"},\
156 	{"","","1f","thousand","2f","thousands-i","3","thousands-i","4","thousands-i","5","thousands","",""},\
157 	{"","","1","million","2","million-a","3","million-a","4","million-a","5","millions","",""},\
158 	0,\
159 }\
160 
161 //множественное число
162 #define m_07 {\
163 	{"","","","","","","",""},\
164 	{"","","","","","","","","","","","","",""},\
165 	{"","","","","","","","","","","","","",""},\
166 	0,\
167 }\
168 
169 
170 
171 //Родительный  Кого? Чего?
172 //количественный/числительное
173 //мужской
174 #define m_10 {\
175 	{"","","","","","","",""},\
176 	{"","","","","","","","","","","","","",""},\
177 	{"","","","","","","","","","","","","",""},\
178 	0,\
179 }\
180 								//средний
181 #define m_11 {\
182 	{"","","","","","","",""},\
183 	{"","","","","","","","","","","","","",""},\
184 	{"","","","","","","","","","","","","",""},\
185 	0,\
186 }\
187 
188 //женский
189 #define m_12 {\
190 	{"0","h-1xx","h-2xx","h-3xx","h-4xx","h-5xx","h-","xx"},\
191 	{"","","1xx","thousands-i","h-2xx","thousands","h-3xx","thousands","h-4xx","thousands","h-5xx","thousands","h-","xx"},\
192 	{"","","1x","million-a","h-2xx","millions","h-3xx","millions","h-4xx","millions","h-5xx","millions","h-","xx"},\
193 	0,\
194 }\
195 
196 //множественное число
197 #define m_13 {\
198 	{"","","","","","","",""},\
199 	{"","","","","","","","","","","","","",""},\
200 	{"","","","","","","","","","","","","",""},\
201 	0,\
202 }\
203 
204 //порядковый
205 //мужской
206 //родительный
207 #define m_14 {\
208 	{"h-0x","h-1x","h-2x","h-3x","h-4x","h-5x","h-","x"},\
209 	{"","","","h-thousandx","h-2xx","h-thousandx","h-3xx","h-thousandx","h-4xx","h-thousandx","h-5xx","h-thousandx","h-","xx"},\
210 	{"","","","h-millionx","h-2xx","h-millionx","h-3xx","h-millionx","h-4xx","h-millionx","h-5xx","h-millionx","h-","xx"},\
211 	0,\
212 }\
213 								//средний
214 #define m_15 {\
215 	{"","","","","","","",""},\
216 	{"","","","","","","","","","","","","",""},\
217 	{"","","","","","","","","","","","","",""},\
218 	0,\
219 }\
220 								//женский
221 #define m_16 {\
222 	{"","","","","","","",""},\
223 	{"","","","","","","","","","","","","",""},\
224 	{"","","","","","","","","","","","","",""},\
225 	0,\
226 }\
227 
228 //множественное число
229 #define m_17 {\
230 	{"","","","","","","",""},\
231 	{"","","","","","","","","","","","","",""},\
232 	{"","","","","","","","","","","","","",""},\
233 	0,\
234 }\
235 
236 
237 
238 //дательный    Кого? Что?
239 //количественный/числительное
240 //мужской
241 #define m_20 {\
242 	{"","","","","","","",""},\
243 	{"","","","","","","","","","","","","",""},\
244 	{"","","","","","","","","","","","","",""},\
245 	0,\
246 }\
247 								//средний
248 #define m_21 {\
249 	{"","","","","","","",""},\
250 	{"","","","","","","","","","","","","",""},\
251 	{"","","","","","","","","","","","","",""},\
252 	0,\
253 }\
254 
255 //женский
256 #define m_22 {\
257 	{"","","","","","","",""},\
258 	{"","","","","","","","","","","","","",""},\
259 	{"","","","","","","","","","","","","",""},\
260 	0,\
261 }\
262 
263 //множественное число
264 #define m_23 {\
265 	{"","","","","","","",""},\
266 	{"","","","","","","","","","","","","",""},\
267 	{"","","","","","","","","","","","","",""},\
268 	0,\
269 }\
270 
271 //порядковый
272 //мужской
273 #define m_24 {\
274 	{"","","","","","","",""},\
275 	{"","","","","","","","","","","","","",""},\
276 	{"","","","","","","","","","","","","",""},\
277 	0,\
278 }\
279 								//средний
280 #define m_25 {\
281 	{"","","","","","","",""},\
282 	{"","","","","","","","","","","","","",""},\
283 	{"","","","","","","","","","","","","",""},\
284 	0,\
285 }\
286 								//женский
287 #define m_26 {\
288 	{"","","","","","","",""},\
289 	{"","","","","","","","","","","","","",""},\
290 	{"","","","","","","","","","","","","",""},\
291 	0,\
292 }\
293 
294 //множественное число
295 #define m_27 {\
296 	{"","","","","","","",""},\
297 	{"","","","","","","","","","","","","",""},\
298 	{"","","","","","","","","","","","","",""},\
299 	0,\
300 }\
301 
302 
303 
304 //Винительный  Кого? animate - одушевлённый
305 //количественный/числительное
306 //мужской
307 #define m_30 {\
308 	{"","","","","","","",""},\
309 	{"","","","","","","","","","","","","",""},\
310 	{"","","","","","","","","","","","","",""},\
311 	0,\
312 }\
313 								//средний
314 #define m_31 {\
315 	{"","","","","","","",""},\
316 	{"","","","","","","","","","","","","",""},\
317 	{"","","","","","","","","","","","","",""},\
318 	0,\
319 }\
320 
321 //женский
322 #define m_32 {\
323 	{"","","","","","","",""},\
324 	{"","","","","","","","","","","","","",""},\
325 	{"","","","","","","","","","","","","",""},\
326 	0,\
327 }\
328 
329 //множественное число
330 #define m_33 {\
331 	{"","","","","","","",""},\
332 	{"","","","","","","","","","","","","",""},\
333 	{"","","","","","","","","","","","","",""},\
334 	0,\
335 }\
336 
337 //порядковый
338 //мужской
339 #define m_34 {\
340 	{"","","","","","","",""},\
341 	{"","","","","","","","","","","","","",""},\
342 	{"","","","","","","","","","","","","",""},\
343 	0,\
344 }\
345 								//средний
346 #define m_35 {\
347 	{"","","","","","","",""},\
348 	{"","","","","","","","","","","","","",""},\
349 	{"","","","","","","","","","","","","",""},\
350 	0,\
351 }\
352 								//женский
353 #define m_36 {\
354 	{"","","","","","","",""},\
355 	{"","","","","","","","","","","","","",""},\
356 	{"","","","","","","","","","","","","",""},\
357 	0,\
358 }\
359 
360 //множественное число
361 #define m_37 {\
362 	{"","","","","","","",""},\
363 	{"","","","","","","","","","","","","",""},\
364 	{"","","","","","","","","","","","","",""},\
365 	0,\
366 }\
367 
368 
369 
370 //Винительный  Что?  inanimate - неодушевлённый
371 //количественный/числительное
372 //мужской
373 #define m_40 {\
374 	{"","","","","","","",""},\
375 	{"","","","","","","","","","","","","",""},\
376 	{"","","","","","","","","","","","","",""},\
377 	0,\
378 }\
379 								//средний
380 #define m_41 {\
381 	{"","","","","","","",""},\
382 	{"","","","","","","","","","","","","",""},\
383 	{"","","","","","","","","","","","","",""},\
384 	0,\
385 }\
386 
387 //женский
388 #define m_42 {\
389 	{"","","","","","","",""},\
390 	{"","","","","","","","","","","","","",""},\
391 	{"","","","","","","","","","","","","",""},\
392 	0,\
393 }\
394 
395 //множественное число
396 #define m_43 {\
397 	{"","","","","","","",""},\
398 	{"","","","","","","","","","","","","",""},\
399 	{"","","","","","","","","","","","","",""},\
400 	0,\
401 }\
402 
403 //порядковый
404 //мужской
405 #define m_44 {\
406 	{"","","","","","","",""},\
407 	{"","","","","","","","","","","","","",""},\
408 	{"","","","","","","","","","","","","",""},\
409 	0,\
410 }\
411 								//средний
412 #define m_45 {\
413 	{"","","","","","","",""},\
414 	{"","","","","","","","","","","","","",""},\
415 	{"","","","","","","","","","","","","",""},\
416 	0,\
417 }\
418 								//женский
419 #define m_46 {\
420 	{"","","","","","","",""},\
421 	{"","","","","","","","","","","","","",""},\
422 	{"","","","","","","","","","","","","",""},\
423 	0,\
424 }\
425 
426 //множественное число
427 #define m_47 {\
428 	{"","","","","","","",""},\
429 	{"","","","","","","","","","","","","",""},\
430 	{"","","","","","","","","","","","","",""},\
431 	0,\
432 }\
433 
434 
435 
436 //Творительный Кем? Чем?
437 //количественный/числительное
438 //мужской
439 #define m_50 {\
440 	{"","","","","","","",""},\
441 	{"","","","","","","","","","","","","",""},\
442 	{"","","","","","","","","","","","","",""},\
443 	0,\
444 }\
445 								//средний
446 #define m_51 {\
447 	{"","","","","","","",""},\
448 	{"","","","","","","","","","","","","",""},\
449 	{"","","","","","","","","","","","","",""},\
450 	0,\
451 }\
452 
453 //женский
454 #define m_52 {\
455 	{"","","","","","","",""},\
456 	{"","","","","","","","","","","","","",""},\
457 	{"","","","","","","","","","","","","",""},\
458 	0,\
459 }\
460 
461 //множественное число
462 #define m_53 {\
463 	{"","","","","","","",""},\
464 	{"","","","","","","","","","","","","",""},\
465 	{"","","","","","","","","","","","","",""},\
466 	0,\
467 }\
468 
469 //порядковый
470 //мужской
471 #define m_54 {\
472 	{"","","","","","","",""},\
473 	{"","","","","","","","","","","","","",""},\
474 	{"","","","","","","","","","","","","",""},\
475 	0,\
476 }\
477 								//средний
478 #define m_55 {\
479 	{"","","","","","","",""},\
480 	{"","","","","","","","","","","","","",""},\
481 	{"","","","","","","","","","","","","",""},\
482 	0,\
483 }\
484 								//женский
485 #define m_56 {\
486 	{"","","","","","","",""},\
487 	{"","","","","","","","","","","","","",""},\
488 	{"","","","","","","","","","","","","",""},\
489 	0,\
490 }\
491 
492 //множественное число
493 #define m_57 {\
494 	{"","","","","","","",""},\
495 	{"","","","","","","","","","","","","",""},\
496 	{"","","","","","","","","","","","","",""},\
497 	0,\
498 }\
499 
500 
501 
502 //Предложный   О ком? О чём?
503 //количественный/числительное
504 //мужской
505 #define m_60 {\
506 	{"","","","","","","",""},\
507 	{"","","","","","","","","","","","","",""},\
508 	{"","","","","","","","","","","","","",""},\
509 	0,\
510 }\
511 								//средний
512 #define m_61 {\
513 	{"","","","","","","",""},\
514 	{"","","","","","","","","","","","","",""},\
515 	{"","","","","","","","","","","","","",""},\
516 	0,\
517 }\
518 
519 //женский
520 #define m_62 {\
521 	{"","","","","","","",""},\
522 	{"","","","","","","","","","","","","",""},\
523 	{"","","","","","","","","","","","","",""},\
524 	0,\
525 }\
526 
527 //множественное число
528 #define m_63 {\
529 	{"","","","","","","",""},\
530 	{"","","","","","","","","","","","","",""},\
531 	{"","","","","","","","","","","","","",""},\
532 	0,\
533 }\
534 
535 //порядковый
536 //мужской
537 #define m_64 {\
538 	{"","","","","","","",""},\
539 	{"","","","","","","","","","","","","",""},\
540 	{"","","","","","","","","","","","","",""},\
541 	0,\
542 }\
543 								//средний
544 #define m_65 {\
545 	{"","","","","","","",""},\
546 	{"","","","","","","","","","","","","",""},\
547 	{"","","","","","","","","","","","","",""},\
548 	0,\
549 }\
550 								//женский
551 #define m_66 {\
552 	{"","","","","","","",""},\
553 	{"","","","","","","","","","","","","",""},\
554 	{"","","","","","","","","","","","","",""},\
555 	0,\
556 }\
557 
558 //множественное число
559 #define m_67 {\
560 	{"","","","","","","",""},\
561 	{"","","","","","","","","","","","","",""},\
562 	{"","","","","","","","","","","","","",""},\
563 	0,\
564 }\
565 
566 
567 
568 //именительный
569 //именительный количественный/числительное
570 //мужской
571 #define m_60 {\
572 	{"","","","","","","",""},\
573 	{"","","","","","","","","","","","","",""},\
574 	{"","","","","","","","","","","","","",""},\
575 	0,\
576 }\
577 								//средний
578 #define m_61 {\
579 	{"","","","","","","",""},\
580 	{"","","","","","","","","","","","","",""},\
581 	{"","","","","","","","","","","","","",""},\
582 	0,\
583 }\
584 
585 //женский
586 #define m_62 {\
587 	{"","","","","","","",""},\
588 	{"","","","","","","","","","","","","",""},\
589 	{"","","","","","","","","","","","","",""},\
590 	0,\
591 }\
592 
593 //множественное число
594 #define m_63 {\
595 	{"","","","","","","",""},\
596 	{"","","","","","","","","","","","","",""},\
597 	{"","","","","","","","","","","","","",""},\
598 	0,\
599 }\
600 
601 //порядковый
602 //мужской
603 #define m_64 {\
604 	{"","","","","","","",""},\
605 	{"","","","","","","","","","","","","",""},\
606 	{"","","","","","","","","","","","","",""},\
607 	0,\
608 }\
609 								//средний
610 #define m_65 {\
611 	{"","","","","","","",""},\
612 	{"","","","","","","","","","","","","",""},\
613 	{"","","","","","","","","","","","","",""},\
614 	0,\
615 }\
616 								//женский
617 #define m_66 {\
618 	{"","","","","","","",""},\
619 	{"","","","","","","","","","","","","",""},\
620 	{"","","","","","","","","","","","","",""},\
621 	0,\
622 }\
623 
624 //множественное число
625 #define m_67 {\
626 	{"","","","","","","",""},\
627 	{"","","","","","","","","","","","","",""},\
628 	{"","","","","","","","","","","","","",""},\
629 	0,\
630 }\
631 
632