about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tr2cyr.c82
1 files changed, 45 insertions, 37 deletions
diff --git a/tr2cyr.c b/tr2cyr.c
index 8244664..9af2280 100644
--- a/tr2cyr.c
+++ b/tr2cyr.c
@@ -2,6 +2,7 @@
 #include <locale.h>
 #include <stdio.h>
 #include <wchar.h>
+#include <wctype.h>
 
 /*
  * a = а
@@ -43,56 +44,63 @@ typedef int Translator_Writer(wchar_t ch, void *arg);
 
 int Translator_convert(FILE *file, Translator_Writer *writer, void *arg)
 {
+    int lowercase;
     wint_t ch;
+
     while ((ch = getwchar()) != WEOF)
     {
+        lowercase = towlower(ch) == ch;
+
         wchar_t towrite;
-#define CASE(x, y) case x: towrite = y; break
-        switch (ch)
+#define CASE(option, lower, upper) case option: towrite = lowercase ? lower : upper; break
+        switch (towlower(ch))
         {
-        CASE(L'a', L'а');
-        CASE(L'b', L'б');
-        CASE(L'v', L'в');
-        CASE(L'g', L'г');
-        CASE(L'd', L'д');
-        CASE(L'e', L'е');
-        CASE(L'z', L'з');
-        CASE(L'i', L'и');
-        CASE(L'j', L'й');
-        CASE(L'k', L'к');
-        CASE(L'l', L'л');
-        CASE(L'm', L'м');
-        CASE(L'n', L'н');
-        CASE(L'o', L'о');
-        CASE(L'p', L'п');
-        CASE(L'r', L'р');
-        CASE(L's', L'с');
-        CASE(L't', L'т');
-        CASE(L'u', L'у');
-        CASE(L'f', L'ф');
-        CASE(L'h', L'х');
-        CASE(L'c', L'ц');
+        CASE(L'a', L'а', L'А');
+        CASE(L'b', L'б', L'Б');
+        CASE(L'v', L'в', L'В');
+        CASE(L'g', L'г', L'Г');
+        CASE(L'd', L'д', L'Д');
+        CASE(L'e', L'е', L'Е');
+        CASE(L'z', L'з', L'З');
+        CASE(L'i', L'и', L'И');
+        CASE(L'j', L'й', L'Й');
+        CASE(L'k', L'к', L'К');
+        CASE(L'l', L'л', L'Л');
+        CASE(L'm', L'м', L'М');
+        CASE(L'n', L'н', L'Н');
+        CASE(L'o', L'о', L'О');
+        CASE(L'p', L'п', L'П');
+        CASE(L'r', L'р', L'Р');
+        CASE(L's', L'с', L'С');
+        CASE(L't', L'т', L'Т');
+        CASE(L'u', L'у', L'У');
+        CASE(L'f', L'ф', L'Ф');
+        CASE(L'h', L'х', L'Х');
+        CASE(L'c', L'ц', L'Й');
         case 'y':
         {
             if ((ch = getwchar()) == WEOF)
+            {
+                writer(lowercase ? L'y' : L'Y', arg);
                 return errno ? -1 : 0;
+            }
 
-            switch(ch)
+            switch(towlower(ch))
             {
-            CASE(L'o', L'ё');
-            CASE(L'z', L'ж');
-            CASE(L'c', L'ч');
-            CASE(L's', L'ш');
-            CASE(L'g', L'щ');
-            CASE(L'"', L'ъ');
-            CASE(L'i', L'ы');
-            CASE(L'\'', L'ь');
-            CASE(L'e', L'э');
-            CASE(L'u', L'ю');
-            CASE(L'a', L'я');
+            CASE(L'o', L'ё', L'Ё');
+            CASE(L'z', L'ж', L'Ж');
+            CASE(L'c', L'ч', L'Ч');
+            CASE(L's', L'ш', L'Ш');
+            CASE(L'g', L'щ', L'Щ');
+            CASE(L'"', L'ъ', L'Ъ');
+            CASE(L'i', L'ы', L'Ы');
+            CASE(L'\'', L'ь', L'Ь');
+            CASE(L'e', L'э', L'Э');
+            CASE(L'u', L'ю', L'Ю');
+            CASE(L'a', L'я', L'Я');
             default:
             {
-                int ret = writer(L'y', arg);
+                int ret = writer(lowercase ? L'y' : L'Y', arg);
                 if (ret)
                     return ret;