diff options
author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2021-12-27 00:00:00 +0000 |
---|---|---|
committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2022-03-18 15:35:13 +0500 |
commit | f19f813537c7aea1c20749c914e756b54a9c3cf5 (patch) | |
tree | 816ba62ca7c0fa19f2eb46d9e9d6f7dd7c3a744d /CPP/Common/TextConfig.cpp | |
parent | 98e06a519b63b81986abe76d28887f6984a7732b (diff) | |
download | 7zip-21.07.tar.gz 7zip-21.07.tar.bz2 7zip-21.07.zip |
'21.07'21.07
Diffstat (limited to 'CPP/Common/TextConfig.cpp')
-rw-r--r-- | CPP/Common/TextConfig.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/CPP/Common/TextConfig.cpp b/CPP/Common/TextConfig.cpp new file mode 100644 index 0000000..1428aab --- /dev/null +++ b/CPP/Common/TextConfig.cpp | |||
@@ -0,0 +1,124 @@ | |||
1 | // Common/TextConfig.cpp | ||
2 | |||
3 | #include "StdAfx.h" | ||
4 | |||
5 | #include "TextConfig.h" | ||
6 | #include "UTFConvert.h" | ||
7 | |||
8 | static inline bool IsDelimitChar(char c) | ||
9 | { | ||
10 | return (c == ' ' || c == 0x0A || c == 0x0D || c == '\0' || c == '\t'); | ||
11 | } | ||
12 | |||
13 | static AString GetIDString(const char *s, unsigned &finishPos) | ||
14 | { | ||
15 | AString result; | ||
16 | for (finishPos = 0; ; finishPos++) | ||
17 | { | ||
18 | char c = s[finishPos]; | ||
19 | if (IsDelimitChar(c) || c == '=') | ||
20 | break; | ||
21 | result += c; | ||
22 | } | ||
23 | return result; | ||
24 | } | ||
25 | |||
26 | static bool WaitNextLine(const AString &s, unsigned &pos) | ||
27 | { | ||
28 | for (; pos < s.Len(); pos++) | ||
29 | if (s[pos] == 0x0A) | ||
30 | return true; | ||
31 | return false; | ||
32 | } | ||
33 | |||
34 | static bool SkipSpaces(const AString &s, unsigned &pos) | ||
35 | { | ||
36 | for (; pos < s.Len(); pos++) | ||
37 | { | ||
38 | char c = s[pos]; | ||
39 | if (!IsDelimitChar(c)) | ||
40 | { | ||
41 | if (c != ';') | ||
42 | return true; | ||
43 | if (!WaitNextLine(s, pos)) | ||
44 | return false; | ||
45 | } | ||
46 | } | ||
47 | return false; | ||
48 | } | ||
49 | |||
50 | bool GetTextConfig(const AString &s, CObjectVector<CTextConfigPair> &pairs) | ||
51 | { | ||
52 | pairs.Clear(); | ||
53 | unsigned pos = 0; | ||
54 | |||
55 | ///////////////////// | ||
56 | // read strings | ||
57 | |||
58 | for (;;) | ||
59 | { | ||
60 | if (!SkipSpaces(s, pos)) | ||
61 | break; | ||
62 | CTextConfigPair pair; | ||
63 | unsigned finishPos; | ||
64 | const AString temp (GetIDString(((const char *)s) + pos, finishPos)); | ||
65 | if (!ConvertUTF8ToUnicode(temp, pair.ID)) | ||
66 | return false; | ||
67 | if (finishPos == 0) | ||
68 | return false; | ||
69 | pos += finishPos; | ||
70 | if (!SkipSpaces(s, pos)) | ||
71 | return false; | ||
72 | if (s[pos] != '=') | ||
73 | return false; | ||
74 | pos++; | ||
75 | if (!SkipSpaces(s, pos)) | ||
76 | return false; | ||
77 | if (s[pos] != '\"') | ||
78 | return false; | ||
79 | pos++; | ||
80 | AString message; | ||
81 | for (;;) | ||
82 | { | ||
83 | if (pos >= s.Len()) | ||
84 | return false; | ||
85 | char c = s[pos++]; | ||
86 | if (c == '\"') | ||
87 | break; | ||
88 | if (c == '\\') | ||
89 | { | ||
90 | c = s[pos++]; | ||
91 | switch (c) | ||
92 | { | ||
93 | case 'n': message += '\n'; break; | ||
94 | case 't': message += '\t'; break; | ||
95 | case '\\': message += '\\'; break; | ||
96 | case '\"': message += '\"'; break; | ||
97 | default: message += '\\'; message += c; break; | ||
98 | } | ||
99 | } | ||
100 | else | ||
101 | message += c; | ||
102 | } | ||
103 | if (!ConvertUTF8ToUnicode(message, pair.String)) | ||
104 | return false; | ||
105 | pairs.Add(pair); | ||
106 | } | ||
107 | return true; | ||
108 | } | ||
109 | |||
110 | int FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const char *id) throw() | ||
111 | { | ||
112 | FOR_VECTOR (i, pairs) | ||
113 | if (pairs[i].ID.IsEqualTo(id)) | ||
114 | return i; | ||
115 | return -1; | ||
116 | } | ||
117 | |||
118 | UString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const char *id) | ||
119 | { | ||
120 | int index = FindTextConfigItem(pairs, id); | ||
121 | if (index < 0) | ||
122 | return UString(); | ||
123 | return pairs[index].String; | ||
124 | } | ||