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