diff options
| author | Nakidai <nakidai@disroot.org> | 2025-01-08 07:04:12 +0300 |
|---|---|---|
| committer | Nakidai <nakidai@disroot.org> | 2025-01-08 07:04:12 +0300 |
| commit | 458dedc22d27302ab269b658af23736689bdce38 (patch) | |
| tree | c5f8063a5e0bb28645049b13a2203d7aea399a85 | |
| parent | 27c96525efa31bc50961a8545bec1a170e24fe87 (diff) | |
| download | tr2cyr-458dedc22d27302ab269b658af23736689bdce38.tar.gz tr2cyr-458dedc22d27302ab269b658af23736689bdce38.zip | |
Add character case support
| -rw-r--r-- | tr2cyr.c | 82 |
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; |