xref: /third_party/lzma/CPP/Common/TextConfig.cpp (revision 370b324c)
1370b324cSopenharmony_ci// Common/TextConfig.cpp
2370b324cSopenharmony_ci
3370b324cSopenharmony_ci#include "StdAfx.h"
4370b324cSopenharmony_ci
5370b324cSopenharmony_ci#include "TextConfig.h"
6370b324cSopenharmony_ci#include "UTFConvert.h"
7370b324cSopenharmony_ci
8370b324cSopenharmony_cistatic inline bool IsDelimitChar(char c)
9370b324cSopenharmony_ci{
10370b324cSopenharmony_ci  return (c == ' ' || c == 0x0A || c == 0x0D || c == '\0' || c == '\t');
11370b324cSopenharmony_ci}
12370b324cSopenharmony_ci
13370b324cSopenharmony_cistatic AString GetIDString(const char *s, unsigned &finishPos)
14370b324cSopenharmony_ci{
15370b324cSopenharmony_ci  AString result;
16370b324cSopenharmony_ci  for (finishPos = 0; ; finishPos++)
17370b324cSopenharmony_ci  {
18370b324cSopenharmony_ci    const char c = s[finishPos];
19370b324cSopenharmony_ci    if (IsDelimitChar(c) || c == '=')
20370b324cSopenharmony_ci      break;
21370b324cSopenharmony_ci    result += c;
22370b324cSopenharmony_ci  }
23370b324cSopenharmony_ci  return result;
24370b324cSopenharmony_ci}
25370b324cSopenharmony_ci
26370b324cSopenharmony_cistatic bool WaitNextLine(const AString &s, unsigned &pos)
27370b324cSopenharmony_ci{
28370b324cSopenharmony_ci  for (; pos < s.Len(); pos++)
29370b324cSopenharmony_ci    if (s[pos] == 0x0A)
30370b324cSopenharmony_ci      return true;
31370b324cSopenharmony_ci  return false;
32370b324cSopenharmony_ci}
33370b324cSopenharmony_ci
34370b324cSopenharmony_cistatic bool SkipSpaces(const AString &s, unsigned &pos)
35370b324cSopenharmony_ci{
36370b324cSopenharmony_ci  for (; pos < s.Len(); pos++)
37370b324cSopenharmony_ci  {
38370b324cSopenharmony_ci    const char c = s[pos];
39370b324cSopenharmony_ci    if (!IsDelimitChar(c))
40370b324cSopenharmony_ci    {
41370b324cSopenharmony_ci      if (c != ';')
42370b324cSopenharmony_ci        return true;
43370b324cSopenharmony_ci      if (!WaitNextLine(s, pos))
44370b324cSopenharmony_ci        return false;
45370b324cSopenharmony_ci    }
46370b324cSopenharmony_ci  }
47370b324cSopenharmony_ci  return false;
48370b324cSopenharmony_ci}
49370b324cSopenharmony_ci
50370b324cSopenharmony_cibool GetTextConfig(const AString &s, CObjectVector<CTextConfigPair> &pairs)
51370b324cSopenharmony_ci{
52370b324cSopenharmony_ci  pairs.Clear();
53370b324cSopenharmony_ci  unsigned pos = 0;
54370b324cSopenharmony_ci
55370b324cSopenharmony_ci  /////////////////////
56370b324cSopenharmony_ci  // read strings
57370b324cSopenharmony_ci
58370b324cSopenharmony_ci  for (;;)
59370b324cSopenharmony_ci  {
60370b324cSopenharmony_ci    if (!SkipSpaces(s, pos))
61370b324cSopenharmony_ci      break;
62370b324cSopenharmony_ci    CTextConfigPair pair;
63370b324cSopenharmony_ci    unsigned finishPos;
64370b324cSopenharmony_ci    const AString temp (GetIDString(((const char *)s) + pos, finishPos));
65370b324cSopenharmony_ci    if (!ConvertUTF8ToUnicode(temp, pair.ID))
66370b324cSopenharmony_ci      return false;
67370b324cSopenharmony_ci    if (finishPos == 0)
68370b324cSopenharmony_ci      return false;
69370b324cSopenharmony_ci    pos += finishPos;
70370b324cSopenharmony_ci    if (!SkipSpaces(s, pos))
71370b324cSopenharmony_ci      return false;
72370b324cSopenharmony_ci    if (s[pos] != '=')
73370b324cSopenharmony_ci      return false;
74370b324cSopenharmony_ci    pos++;
75370b324cSopenharmony_ci    if (!SkipSpaces(s, pos))
76370b324cSopenharmony_ci      return false;
77370b324cSopenharmony_ci    if (s[pos] != '\"')
78370b324cSopenharmony_ci      return false;
79370b324cSopenharmony_ci    pos++;
80370b324cSopenharmony_ci    AString message;
81370b324cSopenharmony_ci    for (;;)
82370b324cSopenharmony_ci    {
83370b324cSopenharmony_ci      if (pos >= s.Len())
84370b324cSopenharmony_ci        return false;
85370b324cSopenharmony_ci      char c = s[pos++];
86370b324cSopenharmony_ci      if (c == '\"')
87370b324cSopenharmony_ci        break;
88370b324cSopenharmony_ci      if (c == '\\')
89370b324cSopenharmony_ci      {
90370b324cSopenharmony_ci        c = s[pos++];
91370b324cSopenharmony_ci        switch (c)
92370b324cSopenharmony_ci        {
93370b324cSopenharmony_ci          case 'n': message += '\n'; break;
94370b324cSopenharmony_ci          case 't': message += '\t'; break;
95370b324cSopenharmony_ci          case '\\': message += '\\'; break;
96370b324cSopenharmony_ci          case '\"': message += '\"'; break;
97370b324cSopenharmony_ci          default: message += '\\'; message += c; break;
98370b324cSopenharmony_ci        }
99370b324cSopenharmony_ci      }
100370b324cSopenharmony_ci      else
101370b324cSopenharmony_ci        message += c;
102370b324cSopenharmony_ci    }
103370b324cSopenharmony_ci    if (!ConvertUTF8ToUnicode(message, pair.String))
104370b324cSopenharmony_ci      return false;
105370b324cSopenharmony_ci    pairs.Add(pair);
106370b324cSopenharmony_ci  }
107370b324cSopenharmony_ci  return true;
108370b324cSopenharmony_ci}
109370b324cSopenharmony_ci
110370b324cSopenharmony_ciint FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const char *id) throw()
111370b324cSopenharmony_ci{
112370b324cSopenharmony_ci  FOR_VECTOR (i, pairs)
113370b324cSopenharmony_ci    if (pairs[i].ID.IsEqualTo(id))
114370b324cSopenharmony_ci      return (int)i;
115370b324cSopenharmony_ci  return -1;
116370b324cSopenharmony_ci}
117370b324cSopenharmony_ci
118370b324cSopenharmony_ciUString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const char *id)
119370b324cSopenharmony_ci{
120370b324cSopenharmony_ci  const int index = FindTextConfigItem(pairs, id);
121370b324cSopenharmony_ci  if (index < 0)
122370b324cSopenharmony_ci    return UString();
123370b324cSopenharmony_ci  return pairs[index].String;
124370b324cSopenharmony_ci}
125