Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/Common/Lang.cpp')
-rwxr-xr-xCPP/Common/Lang.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/CPP/Common/Lang.cpp b/CPP/Common/Lang.cpp
new file mode 100755
index 00000000..f1861d6e
--- /dev/null
+++ b/CPP/Common/Lang.cpp
@@ -0,0 +1,142 @@
+// Common/Lang.cpp
+
+#include "StdAfx.h"
+
+#include "Common/Lang.h"
+#include "Common/TextConfig.h"
+
+#include "StdInStream.h"
+#include "UTFConvert.h"
+#include "Defs.h"
+
+/*
+static UInt32 HexStringToNumber(const char *string, int &finishPos)
+{
+ UInt32 number = 0;
+ for (finishPos = 0; finishPos < 8; finishPos++)
+ {
+ char c = string[finishPos];
+ int a;
+ if (c >= '0' && c <= '9')
+ a = c - '0';
+ else if (c >= 'A' && c <= 'F')
+ a = 10 + c - 'A';
+ else if (c >= 'a' && c <= 'f')
+ a = 10 + c - 'a';
+ else
+ return number;
+ number *= 0x10;
+ number += a;
+ }
+ return number;
+}
+*/
+static bool HexStringToNumber(const UString &string, UInt32 &aResultValue)
+{
+ aResultValue = 0;
+ if (string.IsEmpty())
+ return false;
+ for (int i = 0; i < string.Length(); i++)
+ {
+ wchar_t c = string[i];
+ int a;
+ if (c >= L'0' && c <= L'9')
+ a = c - L'0';
+ else if (c >= L'A' && c <= L'F')
+ a = 10 + c - L'A';
+ else if (c >= L'a' && c <= L'f')
+ a = 10 + c - L'a';
+ else
+ return false;
+ aResultValue *= 0x10;
+ aResultValue += a;
+ }
+ return true;
+}
+
+
+static bool WaitNextLine(const AString &string, int &pos)
+{
+ for (;pos < string.Length(); pos++)
+ if (string[pos] == 0x0A)
+ return true;
+ return false;
+}
+
+static int CompareLangItems(void *const *elem1, void *const *elem2, void *)
+{
+ const CLangPair &langPair1 = *(*((const CLangPair **)elem1));
+ const CLangPair &langPair2 = *(*((const CLangPair **)elem2));
+ return MyCompare(langPair1.Value, langPair2.Value);
+}
+
+bool CLang::Open(LPCTSTR fileName)
+{
+ _langPairs.Clear();
+ CStdInStream file;
+ if (!file.Open(fileName))
+ return false;
+ AString string;
+ file.ReadToString(string);
+ file.Close();
+ int pos = 0;
+ if (string.Length() >= 3)
+ {
+ if (Byte(string[0]) == 0xEF && Byte(string[1]) == 0xBB && Byte(string[2]) == 0xBF)
+ pos += 3;
+ }
+
+ /////////////////////
+ // read header
+
+ AString stringID = ";!@Lang@!UTF-8!";
+ if (string.Mid(pos, stringID.Length()) != stringID)
+ return false;
+ pos += stringID.Length();
+
+ if (!WaitNextLine(string, pos))
+ return false;
+
+ CObjectVector<CTextConfigPair> pairs;
+ if (!GetTextConfig(string.Mid(pos), pairs))
+ return false;
+
+ _langPairs.Reserve(_langPairs.Size());
+ for (int i = 0; i < pairs.Size(); i++)
+ {
+ CTextConfigPair textConfigPair = pairs[i];
+ CLangPair langPair;
+ if (!HexStringToNumber(textConfigPair.ID, langPair.Value))
+ return false;
+ langPair.String = textConfigPair.String;
+ _langPairs.Add(langPair);
+ }
+ _langPairs.Sort(CompareLangItems, NULL);
+ return true;
+}
+
+int CLang::FindItem(UInt32 value) const
+{
+ int left = 0, right = _langPairs.Size();
+ while (left != right)
+ {
+ UInt32 mid = (left + right) / 2;
+ UInt32 midValue = _langPairs[mid].Value;
+ if (value == midValue)
+ return mid;
+ if (value < midValue)
+ right = mid;
+ else
+ left = mid + 1;
+ }
+ return -1;
+}
+
+bool CLang::GetMessage(UInt32 value, UString &message) const
+{
+ int index = FindItem(value);
+ if (index < 0)
+ return false;
+ message = _langPairs[index].String;
+ return true;
+}