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