xref: /aosp_15_r20/external/lzma/CPP/Common/TextConfig.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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