]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
rewrite the module
authorBuklov Boris Vladimirovich <buklov@mail.ru>
Mon, 11 May 2009 19:06:08 +0000 (19:06 +0000)
committerBuklov Boris Vladimirovich <buklov@mail.ru>
Mon, 11 May 2009 19:06:08 +0000 (19:06 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@13278 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/say/mod_say_ru/mod_say_ru.c
src/mod/say/mod_say_ru/mod_say_ru.h [new file with mode: 0644]

index 7375dbdba03a74deaa792f56a163ec133fee98ab..68ec068dd7f254a884e89c59bc3f98a1547d474f 100644 (file)
@@ -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
 #include <switch.h>
 #include <math.h>
 #include <ctype.h>
+#include "mod_say_ru.h"
+
+//инициализируем массив вариантов произношения цифр описано в 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 {
-    male,       //мужского пола
-    female,     //женского
-    it          //оно
-} sex_t;
-            
-            
-            
-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,1010 +78,175 @@ SWITCH_MODULE_DEFINITION(mod_say_ru, mod_say_ru_load, NULL, NULL);
                }}\
 
 
-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;
 
-       for (p = tosay; p && *p; p++) {
-               int a = tolower((int) *p);
-               if (a >= 48 && a <= 57) {
-                       say_file("digits/%d.wav", a - 48);
-               } else {
-                       if (type == SST_NAME_SPELLED) {
-                               say_file("ascii/%d.wav", a);
-                       } else if (type == SST_NAME_PHONETIC) {
-                               say_file("phonetic-ascii/%d.wav", a);
-                       }
-               }
+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 SWITCH_STATUS_SUCCESS;
+        return ret;
 }
 
-//воспроизводить по 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)
+
+static char *strip_nonnumerics(char *in, char *out, switch_size_t len)
 {
-    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;
-                                 
-                           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); // иначе просто двадцать .. и тд
+    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;
+        
+    for (p = tosay; p && *p; p++) {
+        int a = tolower((int) *p);
+        if (a >= 48 && a <= 57) {
+            say_file("digits/%d.wav", a - 48);
+        } else {
+            if (type == SST_NAME_SPELLED) {
+                say_file("ascii/%d.wav", a);
+           } else if (type == SST_NAME_PHONETIC) {
+               say_file("phonetic-ascii/%d.wav", a);
            }
-       }//конец если больше 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"); //тысяч
-                                   }
-                               }
-                               else if (what==million)  {
-                                   if (last==0) {
-                                       say_file("digits/h-%d%dxx.wav", b,c);//десяти, пятнадцати ..
-                                       say_file("digits/h-millionx.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%dx.wav", b,c);//девятнадцатого
-                                   }
-                                   else {
-                                        say_file("digits/%d%d.wav");//девятнадцать
-                                   }
-                               }
-
-                               break;
-           }//конец если c == нолю
-           c=0; //что бы не проговаривать c
-       }// конец //если цифры меньше 20
-    }//конец if (b)
-    
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play group  c \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"); //миллионов
-                               }
-                           }
-                           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);//третий нулевой ..
-                           }
-                           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);//третьего нулевого ..
-                           }
-                           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 if (what==million)  {
-                                   say_file("digits/%d.wav", c); // один два
-                                   if (c==1) {
-                                       say_file("digits/million.wav", c); //миллион
-                                   }
-                                   else   { //один два
-                                       say_file("digits/million-a.wav"); // миллиона
-                                   }
-                           } 
-                           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"); //тысячи
-                                   }
-                           }
-                           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/%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);//одна, двух, трёх
-                                   }
-                                   say_file("digits/h-millionx.wav"); //миллионного
-                               }
-                               else { //если есть дальше цифры меньше 1000
-                                   say_file("digits/%d.wav", c);//три четыре ..
-                                   say_file("digits/thousand-a.wav"); //миллиона
-                               }
-                           }//просто цифры без тысяч
-                           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)
+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)
 {
-       char *p = in, *q = out;
-       char *ret = out;
-       switch_size_t x = 0;
+//    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "a= %d b=%d c=%d  what=%d!\n", a, b, c,what);
 
-       for (; p && *p; p++) {
-               if ((*p > 47 && *p < 58)) {
-                       *q++ = *p;
-               } else if (*p != ',') {
-                       ret = NULL;
-                       break;
-               }
+    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==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/%s%d00%s.wav",matrix[casus][say_type].num[6], a, matrix[casus][say_type].num[7]);
+           }
+       }
+       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");
+    }
 
-               if (++x > len) {
-                       ret = NULL;
-                       break;
+//    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "play b\n");
+    
+    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/%s%d0%s.wav",matrix[casus][say_type].num[6], b, matrix[casus][say_type].num[7]);
+               }
+           }
+           else { //если есть дальше цифры
+               say_file("digits/%d0.wav",b);
+           }
        }
-
-       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;
+       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==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/%s%d%d%s.wav",matrix[casus][say_type].num[6], b, c, matrix[casus][say_type].num[7]);
+           }
+           c=0;
+       }
+    }
+//    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])
                }
-
-               if (++x > len) {
-                       ret = NULL;
-                       break;
+               say_file("digits/%s.wav", matrix[casus][say_type].million[c*2+1]);
+           }
+           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])
                }
+               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]);
+           }
        }
-
-       return ret;
-}
+       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]);
+           }
+           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 { //просто произнести цифры с префиксом и окончанием
+               say_file("digits/%s%d%s.wav",matrix[casus][say_type].num[6], c, matrix[casus][say_type].num[7]);
+           }
+       }
+    }
+    return SWITCH_STATUS_SUCCESS;
+}                                                                                                                                                                                                                                                                                                    
 
 
 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]);
-                               return status;
+//                     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;
+                               }
+                           } 
+                           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[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]);
-                               return status;
+//тысячи         
+                       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(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(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 ((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(sex,question, places[2], places[1], places[0], zero,0, session, args)) != SWITCH_STATUS_SUCCESS) 
+       } 
+       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,296 +320,291 @@ 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;
-
-        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;
+       casus_t casus; //падеж
+       say_type_t say_type;//тип произношения
+       
+       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;
 }
-
+               
 
 
 static switch_status_t ru_say_money(switch_core_session_t *session, char *tosay, switch_say_type_t type,
-                switch_say_method_t method,switch_input_args_t *args)
+        switch_say_method_t method,switch_input_args_t *args)
 {
-        char sbuf[16] = "";                    
-        char *rubles = NULL;
-        char *kopecks = NULL;
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " ru_say_money %s\n",tosay );
-        if (strlen(tosay) > 15 || !(tosay = strip_nonnumerics(tosay, sbuf, sizeof(sbuf)))) {
-                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parse Error!\n");
-                return SWITCH_STATUS_GENERR;
-        }
-        rubles = sbuf;
+    char sbuf[16] = "";
+    char *rubles = NULL;
+    char *kopecks = NULL;
+    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " ru_say_money %s\n",tosay );
+    if (strlen(tosay) > 15 || !(tosay = strip_nonnumerics(tosay, sbuf, sizeof(sbuf)))) {
+            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parse Error!\n");
+            return SWITCH_STATUS_GENERR;
+    }
+    rubles = sbuf;
+    if ((kopecks = strchr(sbuf, '.'))) {
+            *kopecks++ = '\0';
+            if (strlen(kopecks) > 2) {
+               kopecks[2] = '\0';
+           }
+    }
+    if (sbuf[0] == '+') {
+        rubles++;
+    }
+    if (sbuf[0] == '-') {
+        say_file("currency/minus.wav");
+        rubles++;
+    }
+    
+    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)) {/* рубль */
+        say_file("currency/ruble.wav");
+    }
+    else if ((irubles > 1 && irubles < 5) || (irubles > 20 && iruble > 1 && iruble < 5))  {  /*рубля */
+        say_file("currency/ruble-a.wav");
+    }
+    else  {    /*рублей */
+        say_file("currency/rubles.wav");
+    }
 
-        if ((kopecks = strchr(sbuf, '.'))) {
-                *kopecks++ = '\0';
-                if (strlen(kopecks) > 2) {
-                        kopecks[2] = '\0';
-                }
-        }
-        if (sbuf[0] == '+') {
-                rubles++;
-        }
+    /* Say kopecks */
+    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %s\n",kopecks );
+    ru_say_count(session,kopecks ,female_c,nominativus ,args);
 
-        if (sbuf[0] == '-') {
-                say_file("currency/minus.wav");
-                rubles++;
-        }
-           ru_say_count(session,rubles ,male,how_much,args);
-           int irubles = atoi(rubles)%100;
-           int iruble = atoi(rubles)%10;
-           if (irubles == 1 || (irubles > 20 && iruble == 1)) {/* рубль */
-               say_file("currency/ruble.wav");
-           } 
-           else if ((irubles > 1 && irubles < 5) || (irubles > 20 && iruble > 1 && iruble < 5))  {  /*рубля */
-               say_file("currency/ruble-a.wav");
-           } 
-           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);
-            int ikopecks = atoi(kopecks)%100;
-            int ikopeck = atoi(kopecks)%10;
-            if (ikopecks == 1 || (ikopecks > 20 && ikopeck == 1)) 
-            {
-                /* копейка */
-                say_file("currency/kopeck.wav");
-            } 
-            else if ((ikopecks > 1 && ikopecks < 5) || (ikopecks > 20 && ikopeck > 1 && ikopeck < 5)) 
-            {
-               /* копейки */
-                say_file("currency/kopeck-i.wav");
-            }
-            else 
-            {
-               /* копеек */
-                say_file("currency/kopecks.wav");
-            }
+    int ikopecks = atoi(kopecks)%100;
+    int ikopeck = atoi(kopecks)%10;
+    if (ikopecks == 1 || (ikopecks > 20 && ikopeck == 1))
+    {
+        /* копейка */
+        say_file("currency/kopeck.wav");
+    }
+    else if ((ikopecks > 1 && ikopecks < 5) || (ikopecks > 20 && ikopeck > 1 && ikopeck < 5))
+    {
+        /* копейки */
+        say_file("currency/kopeck-i.wav");
+    }
+    else
+    {
+        /* копеек */
+        say_file("currency/kopecks.wav");
+    }
     return SWITCH_STATUS_SUCCESS;
 }
+   
 
 
 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)
+                                                                   switch_input_args_t *args)
 {
-       int32_t t;
-       char tmp[80];
-       switch_time_t target = 0, target_now = 0;
-       switch_time_exp_t tm, tm_now;
-       uint8_t say_date = 0, say_time = 0, say_year = 0, say_month = 0, say_dow = 0, say_day = 0, say_yesterday = 0, say_today = 0;
-       switch_channel_t *channel = switch_core_session_get_channel(session);
-       const char *tz = switch_channel_get_variable(channel, "timezone");
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " ru_say_time %s  type=%d method=%d\n",tosay, type,method );
-       
-       if (type == SST_TIME_MEASUREMENT) { 
-               int64_t hours = 0;
-               int64_t minutes = 0;
-               int64_t seconds = 0;
-               int64_t r = 0;
-
-               if (strchr(tosay, ':')) {
-                       char *tme = switch_core_session_strdup(session, tosay);
-                       char *p;
+        int32_t t;
+        char tmp[80];
+        switch_time_t target = 0, target_now = 0;
+        switch_time_exp_t tm, tm_now;
+        uint8_t say_date = 0, say_time = 0, say_year = 0, say_month = 0, say_dow = 0, say_day = 0, say_yesterday = 0, say_today = 0;
+        switch_channel_t *channel = switch_core_session_get_channel(session);
+        const char *tz = switch_channel_get_variable(channel, "timezone");
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " ru_say_time %s  type=%d method=%d\n",tosay, type,method );
+
+        if (type == SST_TIME_MEASUREMENT) {
+                int64_t hours = 0;
+                int64_t minutes = 0;
+                int64_t seconds = 0;
+                int64_t r = 0;
+
+                if (strchr(tosay, ':')) {
+                        char *tme = switch_core_session_strdup(session, tosay);
+                        char *p;
+
+                        if ((p = strrchr(tme, ':'))) {
+                                *p++ = '\0';
+                                seconds = atoi(p);
+                                if ((p = strchr(tme, ':'))) {
+                                        *p++ = '\0';
+                                        minutes = atoi(p);
+                                        if (tme) {
+                                                hours = atoi(tme);
+                                        }
+                                } else {
+                                        minutes = atoi(tme);
+                                }
+                        }
+                } else {
+                        if ((seconds = atol(tosay)) <= 0) {
+                                seconds = (int64_t) switch_epoch_time_now(NULL);
+                        }
+
+                        if (seconds >= 60) {
+                                minutes = seconds / 60;
+                                r = seconds % 60;
+                        }
+
+                        if (minutes >= 60) {
+                                hours = minutes / 60;
+                                r = minutes % 60;
+                                minutes = r;
+                        }
+                }
 
-                       if ((p = strrchr(tme, ':'))) {
-                               *p++ = '\0';
-                               seconds = atoi(p);
-                               if ((p = strchr(tme, ':'))) {
-                                       *p++ = '\0';
-                                       minutes = atoi(p);
-                                       if (tme) {
-                                               hours = atoi(tme);
-                                       }
-                               } else {
-                                       minutes = atoi(tme);
-                               }
-                       }
-               } else {
-                       if ((seconds = atol(tosay)) <= 0) {
-                               seconds = (int64_t) switch_epoch_time_now(NULL);
-                       }
+                switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)hours);
+                ru_say_count(session,tmp ,male_c,nominativus,args);
+                if (((hours%10) == 1) && (hours!=11)) {
+                /* час */
+                    say_file("time/hour.wav");
+                }
+                else if (((hours%10>1)&&(hours%10<5)) &&((hours<12)||(hours>14))) {
+                    say_file("time/hours-a.wav");  /* часа */
+                }
+                else {
+                    say_file("time/hours.wav"); /* часов*/
+                }
 
-                       if (seconds >= 60) {
-                               minutes = seconds / 60;
-                               r = seconds % 60;
-                               seconds = r;
-                       }
+                switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)minutes); //перевести минуты в *char
+                ru_say_count(session,tmp ,female_c,nominativus,args);
+                if (((minutes%10) == 1) && (minutes!=11)) {
+                    say_file("time/minute.wav"); //минута
+                }                                                                                                                                                                                      
+                else if (((minutes%10>1)&&(minutes%10<5))&&((minutes<12)||(minutes>14))){
+                    say_file("time/minutes-i.wav"); // минуты
+                }
+                else {
+                    say_file("time/minutes.wav"); //минут
+                }
 
-                       if (minutes >= 60) {
-                               hours = minutes / 60;
-                               r = minutes % 60;
-                               minutes = r;
-                       }
-               }
+                if (seconds!=0) {
+                    switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)seconds);
+                    ru_say_count(session,tmp ,female_c,nominativus,args);
+                    if (((seconds%10) == 1) && (seconds!=11)) {
+                        say_file("time/second.wav"); // секунда
+                    }
+                    else if (((seconds%10>1)&&(seconds%10<5))&&((seconds<12)||(seconds>14))) {
+                        say_file("time/seconds-i.wav"); // секуны
+                    }
+                    else {
+                        say_file("time/seconds.wav"); //секунд
+                    }
+                }
 
-               switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)hours);
-               ru_say_count(session,tmp ,male,how_much,args);
-               if (((hours%10) == 1) && (hours!=11)) {
-                /* час */
-                   say_file("time/hour.wav");
-               } 
-               else if (((hours%10>1)&&(hours%10<5)) &&((hours<12)||(hours>14))) {
-                   say_file("time/hours-a.wav");  /* часа */
-               } 
-               else {
-                   say_file("time/hours.wav"); /* часов*/
-               }
+                return SWITCH_STATUS_SUCCESS;
+        }
 
-                switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)minutes); //перевести минуты в *char
-                ru_say_count(session,tmp ,female,how_much,args);
-               if (((minutes%10) == 1) && (minutes!=11)) {
-                   say_file("time/minute.wav"); //минута
-               }
-               else if (((minutes%10>1)&&(minutes%10<5))&&((minutes<12)||(minutes>14))){
-                   say_file("time/minutes-i.wav"); // минуты
-               }
-               else {
-                   say_file("time/minutes.wav"); //минут
-               }
-               
-               if (seconds!=0) {
-                   switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)seconds);
-                   ru_say_count(session,tmp ,female,how_much,args);
-                   if (((seconds%10) == 1) && (seconds!=11)) {
-                       say_file("time/second.wav"); // секунда
-                   } 
-                   else if (((seconds%10>1)&&(seconds%10<5))&&((seconds<12)||(seconds>14))) {
-                       say_file("time/seconds-i.wav"); // секуны
-                   }
-                   else {
-                       say_file("time/seconds.wav"); //секунд
-                   }
-               }
+        if ((t = atol(tosay)) > 0) {
+                target = switch_time_make(t, 0);
+                target_now = switch_micro_time_now();
+        } else {
+                target = switch_micro_time_now();
+                target_now = switch_micro_time_now();
+        }
 
-               return SWITCH_STATUS_SUCCESS;
-       }
+        if (tz) {
+                int check = atoi(tz);
+                if (check) {
+                        switch_time_exp_tz(&tm, target, check);
+                        switch_time_exp_tz(&tm_now, target_now, check);
+                } else {
+                        switch_time_exp_tz_name(tz, &tm, target);
+                        switch_time_exp_tz_name(tz, &tm_now, target_now);
+                }
+        } else {
+                switch_time_exp_lt(&tm, target);
+                switch_time_exp_lt(&tm_now, target_now);
+        }
+        switch (type) {
+        case SST_CURRENT_DATE_TIME:
+                say_date = say_time = 1;
+                break;
+        case SST_CURRENT_DATE:
+                say_date = 1;
+                break;
+        case SST_CURRENT_TIME:
+                say_time = 1;
+                break;
+        case SST_SHORT_DATE_TIME:
+                say_time = 1;
+                if (tm.tm_year != tm_now.tm_year) {
+                        say_date = 1;
+                        break;
+                }
+                if (tm.tm_yday == tm_now.tm_yday) {
+                        say_today = 1;
+                        break;
+                }
+                if (tm.tm_yday == tm_now.tm_yday - 1) {
+                        say_yesterday = 1;
+                        break;
+                }
+                if (tm.tm_yday >= tm_now.tm_yday - 5) {
+                        say_dow = 1;
+                        break;
+                }
+                if (tm.tm_mon != tm_now.tm_mon) {
+                        say_month = say_day = say_dow = 1;
+                        break;
+                }
 
-       if ((t = atol(tosay)) > 0) {
-               target = switch_time_make(t, 0);
-               target_now = switch_micro_time_now();
-       } else {
-               target = switch_micro_time_now();
-               target_now = switch_micro_time_now();
-       }
-       
-       if (tz) {
-               int check = atoi(tz);
-               if (check) {
-                       switch_time_exp_tz(&tm, target, check);
-                       switch_time_exp_tz(&tm_now, target_now, check);
-               } else {
-                       switch_time_exp_tz_name(tz, &tm, target);
-                       switch_time_exp_tz_name(tz, &tm_now, target_now);
-               }
-       } else {
-               switch_time_exp_lt(&tm, target);
-               switch_time_exp_lt(&tm_now, target_now);
-       }
-       switch (type) {
-       case SST_CURRENT_DATE_TIME:
-               say_date = say_time = 1;
-               break;
-       case SST_CURRENT_DATE:
-               say_date = 1;
-               break;
-       case SST_CURRENT_TIME:
-               say_time = 1;
-               break;
-       case SST_SHORT_DATE_TIME:
-               say_time = 1;
-               if (tm.tm_year != tm_now.tm_year) {
-                       say_date = 1;
-                       break;
-               }
-               if (tm.tm_yday == tm_now.tm_yday) {
-                       say_today = 1;
-                       break;
-               }
-               if (tm.tm_yday == tm_now.tm_yday - 1) {
-                       say_yesterday = 1;
-                       break;
-               }
-               if (tm.tm_yday >= tm_now.tm_yday - 5) {
-                       say_dow = 1;
-                       break;
-               }
-               if (tm.tm_mon != tm_now.tm_mon) {
-                       say_month = say_day = say_dow = 1;
-                       break;
-               }
+                say_month = say_day = say_dow = 1;
 
-               say_month = say_day = say_dow = 1;
-               
-               break;
-       default:
-               break;
-       }
+                break;
+        default:
+                break;
+        }
 
-       if (say_today) {
-               say_file("time/today.wav");
-       }
-       if (say_yesterday) {
-               say_file("time/yesterday.wav");
-       }
-       if (say_dow) {
-               say_file("time/day-%d.wav", tm.tm_wday);
-       }
-       if (say_date) {
-               say_year = say_month = say_day = say_dow = 1;
-               say_today = say_yesterday = 0;
-       }
-       if (say_day) {
-               switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)tm.tm_mday);
-               ru_say_count(session,tmp ,male,when,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);
-               say_file("time/h-year.wav");
-       }
-       if (say_month||say_year||say_date||say_dow)
-       {
-           say_file("time/at.wav");
-       }
-       if (say_time) {
-               switch_snprintf(tmp, sizeof(tmp), "%d:%d:%d",tm.tm_hour+1,tm.tm_min,tm.tm_sec);
-               ru_say_time(session, tmp, SST_TIME_MEASUREMENT, method, args);
-       }
-       return SWITCH_STATUS_SUCCESS;
+        if (say_today) {
+                say_file("time/today.wav");
+        }
+        if (say_yesterday) {
+                say_file("time/yesterday.wav");
+        }
+        if (say_dow) {
+                say_file("time/day-%d.wav", tm.tm_wday);
+        }
+        if (say_date) {
+                say_year = say_month = say_day = say_dow = 1;
+                say_today = say_yesterday = 0;
+        }
+        if (say_day) {
+                switch_snprintf(tmp, sizeof(tmp), "%u", (unsigned)tm.tm_mday);
+                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_h,genitivus,args);
+                say_file("time/h-year.wav");
+        }
+        if (say_month||say_year||say_date||say_dow)
+        {
+            say_file("time/at.wav");
+        }
+        if (say_time) {
+                switch_snprintf(tmp, sizeof(tmp), "%d:%d:%d",tm.tm_hour+1,tm.tm_min,tm.tm_sec);
+                ru_say_time(session, tmp, SST_TIME_MEASUREMENT, method, args);
+        }
+        return SWITCH_STATUS_SUCCESS;
 }
 
 
+   
 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)
 {
@@ -1447,37 +612,40 @@ static switch_status_t ru_ip(switch_core_session_t *session, char *tosay, switch
     if (!(a = switch_core_session_strdup(session, tosay))) {
         return SWITCH_STATUS_FALSE;
     }
-    
+
     if (!(b = strchr(a, '.'))) {
         return SWITCH_STATUS_FALSE;
     }
-                                            
+
     *b++ = '\0';
-                                                                            
+
     if (!(c = strchr(b, '.'))) {
         return SWITCH_STATUS_FALSE;
     }
-                                                                                            
+
     *c++ = '\0';
-    
+
     if (!(d = strchr(c, '.'))) {
         return SWITCH_STATUS_FALSE;
     }
-    
+
     *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;
 }
-                                                                                                                                                                                                                                
 
-        
+    
 static switch_status_t ru_say(switch_core_session_t *session, char *tosay, switch_say_type_t type, switch_say_method_t method, switch_input_args_t *args)
 {
     switch_say_callback_t say_cb = NULL;
@@ -1524,9 +692,8 @@ static switch_status_t ru_say(switch_core_session_t *session, char *tosay, switc
         }
         return SWITCH_STATUS_FALSE;
 }
+            
                                                                                                                                                 
-
-
 SWITCH_MODULE_LOAD_FUNCTION(mod_say_ru_load)
 {
        switch_say_interface_t *say_interface;
diff --git a/src/mod/say/mod_say_ru/mod_say_ru.h b/src/mod/say/mod_say_ru/mod_say_ru.h
new file mode 100644 (file)
index 0000000..a42141b
--- /dev/null
@@ -0,0 +1,581 @@
+//слишком много падежей поэтому пришлось сделать массив значений
+//пример таблицы склонений для 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,\
+}\
+
+
+