1*f6dc9357SAndroid Build Coastguard Worker // Common/TextConfig.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "TextConfig.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "UTFConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker
IsDelimitChar(char c)8*f6dc9357SAndroid Build Coastguard Worker static inline bool IsDelimitChar(char c)
9*f6dc9357SAndroid Build Coastguard Worker {
10*f6dc9357SAndroid Build Coastguard Worker return (c == ' ' || c == 0x0A || c == 0x0D || c == '\0' || c == '\t');
11*f6dc9357SAndroid Build Coastguard Worker }
12*f6dc9357SAndroid Build Coastguard Worker
GetIDString(const char * s,unsigned & finishPos)13*f6dc9357SAndroid Build Coastguard Worker static AString GetIDString(const char *s, unsigned &finishPos)
14*f6dc9357SAndroid Build Coastguard Worker {
15*f6dc9357SAndroid Build Coastguard Worker AString result;
16*f6dc9357SAndroid Build Coastguard Worker for (finishPos = 0; ; finishPos++)
17*f6dc9357SAndroid Build Coastguard Worker {
18*f6dc9357SAndroid Build Coastguard Worker const char c = s[finishPos];
19*f6dc9357SAndroid Build Coastguard Worker if (IsDelimitChar(c) || c == '=')
20*f6dc9357SAndroid Build Coastguard Worker break;
21*f6dc9357SAndroid Build Coastguard Worker result += c;
22*f6dc9357SAndroid Build Coastguard Worker }
23*f6dc9357SAndroid Build Coastguard Worker return result;
24*f6dc9357SAndroid Build Coastguard Worker }
25*f6dc9357SAndroid Build Coastguard Worker
WaitNextLine(const AString & s,unsigned & pos)26*f6dc9357SAndroid Build Coastguard Worker static bool WaitNextLine(const AString &s, unsigned &pos)
27*f6dc9357SAndroid Build Coastguard Worker {
28*f6dc9357SAndroid Build Coastguard Worker for (; pos < s.Len(); pos++)
29*f6dc9357SAndroid Build Coastguard Worker if (s[pos] == 0x0A)
30*f6dc9357SAndroid Build Coastguard Worker return true;
31*f6dc9357SAndroid Build Coastguard Worker return false;
32*f6dc9357SAndroid Build Coastguard Worker }
33*f6dc9357SAndroid Build Coastguard Worker
SkipSpaces(const AString & s,unsigned & pos)34*f6dc9357SAndroid Build Coastguard Worker static bool SkipSpaces(const AString &s, unsigned &pos)
35*f6dc9357SAndroid Build Coastguard Worker {
36*f6dc9357SAndroid Build Coastguard Worker for (; pos < s.Len(); pos++)
37*f6dc9357SAndroid Build Coastguard Worker {
38*f6dc9357SAndroid Build Coastguard Worker const char c = s[pos];
39*f6dc9357SAndroid Build Coastguard Worker if (!IsDelimitChar(c))
40*f6dc9357SAndroid Build Coastguard Worker {
41*f6dc9357SAndroid Build Coastguard Worker if (c != ';')
42*f6dc9357SAndroid Build Coastguard Worker return true;
43*f6dc9357SAndroid Build Coastguard Worker if (!WaitNextLine(s, pos))
44*f6dc9357SAndroid Build Coastguard Worker return false;
45*f6dc9357SAndroid Build Coastguard Worker }
46*f6dc9357SAndroid Build Coastguard Worker }
47*f6dc9357SAndroid Build Coastguard Worker return false;
48*f6dc9357SAndroid Build Coastguard Worker }
49*f6dc9357SAndroid Build Coastguard Worker
GetTextConfig(const AString & s,CObjectVector<CTextConfigPair> & pairs)50*f6dc9357SAndroid Build Coastguard Worker bool GetTextConfig(const AString &s, CObjectVector<CTextConfigPair> &pairs)
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker pairs.Clear();
53*f6dc9357SAndroid Build Coastguard Worker unsigned pos = 0;
54*f6dc9357SAndroid Build Coastguard Worker
55*f6dc9357SAndroid Build Coastguard Worker /////////////////////
56*f6dc9357SAndroid Build Coastguard Worker // read strings
57*f6dc9357SAndroid Build Coastguard Worker
58*f6dc9357SAndroid Build Coastguard Worker for (;;)
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker if (!SkipSpaces(s, pos))
61*f6dc9357SAndroid Build Coastguard Worker break;
62*f6dc9357SAndroid Build Coastguard Worker CTextConfigPair pair;
63*f6dc9357SAndroid Build Coastguard Worker unsigned finishPos;
64*f6dc9357SAndroid Build Coastguard Worker const AString temp (GetIDString(((const char *)s) + pos, finishPos));
65*f6dc9357SAndroid Build Coastguard Worker if (!ConvertUTF8ToUnicode(temp, pair.ID))
66*f6dc9357SAndroid Build Coastguard Worker return false;
67*f6dc9357SAndroid Build Coastguard Worker if (finishPos == 0)
68*f6dc9357SAndroid Build Coastguard Worker return false;
69*f6dc9357SAndroid Build Coastguard Worker pos += finishPos;
70*f6dc9357SAndroid Build Coastguard Worker if (!SkipSpaces(s, pos))
71*f6dc9357SAndroid Build Coastguard Worker return false;
72*f6dc9357SAndroid Build Coastguard Worker if (s[pos] != '=')
73*f6dc9357SAndroid Build Coastguard Worker return false;
74*f6dc9357SAndroid Build Coastguard Worker pos++;
75*f6dc9357SAndroid Build Coastguard Worker if (!SkipSpaces(s, pos))
76*f6dc9357SAndroid Build Coastguard Worker return false;
77*f6dc9357SAndroid Build Coastguard Worker if (s[pos] != '\"')
78*f6dc9357SAndroid Build Coastguard Worker return false;
79*f6dc9357SAndroid Build Coastguard Worker pos++;
80*f6dc9357SAndroid Build Coastguard Worker AString message;
81*f6dc9357SAndroid Build Coastguard Worker for (;;)
82*f6dc9357SAndroid Build Coastguard Worker {
83*f6dc9357SAndroid Build Coastguard Worker if (pos >= s.Len())
84*f6dc9357SAndroid Build Coastguard Worker return false;
85*f6dc9357SAndroid Build Coastguard Worker char c = s[pos++];
86*f6dc9357SAndroid Build Coastguard Worker if (c == '\"')
87*f6dc9357SAndroid Build Coastguard Worker break;
88*f6dc9357SAndroid Build Coastguard Worker if (c == '\\')
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker c = s[pos++];
91*f6dc9357SAndroid Build Coastguard Worker switch (c)
92*f6dc9357SAndroid Build Coastguard Worker {
93*f6dc9357SAndroid Build Coastguard Worker case 'n': c = '\n'; break;
94*f6dc9357SAndroid Build Coastguard Worker case 't': c = '\t'; break;
95*f6dc9357SAndroid Build Coastguard Worker case '\\': break;
96*f6dc9357SAndroid Build Coastguard Worker case '\"': break;
97*f6dc9357SAndroid Build Coastguard Worker default: message += '\\'; break;
98*f6dc9357SAndroid Build Coastguard Worker }
99*f6dc9357SAndroid Build Coastguard Worker }
100*f6dc9357SAndroid Build Coastguard Worker message += c;
101*f6dc9357SAndroid Build Coastguard Worker }
102*f6dc9357SAndroid Build Coastguard Worker if (!ConvertUTF8ToUnicode(message, pair.String))
103*f6dc9357SAndroid Build Coastguard Worker return false;
104*f6dc9357SAndroid Build Coastguard Worker pairs.Add(pair);
105*f6dc9357SAndroid Build Coastguard Worker }
106*f6dc9357SAndroid Build Coastguard Worker return true;
107*f6dc9357SAndroid Build Coastguard Worker }
108*f6dc9357SAndroid Build Coastguard Worker
FindTextConfigItem(const CObjectVector<CTextConfigPair> & pairs,const char * id)109*f6dc9357SAndroid Build Coastguard Worker int FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const char *id) throw()
110*f6dc9357SAndroid Build Coastguard Worker {
111*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, pairs)
112*f6dc9357SAndroid Build Coastguard Worker if (pairs[i].ID.IsEqualTo(id))
113*f6dc9357SAndroid Build Coastguard Worker return (int)i;
114*f6dc9357SAndroid Build Coastguard Worker return -1;
115*f6dc9357SAndroid Build Coastguard Worker }
116*f6dc9357SAndroid Build Coastguard Worker
GetTextConfigValue(const CObjectVector<CTextConfigPair> & pairs,const char * id)117*f6dc9357SAndroid Build Coastguard Worker UString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const char *id)
118*f6dc9357SAndroid Build Coastguard Worker {
119*f6dc9357SAndroid Build Coastguard Worker const int index = FindTextConfigItem(pairs, id);
120*f6dc9357SAndroid Build Coastguard Worker if (index < 0)
121*f6dc9357SAndroid Build Coastguard Worker return UString();
122*f6dc9357SAndroid Build Coastguard Worker return pairs[index].String;
123*f6dc9357SAndroid Build Coastguard Worker }
124