rewrite the module

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@13278 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 152527a1
......@@ -39,7 +39,6 @@
*
* Anthony Minessale II <anthmct@yahoo.com>
* Michael B. Murdock <mike@mmurdock.org>
* Oleg Dolya <oleg.dolya@gmail.com>
* Boris Buklov <buklov@mail.ru>
*
* mod_say_ru.c -- Say for Russian
......@@ -49,40 +48,24 @@
#include <switch.h>
#include <math.h>
#include <ctype.h>
#include "mod_say_ru.h"
typedef enum {
male, //мужского пола
female, //женского
it //оно
} sex_t;
//инициализируем массив вариантов произношения цифр описано в define mod_say_ru.h
struct say_t matrix[7][8]= {{m_00,m_01,m_02,m_03,m_04,m_05,m_06,m_07},
{m_10,m_11,m_12,m_13,m_14,m_15,m_16,m_17},
{m_20,m_21,m_22,m_23,m_24,m_25,m_26,m_27},
{m_30,m_31,m_32,m_33,m_34,m_35,m_36,m_37},
{m_40,m_41,m_42,m_43,m_44,m_45,m_46,m_47},
{m_50,m_51,m_52,m_53,m_54,m_55,m_56,m_57},
{m_60,m_61,m_62,m_63,m_64,m_65,m_66,m_67}};
typedef enum {
how_much, //сколько с полом
when, //какого - когда -- без пола
what_ //какая/какой/какое с полом
} question_t; //вопрос
typedef enum {
million,
thousand,
zero,
empty
} unit_t;
SWITCH_MODULE_LOAD_FUNCTION(mod_say_ru_load);
SWITCH_MODULE_DEFINITION(mod_say_ru, mod_say_ru_load, NULL, NULL);
#define say_num(num, t) { \
char tmp[80];\
switch_status_t tstatus;\
switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)num); \
if ((tstatus = ru_say_general_count(session, tmp, SST_ITEMS, t, args)) != SWITCH_STATUS_SUCCESS) {\
return tstatus;\
}}\
#define say_file(...) {\
char tmp[80];\
switch_status_t tstatus;\
......@@ -95,6 +78,48 @@ SWITCH_MODULE_DEFINITION(mod_say_ru, mod_say_ru_load, NULL, NULL);
}}\
static char *strip_commas(char *in, char *out, switch_size_t len)
{
char *p = in, *q = out;
char *ret = out;
switch_size_t x = 0;
for (; p && *p; p++) {
if ((*p > 47 && *p < 58)) {
*q++ = *p;
} else if (*p != ',') {
ret = NULL;
break;
}
if (++x > len) {
ret = NULL;
break;
}
}
return ret;
}
static char *strip_nonnumerics(char *in, char *out, switch_size_t len)
{
char *p = in, *q = out;
char *ret = out;
switch_size_t x = 0;
// valid are 0 - 9, period (.), minus (-), and plus (+) - remove all others
for (; p && *p; p++) {
if ((*p > 47 && *p < 58) || *p == '.' || *p == '-' || *p == '+') {
*q++ = *p;
}
if (++x > len) {
ret = NULL;
break;
}
}
return ret;
}
static switch_status_t ru_spell(switch_core_session_t *session, char *tosay, switch_say_type_t type, switch_say_method_t method, switch_input_args_t *args)
{
char *p;
......@@ -111,994 +136,117 @@ static switch_status_t ru_spell(switch_core_session_t *session, char *tosay, swi
}
}
}
return SWITCH_STATUS_SUCCESS;
}
//воспроизводить по 3 цифры
static switch_status_t play_group( sex_t sex,question_t question, int a, int b, int c,
unit_t what,int last, switch_core_session_t *session, switch_input_args_t *args)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group %d %d %d sex=%d q=%d last=%d\n", a,b,c,sex,question,last);
if (a) {
if ((b==0)||(c==0)) { // если b и с равны 0 то сказать шестьсот, сестисотый, шестисотая
switch (question) {
//------------------------------------------------------
case how_much: //сколько когда дальше нету цифр например 100 200...
switch (sex) { //пол
case male: //мужчина
say_file("digits/%d00.wav", a); //сто
if (what==thousand) {
say_file("digits/thousands.wav");//тысяч
}
else if (what==million) {
say_file("digits/millions.wav");//миллионов
}
//-------------
break;
case female: //женщина
say_file("digits/%d00.wav", a);//сто
if (what==thousand) {
say_file("digits/thousands.wav");//тысяч
}
else if (what==million) {
say_file("digits/millions.wav");//миллионов
}
break;
//-------------
case it: //оно
say_file("digits/%d00.wav", a);//сто
if (what==thousand) {
say_file("digits/thousands.wav"); //тысяч
}
else if (what==million) {
say_file("digits/millions.wav");//миллионов
}
break;
//-------------
}
break;
//------------------------------------------------------
case what_: //какой/я/ое
switch (sex) { //пол
case male: //мужчина
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d00xx.wav", a);//двухсот
say_file("digits/h-millionx.wav");//тысячный
}
else {
say_file("digits/%d00.wav", a);//двести
say_file("digits/thousands.wav");//тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d00xx.wav", a);//двухсот
say_file("digits/h-millionm.wav");//Миллионный
}
else {
say_file("digits/%d00.wav", a);//двести
say_file("digits/millions.wav");//миллионов
}
}
else {
say_file("digits/h-%d00m.wav", a);//сотый двухсотый
}
break;
case female: //женщина
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d00xx.wav", a);//двухсот
say_file("digits/h-millionf.wav");//тысячная
}
else {
say_file("digits/%d00.wav", a);//двести
say_file("digits/thousands.wav");//тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d00xx.wav", a);//двухсот
say_file("digits/h-millionf.wav");//Миллионная
}
else {
say_file("digits/%d00.wav", a);//двести
say_file("digits/millions.wav");//миллионов
}
}
else {
say_file("digits/h-%d00f.wav", a);//сотая двухсотая
}
break;
case it: //оно
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d00xx.wav", a);//двухсот
say_file("digits/h-millionn.wav");//тысячное
}
else {
say_file("digits/%d00.wav", a);//двести
say_file("digits/thousands.wav");//тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d00xx.wav", a);//двухсот
say_file("digits/h-millionn.wav");//Миллионное
}
else {
say_file("digits/%d00.wav", a);//двести
say_file("digits/millions.wav");//миллионов
}
}
else {
say_file("digits/h-%d00n.wav", a);//сотого
}
break;
}
break;
//-------------------------------------------------------
case when: //какого - когда без пола
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d00xx.wav", a);//двухсот
say_file("digits/h-millionx.wav");//тысячного
}
else {
say_file("digits/%d00.wav", a);//двести
say_file("digits/thousands.wav");//тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d00xx.wav", a);//двухсот
say_file("digits/h-millionx.wav");//Миллионного
}
else {
say_file("digits/%d00.wav", a);//двести
say_file("digits/millions.wav");//миллионов
}
}
else {
say_file("digits/h-%d00x.wav", a);//сотого
}
break;
} //end switch (question)
}//end if ((b==0)||(c==0))
else // если есть ещё цифры
{
switch (question) {
case how_much:
say_file("digits/%d00.wav", a); //просто сто и тд
break;
case what_:
if (last==0) {
say_file("digits/h-%d00xx.wav", a);
}
else {
say_file("digits/%d00.wav", a); //сто
}
break;
case when:
if (last==0) {
say_file("digits/h-%d00xx.wav", a);
}
else {
say_file("digits/%d00.wav", a); //сто
}
break;
}
}
}//end if (a)
if (b) // если b больше 0
{
if (b > 1) { //если цифры больше 19
if (c==0) { // если c == нолю 20-30-40-50
switch (question) {
//------------------------------------------------------
case how_much: //сколько когда дальше нету цифр например 10 20...
switch (sex) { //пол
case male: //мужчина
say_file("digits/%d0.wav", b); //двадцать
if (what==thousand) {
say_file("digits/thousands.wav", b); //тысяч
}
else if (what==million) {
say_file("digits/millions.wav", b); //миллионов
}
//-------------
break;
static switch_status_t play_group(say_type_t say_type, casus_t casus, int a, int b, int c,
unit_t what, switch_core_session_t *session, switch_input_args_t *args)
{
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "a= %d b=%d c=%d what=%d!\n", a, b, c,what);
case female: //женщина
say_file("digits/%d0.wav", b);//двадцать
if (what==thousand) {
say_file("digits/thousands.wav", b); //тысяч
}
else if (what==million) {
say_file("digits/millions.wav", b); //миллионов
}
break;
//-------------
case it: //оно
say_file("digits/%d0.wav", b);// двадцать
if (what==thousand) {
say_file("digits/thousands.wav", b); //тысяч
}
else if (what==million) {
say_file("digits/millions.wav", b); //миллионов
}
break;
//-------------
}
break;
//------------------------------------------------------
case what_: //какой/я/ое >19 и c==0 20-30-40
switch (sex) { //пол
case male: //мужчина
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d0xx.wav", b);//двадцати
say_file("digits/h-thousandm.wav", b); //тысячный
}
else {
say_file("digits/%d0.wav", b);//двадцать
say_file("digits/h-thousand.wav", b); //тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d0xx.wav", b);//двадцати
say_file("digits/h-millionm.wav", b); //миллионный
}
else {
say_file("digits/%d0.wav", b);//двадцать
say_file("digits/h-thousand.wav", b); //миллионов
}
}
else { //без миллионов и тысяч
if (last==0) {
say_file("digits/h-%d0m.wav", b);//двадцатый
}
else {
say_file("digits/%d0.wav", b);//двадцать
}
}
break;
case female: //женщина
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d0xx.wav", b);//двадцати
say_file("digits/h-thousandf.wav", b); //тысячная
}
else {
say_file("digits/%d0.wav", b);//двадцать
say_file("digits/h-thousand.wav", b); //тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d0xx.wav", b);//двадцати
say_file("digits/h-millionf.wav", b); //миллионная
}
else {
say_file("digits/%d0.wav", b);//двадцать
say_file("digits/h-thousand.wav", b); //миллионов
}
}
else { //без миллионов и тысяч
if (last==0) {
say_file("digits/h-%d0f.wav", b);//двадцатая
}
else {
say_file("digits/%d0.wav", b);//двадцать
}
}
break;
case it: //оно
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d0xx.wav", b);//двадцати
say_file("digits/h-thousandn.wav", b); //тысячное
}
else {
say_file("digits/%d0.wav", b);//двадцать
say_file("digits/h-thousand.wav", b); //тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d0xx.wav", b);//двадцати
say_file("digits/h-millionn.wav", b); //миллионное
}
else {
say_file("digits/%d0.wav", b);//двадцать
say_file("digits/h-thousand.wav", b); //миллионов
}
}
else { //без миллионов и тысяч
if (last==0) {
say_file("digits/h-%d0n.wav", b);//двадцатое
}
else {
say_file("digits/%d0.wav", b);//двадцать
}
}
break;
}
break;
//-------------------------------------------------------
case when: //какого - когда без пола
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d0xx.wav", b);//двадцати
say_file("digits/h-thousandx.wav", b); //тысячного
}
else {
say_file("digits/%d0.wav", b);//двадцать
say_file("digits/h-thousand.wav", b); //тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d0xx.wav", b);//двадцати
say_file("digits/h-millionx.wav", b); //миллионного
}
else {
say_file("digits/%d0.wav", b);//двадцать
say_file("digits/h-thousand.wav", b); //миллионов
}
}
else { //без миллионов и тысяч
if (last==0) {
say_file("digits/h-%d0x.wav", b);//двадцатого
}
else {
say_file("digits/%d0.wav", b);//двадцать
}
}
break;
}
}//конец если c == нолю
else
{
say_file("digits/%d0.wav", b); // иначе просто двадцать .. и тд
}
}//конец если больше 19
else { //если цифры меньше 20
switch (question) {
//------------------------------------------------------
case how_much: //сколько когда от 10 до 19
switch (sex) { //пол
case male: //мужчина
say_file("digits/%d%d.wav",b ,c); //девятнадцать
if (what==thousand) {
say_file("digits/thousands.wav"); //тысяч
}
else if (what==million) {
say_file("digits/millions.wav"); //миллионов
}
//-------------
break;
case female: //женщина
say_file("digits/%d%d.wav",b ,c);//девятнадцать
if (what==thousand) {
say_file("digits/thousands.wav"); //тысяч
}
else if (what==million) {
say_file("digits/millions.wav"); //миллионов
}
break;
//-------------
case it: //оно
say_file("digits/%d%d.wav",b ,c);// девятнадцать
if (what==thousand) {
say_file("digits/thousands.wav"); //тысяч
}
else if (what==million) {
say_file("digits/millions.wav"); //миллионов
}
break;
//-------------
}
break;
//------------------------------------------------------
case what_: //какой/я/ое
switch (sex) { //пол
case male: //женщина
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d%dxx.wav", b,c);//десяти, пятнадцати ..
say_file("digits/h-thousandm.wav"); //тысячный
}
else {
say_file("digits/%d%d.wav", b,c);//девятнацать
say_file("digits/h-thousand.wav"); //тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d%dxx.wav", b,c);//десяти, пятнадцати ..
say_file("digits/h-millionm.wav"); //миллионный
}
else {
say_file("digits/%d%d.wav", b,c);//девятнадцать
say_file("digits/h-thousand.wav"); //миллионов
}
}
else { //без миллионов и тысяч
if (last==0) {
say_file("digits/h-%d%dm.wav", b,c);//девятнадцатый
}
else {
say_file("digits/%d%d.wav");//девятнадцать
}
}
case female: //женщина
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d%dxx.wav", b,c);//десяти, пятнадцати ..
say_file("digits/h-thousandf.wav"); //тысячная
}
else {
say_file("digits/%d%d.wav", b,c);//девятнацать
say_file("digits/h-thousand.wav"); //тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d%dxx.wav", b,c);//десяти, пятнадцати ..
say_file("digits/h-millionf.wav"); //миллионная
}
else {
say_file("digits/%d%d.wav", b,c);//девятнадцать
say_file("digits/h-thousand.wav"); //миллионов
}
}
else { //без миллионов и тысяч
if (last==0) {
say_file("digits/h-%d%df.wav", b,c);//девятнадцатая
}
else {
say_file("digits/%d%d.wav");//девятнадцать
}
}
break;
case it: //оно
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d%dxx.wav", b,c);//десяти, пятнадцати ..
say_file("digits/h-thousandn.wav"); //тысячное
}
else {
say_file("digits/%d%d.wav", b,c);//девятнацать
say_file("digits/h-thousand.wav"); //тысяч
}
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d%dxx.wav", b,c);//десяти, пятнадцати ..
say_file("digits/h-millionn.wav"); //миллионное
}
else {
say_file("digits/%d%d.wav", b,c);//девятнадцать
say_file("digits/h-thousand.wav"); //миллионов
}
}
else { //без миллионов и тысяч
if (last==0) {
say_file("digits/h-%d%dn.wav", b,c);//девятнадцатое
}
else {
say_file("digits/%d%d.wav");//девятнадцать
}
}
break;
}
break;
//-------------------------------------------------------
case when: //какого - когда без пола
if (what==thousand) {
if (last==0) {
say_file("digits/h-%d%dxx.wav", b,c);//десяти, пятнадцати ..
say_file("digits/h-thousandx.wav"); //тысячного
}
else {
say_file("digits/%d%d.wav", b,c);//девятнацать
say_file("digits/h-thousand.wav"); //тысяч
}
if (a) {
if (((b==0)&&(c==0))||(matrix[casus][say_type].all==1)) { //если b и с равны 0 то сказать шестьсот, сестисотый, шестисотая
if (what==million) { //префикс число окончание
say_file("digits/%s%d00%s.wav",matrix[casus][say_type].million[12], a, matrix[casus][say_type].million[13]);
say_file("digits/%s.wav", matrix[casus][say_type].million[11]);
}
else if (what==million) {
if (last==0) {
say_file("digits/h-%d%dxx.wav", b,c);//десяти, пятнадцати ..
say_file("digits/h-millionx.wav"); //миллионного
else if (what==thousand){
say_file("digits/%s%d00%s.wav",matrix[casus][say_type].thousand[12], a, matrix[casus][say_type].thousand[13]);
say_file("digits/%s.wav", matrix[casus][say_type].thousand[11]);
}
else {
say_file("digits/%d%d.wav", b,c);//девятнадцать
say_file("digits/h-thousand.wav"); //миллионов
}
say_file("digits/%s%d00%s.wav",matrix[casus][say_type].num[6], a, matrix[casus][say_type].num[7]);
}
else { //без миллионов и тысяч
if (last==0) {
say_file("digits/h-%d%dx.wav", b,c);//девятнадцатого
}
else {
say_file("digits/%d%d.wav");//девятнадцать
else { //если дальше есть цифры то тысячи и миллионы не прозносить пока
say_file("digits/%d00.wav",a);
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%d - круглые цифры\n",a);
}
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "выходим из a");
}
break;
}//конец если c == нолю
c=0; //что бы не проговаривать c
}// конец //если цифры меньше 20
}//конец if (b)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group c \n");
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play b\n");
if ((c)||(what==zero)) {// последняя цифра (самая сложная) или проговорить ноль , для случает когда первые цифры нули
if (c>2||c==0) {//0 и 3-9
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group c 1\n");
switch (question)
{
//------------------------------------------------------
case how_much: //сколько 3-9
switch (sex)
{ //пол
case male: //мужчина
if (what==thousand) { //тысяч
if ((c>2)&&(c<5)) {
say_file("digits/%d.wav", c);// три - четыре
say_file("digits/thousands-i.wav"); //тысячи
}
else{
say_file("digits/%d.wav", c);// пять .. девять
say_file("digits/thousands.wav"); //тысяч
}
}
else if (what==million) { //миллионов
if ((c>2)&&(c<5)) {
say_file("digits/%d.wav", c);// три четыре
say_file("digits/million-a.wav"); //миллиона
}
else{
say_file("digits/%d.wav", c);// пять .. девять
say_file("digits/millions.wav"); //миллионов
}
}
else {
say_file("digits/%d.wav", c);// три девять ноль
}
break;
case female: //женщина
if (what==thousand) { //тысяч
if ((c>2)&&(c<5)) {
say_file("digits/%d.wav", c);// три - четыре
say_file("digits/thousands-i.wav"); //тысячи
}
else{
say_file("digits/%d.wav", c);// пять .. девять
say_file("digits/thousands.wav"); //тысяч
}
}
else if (what==million) { //миллионов
if ((c>2)&&(c<5)) {
say_file("digits/%d.wav", c);// три четыре
say_file("digits/million-a.wav"); //миллиона
}
else{
say_file("digits/%d.wav", c);// пять .. девять
say_file("digits/millions.wav"); //миллионов
if (b) {
if (b>1) { //если 20 и больше
if ((c==0)||(matrix[casus][say_type].all==1)) { //если с равны 0 то сказать 20, двадцати, двадцатая
if (what==million) { //префикс число окончание
say_file("digits/%s%d0%s.wav",matrix[casus][say_type].million[12], b, matrix[casus][say_type].million[13]);
say_file("digits/%s.wav", matrix[casus][say_type].million[11]);
}
else if (what==thousand){
say_file("digits/%s%d0%s.wav",matrix[casus][say_type].thousand[12], b, matrix[casus][say_type].thousand[13]);
say_file("digits/%s.wav", matrix[casus][say_type].thousand[11]);
}
else {
say_file("digits/%d.wav", c);// три девять ноль
}
break;
//-------------
case it: //оно
if (what==thousand) { //тысяч
if ((c>2)&&(c<5)) {
say_file("digits/%d.wav", c);// три - четыре
say_file("digits/thousands-i.wav"); //тысячи
}
else{
say_file("digits/%d.wav", c);// пять .. девять
say_file("digits/thousands.wav"); //тысяч
}
}
else if (what==million) { //миллионов
if ((c>2)&&(c<5)) {
say_file("digits/%d.wav", c);// три четыре
say_file("digits/million-a.wav"); //миллиона
}
else{
say_file("digits/%d.wav", c);// пять .. девять
say_file("digits/millions.wav"); //миллионов
}
}
else {
say_file("digits/%d.wav", c);// три девять ноль
}
break;
}
break;
//------------------------------------------------------
case what_: //какой/я/ое
switch (sex)
{ //пол
case male: //мужчина
if (what==thousand) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
say_file("digits/h-thousandm.wav"); //тысячный
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand.wav"); //тысячи
}
}
else if (what==million) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
say_file("digits/h-millionm.wav"); //миллионный
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand.wav"); //миллиона
}
}//просто цифры без тысяч
else{
say_file("digits/h-%dm.wav", c);//третий нулевой ..
say_file("digits/%s%d0%s.wav",matrix[casus][say_type].num[6], b, matrix[casus][say_type].num[7]);
}
break;
case female: //женщина
if (what==thousand) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
say_file("digits/h-thousandf.wav"); //тысячная
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand.wav"); //тысячи
}
}
else if (what==million) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
say_file("digits/h-millionf.wav"); //миллионная
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand.wav"); //миллиона
}
}//просто цифры без тысяч
else{
say_file("digits/h-%df.wav", c);//третья нулевая ..
}
break;
case it: //оно
if (what==thousand) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
say_file("digits/h-thousandn.wav"); //тысячное
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand.wav"); //тысячи
}
}
else if (what==million) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
say_file("digits/h-millionn.wav"); //миллионное
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand.wav"); //миллиона
}
}//просто цифры без тысяч
else{
say_file("digits/h-%dn.wav", c);//третье нулевое ..
}
break;
}
break;
//-------------------------------------------------------
case when: //какого - когда без пола
if (what==thousand) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
say_file("digits/h-thousandx.wav"); //тысячного
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand.wav"); //тысячи
}
}
else if (what==million) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
say_file("digits/h-millionx.wav"); //миллионого
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand.wav"); //миллиона
}
}//просто цифры без тысяч
else{
say_file("digits/h-%dx.wav", c);//третьего нулевого ..
else { //если есть дальше цифры
say_file("digits/%d0.wav",b);
}
break;
}//конец switch (question)
} //конец //0 и 3-9
else if ((c==2)||(c==1)) { //1 2
switch (question) {
//------------------------------------------------------
case how_much: //
switch (sex)
{ //пол
case male: //мужчина
if (what==thousand) {
if (c==1) {
say_file("digits/%df.wav", c); // одна две
say_file("digits/thousand.wav"); //тысяча
}
else{
say_file("digits/%df.wav", c); // одна две
say_file("digits/thousands-i.wav"); //тысячи
}
else { //от 10 до 19
if (what==million) {
say_file("digits/%s%d%d%s.wav",matrix[casus][say_type].million[12], b, c, matrix[casus][say_type].million[13]);
say_file("digits/%s.wav", matrix[casus][say_type].million[11]);
}
else if (what==million) {
say_file("digits/%d.wav", c); // один два
if (c==1) {
say_file("digits/million.wav", c); //миллион
else if (what==thousand) {
say_file("digits/%s%d%d%s.wav",matrix[casus][say_type].thousand[12], b, c, matrix[casus][say_type].thousand[13]);
say_file("digits/%s.wav", matrix[casus][say_type].thousand[11]);
}
else { //один два
say_file("digits/million-a.wav"); // миллиона
else { //просто произнести цифры с префиксом и окончанием
say_file("digits/%s%d%d%s.wav",matrix[casus][say_type].num[6], b, c, matrix[casus][say_type].num[7]);
}
c=0;
}
else { //просто один два
say_file("digits/%d.wav", c); // один два
}
break;
//-------------
case female: //женщина
if (what==thousand) {
if (c==1) {
say_file("digits/%df.wav", c); // одна две
say_file("digits/thousand.wav"); //тысяча
}
else{
say_file("digits/%df.wav", c); // одна две
say_file("digits/thousands-i.wav"); //тысячи
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play c\n");
if (c||what==zero) {
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play c= %d in matrix=%s what=%d say_type=%d casus=%d\n", c,matrix[casus][say_type].num[c],what,say_type,casus);
if (c<=5) {
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "c=%d c<=5\n",c);
if (what==million) {
if ((strlen(matrix[casus][say_type].million[c*2])) > 0) { // не произносить если не заданно например 1 миллион а просто миллион
say_file("digits/%s.wav", matrix[casus][say_type].million[c*2])
}
say_file("digits/%s.wav", matrix[casus][say_type].million[c*2+1]);
}
else if (what==million) {
say_file("digits/%d.wav", c); // один два
if (c==1) {
say_file("digits/million.wav"); //миллион
else if (what==thousand) {
if ((strlen(matrix[casus][say_type].thousand[c*2])) > 0) {// // не произносить если не заданно например одна тысячас а просто тысяча
say_file("digits/%s.wav",matrix[casus][say_type].thousand[c*2])
}
else { //один два
say_file("digits/million-a.wav"); // миллиона
say_file("digits/%s.wav", matrix[casus][say_type].thousand[c*2+1]);
}
else { //просто произнести цифры с префиксом и окончанием
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play c= %d in matrix=%s!\n", c,matrix[casus][say_type].num[c]);
say_file("digits/%s.wav",matrix[casus][say_type].num[c]);
}
else { //просто одна две
say_file("digits/%df.wav", c); // одна две
}
break;
//-------------
case it: //оно
if (what==thousand) {
if (c==1) {
say_file("digits/%df.wav", c); // одна две
say_file("digits/thousand.wav"); //тысяча
}
else{
say_file("digits/%df.wav", c); // одна две
say_file("digits/thousands-i.wav"); //тысячи
}
}
else if (what==million) {
say_file("digits/%d.wav", c); // один два
if (c==1) {
say_file("digits/million.wav"); //миллион
}
else { //один два
say_file("digits/million-a.wav"); // миллиона
}
}
else { //просто одно две
say_file("digits/%dn.wav", c); // одна две
}
break;
}
break;
//------------------------------------------------------
case what_: //какой/я/ое
switch (sex)
{ //пол
case male: //мужчина
if (what==thousand) {
if (last==0) {// если дальше нету цифр значит говорить двух,одна 2-х, ...
if (c!=1) { //не произность одна тысячный
say_file("digits/h-%dxx.wav", c);//одна, двух
}
say_file("digits/h-thousandm.wav"); //тысячный
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%df.wav", c);//одна две
say_file("digits/thousands-i.wav"); //тысячи
}
}
else if (what==million) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
if (c!=1) {
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
}
say_file("digits/h-millionm.wav"); //миллионный
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand-a.wav"); //миллиона
}
}//просто цифры без тысяч
else{
say_file("digits/h-%dm.wav", c);//третий нулевой ..
}
break;
case female: //женщина
if (what==thousand) {
if (last==0) {// если дальше нету цифр значит говорить двух, 1-х, 2-х ...
if (c!=1) { //не произность одна тысячная
say_file("digits/h-%dxx.wav", c);//одна, двух
}
say_file("digits/h-thousandf.wav"); //тысячная
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%df.wav", c);//две четыре ..
say_file("digits/thousands-i.wav"); //тысячи
}
}
else if (what==million) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
if (c!=1) {
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
}
say_file("digits/h-millionf.wav"); //миллионная
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand-a.wav"); //миллиона
}
}//просто цифры без тысяч
else{
say_file("digits/h-%df.wav", c);//третья нулевая ..
}
break;
case it: //оно
if (what==thousand) {
if (last==0) {// если дальше нету цифр значит говорить двух, 1-х, 2-х ...
if (c!=1) { //не произность одна тысячное
say_file("digits/h-%dxx.wav", c);//одна, двух
}
say_file("digits/h-thousandn.wav"); //тысячное
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%df.wav", c);//две ..
say_file("digits/thousands-i.wav"); //тысячи
}
}
else if (what==million) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
if (c!=1) {
say_file("digits/h-%dxx.wav", c);//одна, двух
}
say_file("digits/h-millionn.wav"); //миллионное
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand-a.wav"); //миллиона
}
}//просто цифры без тысяч
else{
say_file("digits/h-%dn.wav", c);//третье нулевое ..
}
break;
}
break;
//-------------------------------------------------------
case when: //какого - когда без пола
if (what==thousand) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
if (c!=1) { //не произность одна тысячного
say_file("digits/h-%dxx.wav", c);//одна, двух
}
say_file("digits/h-thousandx.wav"); //тысячного
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%df.wav", c);//две четыре ..
say_file("digits/thousands-i.wav"); //тысячи
}
}
else if (what==million) {
if (last==0) {// если дальше нету цифр значит говорить двух, 3-х, 4-х ...
if (c!=1) {
say_file("digits/h-%dxx.wav", c);//одна, двух, трёх
else //больше 5
{
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "c=%d c>5\n",c);
if (what==million) {
say_file("digits/%s%d%s.wav",matrix[casus][say_type].million[12], c, matrix[casus][say_type].million[13]);
say_file("digits/%s.wav", matrix[casus][say_type].million[11]);
}
say_file("digits/h-millionx.wav"); //миллионного
else if (what==thousand) {
say_file("digits/%s%d%s.wav",matrix[casus][say_type].thousand[12], c, matrix[casus][say_type].thousand[13]);
say_file("digits/%s.wav", matrix[casus][say_type].thousand[11]);
}
else { //если есть дальше цифры меньше 1000
say_file("digits/%d.wav", c);//три четыре ..
say_file("digits/thousand-a.wav"); //миллиона
else { //просто произнести цифры с префиксом и окончанием
say_file("digits/%s%d%s.wav",matrix[casus][say_type].num[6], c, matrix[casus][say_type].num[7]);
}
}//просто цифры без тысяч
else{
say_file("digits/h-%dx.wav", c);//третьего нулевого ..
}
break;
}
}//else if ((c==2)||(c==1)) { //1 2
}//конец if ((c)||(what=="zero"))
return SWITCH_STATUS_SUCCESS;
}
static char *strip_commas(char *in, char *out, switch_size_t len)
{
char *p = in, *q = out;
char *ret = out;
switch_size_t x = 0;
for (; p && *p; p++) {
if ((*p > 47 && *p < 58)) {
*q++ = *p;
} else if (*p != ',') {
ret = NULL;
break;
}
if (++x > len) {
ret = NULL;
break;
}
}
return ret;
}
static char *strip_nonnumerics(char *in, char *out, switch_size_t len)
{
char *p = in, *q = out;
char *ret = out;
switch_size_t x = 0;
// valid are 0 - 9, period (.), minus (-), and plus (+) - remove all others
for (; p && *p; p++) {
if ((*p > 47 && *p < 58) || *p == '.' || *p == '-' || *p == '+') {
*q++ = *p;
}
if (++x > len) {
ret = NULL;
break;
}
}
return ret;
}
static switch_status_t ru_say_count(switch_core_session_t *session,
char *tosay, sex_t sex, question_t question, switch_input_args_t *args)
char *tosay, say_type_t say_type, casus_t casus, switch_input_args_t *args)
{
int in;
int x = 0;
......@@ -1107,7 +255,7 @@ static switch_status_t ru_say_count(switch_core_session_t *session,
switch_status_t status;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "ru_say_count %d %d %d other!\n", places[2], places[1], places[0]);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "ru_say_count %s!\n", tosay);
if (!(tosay = strip_commas(tosay, sbuf, sizeof(sbuf))) || strlen(tosay) > 9) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parse Error!\n");
......@@ -1116,7 +264,7 @@ static switch_status_t ru_say_count(switch_core_session_t *session,
in = atoi(tosay);
int in_ = in;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "int in=%d!\n", in);
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "int in=%d!\n", in);
if (in != 0) {
for (x = 8; x >= 0; x--) {
int num = (int) pow(10, x);
......@@ -1124,23 +272,45 @@ static switch_status_t ru_say_count(switch_core_session_t *session,
in -= places[(uint32_t) x] * num;
}
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "int in=%d \n", in);
if ((status = play_group(sex,question, places[8], places[7], places[6], million,in%1000000, session, args)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group %d %d %d million!\n", places[8], places[7], places[6]);
// switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "a=%d b=%d c=%d\n", places[8],places[7],places[6]);
//миллионы
if (places[8]||places[7]||places[6]) {
if ((in_%1000000>0)&&(matrix[casus][say_type].all!=1)) {// если поле миллионов есть цифры поизнести как числительое именительного падежа
if ((status = play_group(male_c,nominativus, places[8], places[7], places[6],million, session, args)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group %d %d %d million! status=%d\n", places[8], places[7], places[6],status);
return status;
}
if ((status = play_group(sex,question, places[5], places[4], places[3], thousand,in_%1000,session, args)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group %d %d %d thousand!\n", places[5], places[4], places[3]);
}
else {// иначе произнести в нужном падеже
if ((status = play_group(say_type,casus, places[8], places[7], places[6],million, session, args)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group %d %d %d million! status=%d\n", places[8], places[7], places[6],status);
return status;
}
if ((status = play_group(sex,question, places[2], places[1], places[0], empty, 0,session, args)) != SWITCH_STATUS_SUCCESS)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group %d %d %d other!\n", places[2], places[1], places[0]);
}
}
//тысячи
if (places[5]||places[4]||places[3]) {
if ((in_%1000>0)&&(matrix[casus][say_type].all!=1)) {// если поле миллионов есть цифры поизнести как числительое именительного падежа
if ((status = play_group(male_c,nominativus, places[5], places[4], places[3],thousand, session, args)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group %d %d %d thousand! status=%d\n", places[5], places[4], places[3],status);
return status;
}
} else { //если ноль что бы и его проговаривать в правильных падежах
if ((status = play_group(sex,question, places[2], places[1], places[0], zero,0, session, args)) != SWITCH_STATUS_SUCCESS)
}
else {// иначе произнести в нужном падеже
if ((status = play_group(say_type,casus, places[5], places[4], places[3], thousand,session, args)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group %d %d %d thousand! status=%d\n", places[5], places[4], places[3],status);
return status;
}
}
}
// сотни
if ((status = play_group(say_type,casus, places[2], places[1], places[0], empty, session, args)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group %d %d %d thousand! status=%d\n", places[5], places[4], places[3],status);
return status;
}
}
else {
if ((status = play_group(say_type, casus, places[2], places[1], places[0], zero, session, args)) != SWITCH_STATUS_SUCCESS)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group %d %d %d other!\n", places[2], places[1], places[0]);
return status;
......@@ -1150,36 +320,28 @@ static switch_status_t ru_say_count(switch_core_session_t *session,
return SWITCH_STATUS_SUCCESS;
}
//дописать
static switch_status_t ru_say_general_count(switch_core_session_t *session,
char *tosay, switch_say_type_t type, switch_say_method_t method, switch_input_args_t *args)
{
switch_status_t status;
sex_t sex;
question_t question;
casus_t casus; //падеж
say_type_t say_type;//тип произношения
if (type== SST_MESSAGES)
{
sex=it;
question=how_much;
}
else if (type== SST_NUMBER||type==SST_PERSONS)
{
sex=male;
question=how_much;
}
else if (type== SST_ITEMS)
{
sex=male;
question=what_;
}
else
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unknown Say type=[%d]\n", type);
return SWITCH_STATUS_FALSE;
}
status=ru_say_count(session,tosay,sex,question,args);
return SWITCH_STATUS_SUCCESS;
switch (type) {
case SST_MESSAGES:
say_type=it_c;
casus=nominativus;
break;
default:
say_type=male_c;
casus=nominativus;
break;
};
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " type=%d casus=%d\n", say_type,casus);
status=ru_say_count(session,tosay,say_type,casus,args);
return status;
// return SWITCH_STATUS_SUCCESS;
}
......@@ -1196,7 +358,6 @@ static switch_status_t ru_say_money(switch_core_session_t *session, char *tosay,
return SWITCH_STATUS_GENERR;
}
rubles = sbuf;
if ((kopecks = strchr(sbuf, '.'))) {
*kopecks++ = '\0';
if (strlen(kopecks) > 2) {
......@@ -1206,12 +367,12 @@ static switch_status_t ru_say_money(switch_core_session_t *session, char *tosay,
if (sbuf[0] == '+') {
rubles++;
}
if (sbuf[0] == '-') {
say_file("currency/minus.wav");
rubles++;
}
ru_say_count(session,rubles ,male,how_much,args);
ru_say_count(session,rubles ,male_c,nominativus ,args);
int irubles = atoi(rubles)%100;
int iruble = atoi(rubles)%10;
if (irubles == 1 || (irubles > 20 && iruble == 1)) {/* рубль */
......@@ -1223,9 +384,11 @@ static switch_status_t ru_say_money(switch_core_session_t *session, char *tosay,
else { /*рублей */
say_file("currency/rubles.wav");
}
/* Say kopecks */
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %s\n",kopecks );
ru_say_count(session,kopecks ,female,how_much,args);
ru_say_count(session,kopecks ,female_c,nominativus ,args);
int ikopecks = atoi(kopecks)%100;
int ikopeck = atoi(kopecks)%10;
if (ikopecks == 1 || (ikopecks > 20 && ikopeck == 1))
......@@ -1247,6 +410,7 @@ static switch_status_t ru_say_money(switch_core_session_t *session, char *tosay,
}
static switch_status_t ru_say_time(switch_core_session_t *session, char *tosay, switch_say_type_t type, switch_say_method_t method,
switch_input_args_t *args)
{
......@@ -1290,7 +454,6 @@ static switch_status_t ru_say_time(switch_core_session_t *session, char *tosay,
if (seconds >= 60) {
minutes = seconds / 60;
r = seconds % 60;
seconds = r;
}
if (minutes >= 60) {
......@@ -1301,7 +464,7 @@ static switch_status_t ru_say_time(switch_core_session_t *session, char *tosay,
}
switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)hours);
ru_say_count(session,tmp ,male,how_much,args);
ru_say_count(session,tmp ,male_c,nominativus,args);
if (((hours%10) == 1) && (hours!=11)) {
/* час */
say_file("time/hour.wav");
......@@ -1314,7 +477,7 @@ static switch_status_t ru_say_time(switch_core_session_t *session, char *tosay,
}
switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)minutes); //перевести минуты в *char
ru_say_count(session,tmp ,female,how_much,args);
ru_say_count(session,tmp ,female_c,nominativus,args);
if (((minutes%10) == 1) && (minutes!=11)) {
say_file("time/minute.wav"); //минута
}
......@@ -1327,7 +490,7 @@ static switch_status_t ru_say_time(switch_core_session_t *session, char *tosay,
if (seconds!=0) {
switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)seconds);
ru_say_count(session,tmp ,female,how_much,args);
ru_say_count(session,tmp ,female_c,nominativus,args);
if (((seconds%10) == 1) && (seconds!=11)) {
say_file("time/second.wav"); // секунда
}
......@@ -1418,14 +581,14 @@ static switch_status_t ru_say_time(switch_core_session_t *session, char *tosay,
}
if (say_day) {
switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)tm.tm_mday);
ru_say_count(session,tmp ,male,when,args);
ru_say_count(session,tmp ,male_h,genitivus,args);
}
if (say_month) {
say_file("time/mon-%d.wav", tm.tm_mon);
}
if (say_year) {
switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)(tm.tm_year + 1900));
ru_say_count(session,tmp ,male,when,args);
ru_say_count(session,tmp ,male_h,genitivus,args);
say_file("time/h-year.wav");
}
if (say_month||say_year||say_date||say_dow)
......@@ -1440,6 +603,8 @@ static switch_status_t ru_say_time(switch_core_session_t *session, char *tosay,
}
static switch_status_t ru_ip(switch_core_session_t *session, char *tosay, switch_say_type_t type, switch_say_method_t method,
switch_input_args_t *args)
{
......@@ -1466,13 +631,16 @@ static switch_status_t ru_ip(switch_core_session_t *session, char *tosay, switch
*d++ = '\0';
ru_say_count(session,a ,male,how_much,args);
ru_say_count(session,a ,male_c,nominativus,args);
say_file("digits/dot.wav");
ru_say_count(session,b ,male,how_much,args);
ru_say_count(session,b ,male_c,nominativus,args);
say_file("digits/dot.wav");
ru_say_count(session,c ,male,how_much,args);
ru_say_count(session,c ,male_c,nominativus,args);
say_file("digits/dot.wav");
ru_say_count(session,d ,male,how_much,args);
ru_say_count(session,d ,male_c,nominativus,args);
return SWITCH_STATUS_SUCCESS;
}
......@@ -1526,7 +694,6 @@ static switch_status_t ru_say(switch_core_session_t *session, char *tosay, switc
}
SWITCH_MODULE_LOAD_FUNCTION(mod_say_ru_load)
{
switch_say_interface_t *say_interface;
......
//слишком много падежей поэтому пришлось сделать массив значений
//пример таблицы склонений для 1 ниже по ссылкам
//http://ru.wiktionary.org/wiki/%D0%BE%D0%B4%D0%B8%D0%BD
//http://ru.wiktionary.org/wiki/%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9
typedef enum {
million,
thousand,
zero,
empty
} unit_t;
//тип числа порядковое или количественное
typedef enum{
nominativus, // именительный Кто? Что?
genitivus, // Родительный Кого? Чего?
dativus, // дательный Кого? Что?
accusativus_a, // Винительный Кого? animate - одушевлённый
accusativus_i, // Винительный Что? inanimate - неодушевлённый
instrumentalis, // Творительный Кем? Чем?
prepositive // Предложный О ком? О чём?
} casus_t;
typedef enum {
//количественный
male_c, //мужского пола
it_c, //среднего
female_c, //женского
plural_c, //множественное число
//порядковый
male_h, //порядковое мужского пола
it_h, //порядковое среднего
female_h, //порядковое женского
plural_h //порядковое множественное число
} say_type_t;
struct say_t{
char *num[8];
char *thousand[14];
char *million[14];
int all;
};
//именительный
//именительный количественный/числительное
//мужской род родительный падеж
//первая строка описывае как произносить цифры от 0 до 5 потом пристаставка и окончания для остальных
// тоже самое для тысяч и миллионов, только ещё с произношением тысяч и миллионов в вонце так же окончание для цифр
// как произносить тысячи и миллионы берёт с цифры 5
#define m_00 {\
{"0","1","2","3","4","5","",""},\
{"","","1f","thousand","2f","thousands-i","3","thousands-i","4","thousands-i","5","thousands","",""},\
{"","","1","million","2","million-a","3","million-a","4","million-a","5","millions","",""},\
0,\
}\
//средний род именительный падеж
#define m_01 {\
{"0","1n","2","3","4","5","",""},\
{"","","1f","thousand","2f","thousands-i","3","thousands-i","4","thousands-i","5","thousands","",""},\
{"","","","million","2","million-a","3","million-a","4","million-a","5","millions","",""},\
0,\
}\
//женский
#define m_02 {\
{"0","1f","2f","3","4","5","",""},\
{"","","1f","thousand","2f","thousands-i","3","thousands-i","4","thousands-i","5","thousands","",""},\
{"","","1","million","2","million-a","3","million-a","4","million-a","5","millions","",""},\
0,\
}\
//множественное число
#define m_03 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//порядковый
//мужской
#define m_04 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_05 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_06 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_07 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//Родительный Кого? Чего?
//количественный/числительное
//мужской
#define m_10 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_11 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_12 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_13 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//порядковый
//мужской
#define m_14 {\
{"h-0x","h-1x","h-2x","h-3x","h-4x","h-4x","h-","x"},\
{"","","","h-thousandx","h-2xx","h-thousandx","h-3xx","h-thousandx","h-4xx","h-thousandx","h-5xx","h-thousandx","h-","xx"},\
{"","","","h-millionx","h-2xx","h-millionx","h-3xx","h-millionx","h-4xx","h-millionx","h-5xx","h-millionx","h-","xx"},\
0,\
}\
//средний
#define m_15 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_16 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_17 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//дательный Кого? Что?
//количественный/числительное
//мужской
#define m_20 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_21 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_22 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_23 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//порядковый
//мужской
#define m_24 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_25 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_26 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_27 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//Винительный Кого? animate - одушевлённый
//количественный/числительное
//мужской
#define m_30 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_31 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_32 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_33 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//порядковый
//мужской
#define m_34 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_35 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_36 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_37 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//Винительный Что? inanimate - неодушевлённый
//количественный/числительное
//мужской
#define m_40 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_41 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_42 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_43 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//порядковый
//мужской
#define m_44 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_45 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_46 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_47 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//Творительный Кем? Чем?
//количественный/числительное
//мужской
#define m_50 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_51 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_52 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_53 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//порядковый
//мужской
#define m_54 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_55 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_56 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_57 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//Предложный О ком? О чём?
//количественный/числительное
//мужской
#define m_60 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_61 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_62 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_63 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//порядковый
//мужской
#define m_64 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_65 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_66 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_67 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//именительный
//именительный количественный/числительное
//мужской
#define m_60 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_61 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_62 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_63 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//порядковый
//мужской
#define m_64 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//средний
#define m_65 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//женский
#define m_66 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
//множественное число
#define m_67 {\
{"","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
{"","","","","","","","","","","","","",""},\
0,\
}\
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论