diff options
author | elfmz <fenix1905@tut.by> | 2022-01-23 02:04:29 +0300 |
---|---|---|
committer | elfmz <fenix1905@tut.by> | 2022-01-23 02:04:29 +0300 |
commit | a0b3a3cd77406f2ee4a221c282af8e4647412372 (patch) | |
tree | 2328e3e2fa57e0e629a4b92f4cad406ca035e814 /far2l/src/locale | |
parent | 6043c54425f335ee6ce14bf198026aed018d7ebd (diff) |
use original FARs Xlat() function; impl partial xlat
Diffstat (limited to 'far2l/src/locale')
-rw-r--r-- | far2l/src/locale/xlat.cpp | 235 | ||||
-rw-r--r-- | far2l/src/locale/xlat.hpp | 14 |
2 files changed, 101 insertions, 148 deletions
diff --git a/far2l/src/locale/xlat.cpp b/far2l/src/locale/xlat.cpp index 2d693c7c..94f8d248 100644 --- a/far2l/src/locale/xlat.cpp +++ b/far2l/src/locale/xlat.cpp @@ -51,178 +51,119 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "xlat.hpp" #include "console.hpp" -wchar_t* WINAPI Xlat(wchar_t *Line, - int StartPos, - int EndPos, - DWORD Flags) +Xlater::Xlater(DWORD flags) { - wchar_t Chr,ChrOld; - int PreLang=2,CurLang=2; // unknown - int LangCount[2]={0,0}; - int IsChange=0; - - if (!Line || !*Line) - return nullptr; + _min_len_table = Min(Opt.XLat.Table[0].GetLength(), Opt.XLat.Table[1].GetLength()); - int Length=StrLength(Line); - EndPos=Min(EndPos,Length); - StartPos=Max(StartPos,0); - - if (StartPos > EndPos || StartPos >= Length) - return Line; + if (flags & XLAT_USEKEYBLAYOUTNAME) + { + fprintf(stderr, "Xlater: XLAT_USEKEYBLAYOUTNAME is not supported\n"); + } +} - if (!Opt.XLat.Table[0].GetLength() || !Opt.XLat.Table[1].GetLength()) - return Line; +wchar_t Xlater::Transcode(wchar_t chr) +{ + const wchar_t chr_old = chr; + // chr_old - пред символ + bool changed = false; + // цикл по просмотру Chr в таблицах + // <= _min_len_table так как длина настоящая а начальный индекс 1 + for (size_t i = 0; i <= _min_len_table; i++) { + // символ из латиницы? + if (chr == Opt.XLat.Table[1].At(i)) { + chr = Opt.XLat.Table[0].At(i); + changed = true; + _cur_lang = 1; // pred - english + _lang_count[1]++; + break; + + } else if (chr == Opt.XLat.Table[0].At(i)) { // символ из русской? + chr = Opt.XLat.Table[1].At(i); + changed = true; + _cur_lang = 0; // pred - russian + _lang_count[0]++; + break; + } + } - size_t MinLenTable=Min(Opt.XLat.Table[0].GetLength(),Opt.XLat.Table[1].GetLength()); - FARString strLayoutName; - int ProcessLayoutName=FALSE; + if (!changed) { // особые случаи... + _prev_lang = _cur_lang; - if ((Flags & XLAT_USEKEYBLAYOUTNAME) && Console.GetKeyboardLayoutName(strLayoutName)) - { - /* - Уточнение по поводу этого куска, чтобы потом не вспоминать ;-) - Было сделано в 1.7 build 1585 - - Делаем именно то, что заказывали! - - Т.е. если сейчас раскладка стоит английская, а мы шпарим по русски, то - если раньше 'б' и 'ю' (в результате малой статистики) конвертировались - как бог на душу положит... то теперь так, как должно быть. - - Для проверки нужно у HKEY_CURRENT_USER\Software\Far2\XLat\Flags выставить - второй бит (считаем от нуля; 0x4) и дописать две переменных: - - REGEDIT4 - - [HKEY_CURRENT_USER\Software\Far\XLat] - ; - ; ONLY >= NT4 - ; - ; набирали по русски в английской раскладке - ; `ё~Ё[х{Х]ъ}Ъ;Ж:Ж'э"Э,б<Б.ю>Ю/.?, - "00000409"="`ё~Ё[х{Х]ъ}Ъ;Ж:Ж'э\"Э,б<Б.ю>Ю/.?," - - ; набирали по английски в русской раскладке - ; ё`Ё~х[Х{ъ]Ъ}Ж;Ж:э'Э"б,Б<ю.Ю>./,? - "00000419"="ё`Ё~х[Х{ъ]Ъ}Ж;Ж:э'Э\"б,Б<ю.Ю>./,?" - - Здесь есть бага (хотя, багой и не назовешь...) - - конвертнули, - переключилась раскладка, - руками переключили раскладку, - снова конвертим и... - */ - Opt.XLat.Rules[2] = ConfigReader("XLat").GetString(strLayoutName.GetMB(), L""); - - if (!Opt.XLat.Rules[2].IsEmpty()) - ProcessLayoutName=TRUE; - } + if (_lang_count[0] > _lang_count[1]) + _cur_lang = 0; + else if (_lang_count[0] < _lang_count[1]) + _cur_lang = 1; + else + _cur_lang = 2; - // цикл по всей строке - for (int j=StartPos; j < EndPos; j++) - { - ChrOld=Chr=Line[j]; - // ChrOld - пред символ - IsChange=0; + if (_prev_lang != _cur_lang) + _cur_lang = _prev_lang; - // цикл по просмотру Chr в таблицах - // <=MinLenTable так как длина настоящая а начальный индекс 1 - for (size_t i=0; i <= MinLenTable; i++) - { - // символ из латиницы? - if (Chr == Opt.XLat.Table[1].At(i)) - { - Chr=Opt.XLat.Table[0].At(i); - IsChange=1; - CurLang=1; // pred - english - LangCount[1]++; - break; - } - // символ из русской? - else if (Chr == Opt.XLat.Table[0].At(i)) - { - Chr=Opt.XLat.Table[1].At(i); - CurLang=0; // pred - russian - LangCount[0]++; - IsChange=1; + for (size_t i = 0, ii = Opt.XLat.Rules[_cur_lang].GetLength(); i < ii; i+= 2) { + if (chr_old == Opt.XLat.Rules[_cur_lang].At(i)) { + chr = Opt.XLat.Rules[_cur_lang].At(i+1); break; } } - if (!IsChange) // особые случаи... +#if 0 + // Если в таблице не найдено и таблица была Unknown... + if (I >= Opt.XLat.Rules[CurLang][0] && CurLang == 2) { - if (ProcessLayoutName) + // ...смотрим сначала в первой таблице... + for (I=1; I < Opt.XLat.Rules[0][0]; I+=2) + if (ChrOld == (BYTE)Opt.XLat.Rules[0][I]) + break; + + for (J=1; J < Opt.XLat.Rules[1][0]; J+=2) + if (ChrOld == (BYTE)Opt.XLat.Rules[1][J]) + break; + + if (I >= Opt.XLat.Rules[0][0]) + CurLang=1; + + if (J >= Opt.XLat.Rules[1][0]) + CurLang=0; + + if ()//??? { - for (size_t i=0; i < Opt.XLat.Rules[2].GetLength(); i+=2) - { - if (Chr == Opt.XLat.Rules[2].At(i)) - { - Chr=Opt.XLat.Rules[2].At(i+1); - break; - } - } + Chr=(BYTE)Opt.XLat.Rules[CurLang][J+1]; } - else - { - PreLang=CurLang; - - if (LangCount[0] > LangCount[1]) - CurLang=0; - else if (LangCount[0] < LangCount[1]) - CurLang=1; - else - CurLang=2; - - if (PreLang != CurLang) - CurLang=PreLang; - - for (size_t i=0; i < Opt.XLat.Rules[CurLang].GetLength(); i+=2) - { - if (ChrOld == Opt.XLat.Rules[CurLang].At(i)) - { - Chr=Opt.XLat.Rules[CurLang].At(i+1); - break; - } - } - -#if 0 + } +#endif + } - // Если в таблице не найдено и таблица была Unknown... - if (I >= Opt.XLat.Rules[CurLang][0] && CurLang == 2) - { - // ...смотрим сначала в первой таблице... - for (I=1; I < Opt.XLat.Rules[0][0]; I+=2) - if (ChrOld == (BYTE)Opt.XLat.Rules[0][I]) - break; + return chr; +} - for (J=1; J < Opt.XLat.Rules[1][0]; J+=2) - if (ChrOld == (BYTE)Opt.XLat.Rules[1][J]) - break; +wchar_t* WINAPI Xlat(wchar_t *Line, + int StartPos, + int EndPos, + DWORD Flags) +{ + if (!Line || !*Line) + return nullptr; - if (I >= Opt.XLat.Rules[0][0]) - CurLang=1; + int Length = StrLength(Line); + EndPos = (EndPos == -1) ? Length : Min(EndPos, Length); + StartPos = Max(StartPos, 0); - if (J >= Opt.XLat.Rules[1][0]) - CurLang=0; + if (StartPos > EndPos || StartPos >= Length) + return Line; - if ()//??? - { - Chr=(BYTE)Opt.XLat.Rules[CurLang][J+1]; - } - } + if (!Opt.XLat.Table[0].GetLength() || !Opt.XLat.Table[1].GetLength()) + return Line; -#endif - } - } + Xlater xlt(Flags); - Line[j]=Chr; + for (int j=StartPos; j < EndPos; j++) { + Line[j] = xlt.Transcode(Line[j]); } // переключаем раскладку клавиатуры? - if (Flags & XLAT_SWITCHKEYBLAYOUT) - { + if (Flags & XLAT_SWITCHKEYBLAYOUT) { //todo + fprintf(stderr, "Xlater: XLAT_USEKEYBLAYOUTNAME is not supported\n"); } return Line; diff --git a/far2l/src/locale/xlat.hpp b/far2l/src/locale/xlat.hpp index 48f3b07f..23479803 100644 --- a/far2l/src/locale/xlat.hpp +++ b/far2l/src/locale/xlat.hpp @@ -35,4 +35,16 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <WinCompat.h> -wchar_t* WINAPI Xlat(wchar_t *Line,int StartPos,int EndPos,DWORD Flags); +class Xlater +{ + size_t _min_len_table; + int _prev_lang {2}, _cur_lang {2}; // unknown + int _lang_count[2] {0, 0}; + +public: + Xlater(DWORD flags); + wchar_t Transcode(wchar_t chr); +}; + +wchar_t* WINAPI Xlat(wchar_t *Line, int StartPos, int EndPos, DWORD Flags); + |