1*f6dc9357SAndroid Build Coastguard Worker // MyXml.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 "MyXml.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "StringToInt.h"
7*f6dc9357SAndroid Build Coastguard Worker
IsValidChar(char c)8*f6dc9357SAndroid Build Coastguard Worker static bool IsValidChar(char c)
9*f6dc9357SAndroid Build Coastguard Worker {
10*f6dc9357SAndroid Build Coastguard Worker return
11*f6dc9357SAndroid Build Coastguard Worker (c >= 'a' && c <= 'z') ||
12*f6dc9357SAndroid Build Coastguard Worker (c >= 'A' && c <= 'Z') ||
13*f6dc9357SAndroid Build Coastguard Worker (c >= '0' && c <= '9') ||
14*f6dc9357SAndroid Build Coastguard Worker c == '-';
15*f6dc9357SAndroid Build Coastguard Worker }
16*f6dc9357SAndroid Build Coastguard Worker
IsSpaceChar(char c)17*f6dc9357SAndroid Build Coastguard Worker static bool IsSpaceChar(char c)
18*f6dc9357SAndroid Build Coastguard Worker {
19*f6dc9357SAndroid Build Coastguard Worker return (c == ' ' || c == '\t' || c == 0x0D || c == 0x0A);
20*f6dc9357SAndroid Build Coastguard Worker }
21*f6dc9357SAndroid Build Coastguard Worker
22*f6dc9357SAndroid Build Coastguard Worker #define SKIP_SPACES(s) while (IsSpaceChar(*s)) s++;
23*f6dc9357SAndroid Build Coastguard Worker
FindProp(const char * propName) const24*f6dc9357SAndroid Build Coastguard Worker int CXmlItem::FindProp(const char *propName) const throw()
25*f6dc9357SAndroid Build Coastguard Worker {
26*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Props)
27*f6dc9357SAndroid Build Coastguard Worker if (Props[i].Name == propName)
28*f6dc9357SAndroid Build Coastguard Worker return (int)i;
29*f6dc9357SAndroid Build Coastguard Worker return -1;
30*f6dc9357SAndroid Build Coastguard Worker }
31*f6dc9357SAndroid Build Coastguard Worker
GetPropVal(const char * propName) const32*f6dc9357SAndroid Build Coastguard Worker AString CXmlItem::GetPropVal(const char *propName) const
33*f6dc9357SAndroid Build Coastguard Worker {
34*f6dc9357SAndroid Build Coastguard Worker const int index = FindProp(propName);
35*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
36*f6dc9357SAndroid Build Coastguard Worker return Props[(unsigned)index].Value;
37*f6dc9357SAndroid Build Coastguard Worker return AString();
38*f6dc9357SAndroid Build Coastguard Worker }
39*f6dc9357SAndroid Build Coastguard Worker
IsTagged(const char * tag) const40*f6dc9357SAndroid Build Coastguard Worker bool CXmlItem::IsTagged(const char *tag) const throw()
41*f6dc9357SAndroid Build Coastguard Worker {
42*f6dc9357SAndroid Build Coastguard Worker return (IsTag && Name == tag);
43*f6dc9357SAndroid Build Coastguard Worker }
44*f6dc9357SAndroid Build Coastguard Worker
FindSubTag(const char * tag) const45*f6dc9357SAndroid Build Coastguard Worker int CXmlItem::FindSubTag(const char *tag) const throw()
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, SubItems)
48*f6dc9357SAndroid Build Coastguard Worker if (SubItems[i].IsTagged(tag))
49*f6dc9357SAndroid Build Coastguard Worker return (int)i;
50*f6dc9357SAndroid Build Coastguard Worker return -1;
51*f6dc9357SAndroid Build Coastguard Worker }
52*f6dc9357SAndroid Build Coastguard Worker
FindSubTag_GetPtr(const char * tag) const53*f6dc9357SAndroid Build Coastguard Worker const CXmlItem *CXmlItem::FindSubTag_GetPtr(const char *tag) const throw()
54*f6dc9357SAndroid Build Coastguard Worker {
55*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, SubItems)
56*f6dc9357SAndroid Build Coastguard Worker {
57*f6dc9357SAndroid Build Coastguard Worker const CXmlItem *p = &SubItems[i];
58*f6dc9357SAndroid Build Coastguard Worker if (p->IsTagged(tag))
59*f6dc9357SAndroid Build Coastguard Worker return p;
60*f6dc9357SAndroid Build Coastguard Worker }
61*f6dc9357SAndroid Build Coastguard Worker return NULL;
62*f6dc9357SAndroid Build Coastguard Worker }
63*f6dc9357SAndroid Build Coastguard Worker
GetSubString() const64*f6dc9357SAndroid Build Coastguard Worker AString CXmlItem::GetSubString() const
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker if (SubItems.Size() == 1)
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker const CXmlItem &item = SubItems[0];
69*f6dc9357SAndroid Build Coastguard Worker if (!item.IsTag)
70*f6dc9357SAndroid Build Coastguard Worker return item.Name;
71*f6dc9357SAndroid Build Coastguard Worker }
72*f6dc9357SAndroid Build Coastguard Worker return AString();
73*f6dc9357SAndroid Build Coastguard Worker }
74*f6dc9357SAndroid Build Coastguard Worker
GetSubStringPtr() const75*f6dc9357SAndroid Build Coastguard Worker const AString * CXmlItem::GetSubStringPtr() const throw()
76*f6dc9357SAndroid Build Coastguard Worker {
77*f6dc9357SAndroid Build Coastguard Worker if (SubItems.Size() == 1)
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker const CXmlItem &item = SubItems[0];
80*f6dc9357SAndroid Build Coastguard Worker if (!item.IsTag)
81*f6dc9357SAndroid Build Coastguard Worker return &item.Name;
82*f6dc9357SAndroid Build Coastguard Worker }
83*f6dc9357SAndroid Build Coastguard Worker return NULL;
84*f6dc9357SAndroid Build Coastguard Worker }
85*f6dc9357SAndroid Build Coastguard Worker
GetSubStringForTag(const char * tag) const86*f6dc9357SAndroid Build Coastguard Worker AString CXmlItem::GetSubStringForTag(const char *tag) const
87*f6dc9357SAndroid Build Coastguard Worker {
88*f6dc9357SAndroid Build Coastguard Worker const CXmlItem *item = FindSubTag_GetPtr(tag);
89*f6dc9357SAndroid Build Coastguard Worker if (item)
90*f6dc9357SAndroid Build Coastguard Worker return item->GetSubString();
91*f6dc9357SAndroid Build Coastguard Worker return AString();
92*f6dc9357SAndroid Build Coastguard Worker }
93*f6dc9357SAndroid Build Coastguard Worker
ParseItem(const char * s,int numAllowedLevels)94*f6dc9357SAndroid Build Coastguard Worker const char * CXmlItem::ParseItem(const char *s, int numAllowedLevels)
95*f6dc9357SAndroid Build Coastguard Worker {
96*f6dc9357SAndroid Build Coastguard Worker SKIP_SPACES(s)
97*f6dc9357SAndroid Build Coastguard Worker
98*f6dc9357SAndroid Build Coastguard Worker const char *beg = s;
99*f6dc9357SAndroid Build Coastguard Worker for (;;)
100*f6dc9357SAndroid Build Coastguard Worker {
101*f6dc9357SAndroid Build Coastguard Worker char c;
102*f6dc9357SAndroid Build Coastguard Worker c = *s; if (c == 0 || c == '<') break; s++;
103*f6dc9357SAndroid Build Coastguard Worker c = *s; if (c == 0 || c == '<') break; s++;
104*f6dc9357SAndroid Build Coastguard Worker }
105*f6dc9357SAndroid Build Coastguard Worker if (*s == 0)
106*f6dc9357SAndroid Build Coastguard Worker return NULL;
107*f6dc9357SAndroid Build Coastguard Worker {
108*f6dc9357SAndroid Build Coastguard Worker const size_t num = (size_t)(s - beg);
109*f6dc9357SAndroid Build Coastguard Worker if (num)
110*f6dc9357SAndroid Build Coastguard Worker {
111*f6dc9357SAndroid Build Coastguard Worker IsTag = false;
112*f6dc9357SAndroid Build Coastguard Worker Name.SetFrom_Chars_SizeT(beg, num);
113*f6dc9357SAndroid Build Coastguard Worker return s;
114*f6dc9357SAndroid Build Coastguard Worker }
115*f6dc9357SAndroid Build Coastguard Worker }
116*f6dc9357SAndroid Build Coastguard Worker
117*f6dc9357SAndroid Build Coastguard Worker IsTag = true;
118*f6dc9357SAndroid Build Coastguard Worker
119*f6dc9357SAndroid Build Coastguard Worker s++;
120*f6dc9357SAndroid Build Coastguard Worker SKIP_SPACES(s)
121*f6dc9357SAndroid Build Coastguard Worker
122*f6dc9357SAndroid Build Coastguard Worker beg = s;
123*f6dc9357SAndroid Build Coastguard Worker for (;; s++)
124*f6dc9357SAndroid Build Coastguard Worker if (!IsValidChar(*s))
125*f6dc9357SAndroid Build Coastguard Worker break;
126*f6dc9357SAndroid Build Coastguard Worker if (s == beg || *s == 0)
127*f6dc9357SAndroid Build Coastguard Worker return NULL;
128*f6dc9357SAndroid Build Coastguard Worker Name.SetFrom_Chars_SizeT(beg, (size_t)(s - beg));
129*f6dc9357SAndroid Build Coastguard Worker
130*f6dc9357SAndroid Build Coastguard Worker for (;;)
131*f6dc9357SAndroid Build Coastguard Worker {
132*f6dc9357SAndroid Build Coastguard Worker beg = s;
133*f6dc9357SAndroid Build Coastguard Worker SKIP_SPACES(s)
134*f6dc9357SAndroid Build Coastguard Worker if (*s == '/')
135*f6dc9357SAndroid Build Coastguard Worker {
136*f6dc9357SAndroid Build Coastguard Worker s++;
137*f6dc9357SAndroid Build Coastguard Worker // SKIP_SPACES(s)
138*f6dc9357SAndroid Build Coastguard Worker if (*s != '>')
139*f6dc9357SAndroid Build Coastguard Worker return NULL;
140*f6dc9357SAndroid Build Coastguard Worker return s + 1;
141*f6dc9357SAndroid Build Coastguard Worker }
142*f6dc9357SAndroid Build Coastguard Worker if (*s == '>')
143*f6dc9357SAndroid Build Coastguard Worker {
144*f6dc9357SAndroid Build Coastguard Worker s++;
145*f6dc9357SAndroid Build Coastguard Worker if (numAllowedLevels == 0)
146*f6dc9357SAndroid Build Coastguard Worker return NULL;
147*f6dc9357SAndroid Build Coastguard Worker SubItems.Clear();
148*f6dc9357SAndroid Build Coastguard Worker for (;;)
149*f6dc9357SAndroid Build Coastguard Worker {
150*f6dc9357SAndroid Build Coastguard Worker SKIP_SPACES(s)
151*f6dc9357SAndroid Build Coastguard Worker if (s[0] == '<' && s[1] == '/')
152*f6dc9357SAndroid Build Coastguard Worker break;
153*f6dc9357SAndroid Build Coastguard Worker CXmlItem &item = SubItems.AddNew();
154*f6dc9357SAndroid Build Coastguard Worker s = item.ParseItem(s, numAllowedLevels - 1);
155*f6dc9357SAndroid Build Coastguard Worker if (!s)
156*f6dc9357SAndroid Build Coastguard Worker return NULL;
157*f6dc9357SAndroid Build Coastguard Worker }
158*f6dc9357SAndroid Build Coastguard Worker
159*f6dc9357SAndroid Build Coastguard Worker s += 2;
160*f6dc9357SAndroid Build Coastguard Worker const unsigned len = Name.Len();
161*f6dc9357SAndroid Build Coastguard Worker const char *name = Name.Ptr();
162*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++)
163*f6dc9357SAndroid Build Coastguard Worker if (*s++ != *name++)
164*f6dc9357SAndroid Build Coastguard Worker return NULL;
165*f6dc9357SAndroid Build Coastguard Worker // s += len;
166*f6dc9357SAndroid Build Coastguard Worker if (s[0] != '>')
167*f6dc9357SAndroid Build Coastguard Worker return NULL;
168*f6dc9357SAndroid Build Coastguard Worker return s + 1;
169*f6dc9357SAndroid Build Coastguard Worker }
170*f6dc9357SAndroid Build Coastguard Worker if (beg == s)
171*f6dc9357SAndroid Build Coastguard Worker return NULL;
172*f6dc9357SAndroid Build Coastguard Worker
173*f6dc9357SAndroid Build Coastguard Worker // ReadProperty
174*f6dc9357SAndroid Build Coastguard Worker CXmlProp &prop = Props.AddNew();
175*f6dc9357SAndroid Build Coastguard Worker
176*f6dc9357SAndroid Build Coastguard Worker beg = s;
177*f6dc9357SAndroid Build Coastguard Worker for (;; s++)
178*f6dc9357SAndroid Build Coastguard Worker {
179*f6dc9357SAndroid Build Coastguard Worker char c = *s;
180*f6dc9357SAndroid Build Coastguard Worker if (!IsValidChar(c))
181*f6dc9357SAndroid Build Coastguard Worker break;
182*f6dc9357SAndroid Build Coastguard Worker }
183*f6dc9357SAndroid Build Coastguard Worker if (s == beg)
184*f6dc9357SAndroid Build Coastguard Worker return NULL;
185*f6dc9357SAndroid Build Coastguard Worker prop.Name.SetFrom_Chars_SizeT(beg, (size_t)(s - beg));
186*f6dc9357SAndroid Build Coastguard Worker
187*f6dc9357SAndroid Build Coastguard Worker SKIP_SPACES(s)
188*f6dc9357SAndroid Build Coastguard Worker if (*s != '=')
189*f6dc9357SAndroid Build Coastguard Worker return NULL;
190*f6dc9357SAndroid Build Coastguard Worker s++;
191*f6dc9357SAndroid Build Coastguard Worker SKIP_SPACES(s)
192*f6dc9357SAndroid Build Coastguard Worker if (*s != '\"')
193*f6dc9357SAndroid Build Coastguard Worker return NULL;
194*f6dc9357SAndroid Build Coastguard Worker s++;
195*f6dc9357SAndroid Build Coastguard Worker
196*f6dc9357SAndroid Build Coastguard Worker beg = s;
197*f6dc9357SAndroid Build Coastguard Worker for (;;)
198*f6dc9357SAndroid Build Coastguard Worker {
199*f6dc9357SAndroid Build Coastguard Worker char c = *s;
200*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
201*f6dc9357SAndroid Build Coastguard Worker return NULL;
202*f6dc9357SAndroid Build Coastguard Worker if (c == '\"')
203*f6dc9357SAndroid Build Coastguard Worker break;
204*f6dc9357SAndroid Build Coastguard Worker s++;
205*f6dc9357SAndroid Build Coastguard Worker }
206*f6dc9357SAndroid Build Coastguard Worker prop.Value.SetFrom_Chars_SizeT(beg, (size_t)(s - beg));
207*f6dc9357SAndroid Build Coastguard Worker s++;
208*f6dc9357SAndroid Build Coastguard Worker }
209*f6dc9357SAndroid Build Coastguard Worker }
210*f6dc9357SAndroid Build Coastguard Worker
SkipHeader(const char * s,const char * startString,const char * endString)211*f6dc9357SAndroid Build Coastguard Worker static const char * SkipHeader(const char *s, const char *startString, const char *endString)
212*f6dc9357SAndroid Build Coastguard Worker {
213*f6dc9357SAndroid Build Coastguard Worker SKIP_SPACES(s)
214*f6dc9357SAndroid Build Coastguard Worker if (IsString1PrefixedByString2(s, startString))
215*f6dc9357SAndroid Build Coastguard Worker {
216*f6dc9357SAndroid Build Coastguard Worker s = strstr(s, endString);
217*f6dc9357SAndroid Build Coastguard Worker if (!s)
218*f6dc9357SAndroid Build Coastguard Worker return NULL;
219*f6dc9357SAndroid Build Coastguard Worker s += strlen(endString);
220*f6dc9357SAndroid Build Coastguard Worker }
221*f6dc9357SAndroid Build Coastguard Worker return s;
222*f6dc9357SAndroid Build Coastguard Worker }
223*f6dc9357SAndroid Build Coastguard Worker
AppendTo(AString & s) const224*f6dc9357SAndroid Build Coastguard Worker void CXmlItem::AppendTo(AString &s) const
225*f6dc9357SAndroid Build Coastguard Worker {
226*f6dc9357SAndroid Build Coastguard Worker if (IsTag)
227*f6dc9357SAndroid Build Coastguard Worker s += '<';
228*f6dc9357SAndroid Build Coastguard Worker s += Name;
229*f6dc9357SAndroid Build Coastguard Worker if (IsTag)
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, Props)
232*f6dc9357SAndroid Build Coastguard Worker {
233*f6dc9357SAndroid Build Coastguard Worker const CXmlProp &prop = Props[i];
234*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
235*f6dc9357SAndroid Build Coastguard Worker s += prop.Name;
236*f6dc9357SAndroid Build Coastguard Worker s += '=';
237*f6dc9357SAndroid Build Coastguard Worker s += '\"';
238*f6dc9357SAndroid Build Coastguard Worker s += prop.Value;
239*f6dc9357SAndroid Build Coastguard Worker s += '\"';
240*f6dc9357SAndroid Build Coastguard Worker }
241*f6dc9357SAndroid Build Coastguard Worker s += '>';
242*f6dc9357SAndroid Build Coastguard Worker }
243*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, SubItems)
244*f6dc9357SAndroid Build Coastguard Worker {
245*f6dc9357SAndroid Build Coastguard Worker const CXmlItem &item = SubItems[i];
246*f6dc9357SAndroid Build Coastguard Worker if (i != 0 && !SubItems[i - 1].IsTag)
247*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
248*f6dc9357SAndroid Build Coastguard Worker item.AppendTo(s);
249*f6dc9357SAndroid Build Coastguard Worker }
250*f6dc9357SAndroid Build Coastguard Worker if (IsTag)
251*f6dc9357SAndroid Build Coastguard Worker {
252*f6dc9357SAndroid Build Coastguard Worker s += '<';
253*f6dc9357SAndroid Build Coastguard Worker s += '/';
254*f6dc9357SAndroid Build Coastguard Worker s += Name;
255*f6dc9357SAndroid Build Coastguard Worker s += '>';
256*f6dc9357SAndroid Build Coastguard Worker }
257*f6dc9357SAndroid Build Coastguard Worker }
258*f6dc9357SAndroid Build Coastguard Worker
Parse(const char * s)259*f6dc9357SAndroid Build Coastguard Worker bool CXml::Parse(const char *s)
260*f6dc9357SAndroid Build Coastguard Worker {
261*f6dc9357SAndroid Build Coastguard Worker s = SkipHeader(s, "<?xml", "?>"); if (!s) return false;
262*f6dc9357SAndroid Build Coastguard Worker s = SkipHeader(s, "<!DOCTYPE", ">"); if (!s) return false;
263*f6dc9357SAndroid Build Coastguard Worker
264*f6dc9357SAndroid Build Coastguard Worker s = Root.ParseItem(s, 1000);
265*f6dc9357SAndroid Build Coastguard Worker if (!s || !Root.IsTag)
266*f6dc9357SAndroid Build Coastguard Worker return false;
267*f6dc9357SAndroid Build Coastguard Worker SKIP_SPACES(s)
268*f6dc9357SAndroid Build Coastguard Worker return *s == 0;
269*f6dc9357SAndroid Build Coastguard Worker }
270*f6dc9357SAndroid Build Coastguard Worker
271*f6dc9357SAndroid Build Coastguard Worker /*
272*f6dc9357SAndroid Build Coastguard Worker void CXml::AppendTo(AString &s) const
273*f6dc9357SAndroid Build Coastguard Worker {
274*f6dc9357SAndroid Build Coastguard Worker Root.AppendTo(s);
275*f6dc9357SAndroid Build Coastguard Worker }
276*f6dc9357SAndroid Build Coastguard Worker */
277*f6dc9357SAndroid Build Coastguard Worker
278*f6dc9357SAndroid Build Coastguard Worker
z7_xml_DecodeString(AString & temp)279*f6dc9357SAndroid Build Coastguard Worker void z7_xml_DecodeString(AString &temp)
280*f6dc9357SAndroid Build Coastguard Worker {
281*f6dc9357SAndroid Build Coastguard Worker char * const beg = temp.GetBuf();
282*f6dc9357SAndroid Build Coastguard Worker char *dest = beg;
283*f6dc9357SAndroid Build Coastguard Worker const char *p = beg;
284*f6dc9357SAndroid Build Coastguard Worker for (;;)
285*f6dc9357SAndroid Build Coastguard Worker {
286*f6dc9357SAndroid Build Coastguard Worker char c = *p++;
287*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
288*f6dc9357SAndroid Build Coastguard Worker break;
289*f6dc9357SAndroid Build Coastguard Worker if (c == '&')
290*f6dc9357SAndroid Build Coastguard Worker {
291*f6dc9357SAndroid Build Coastguard Worker if (p[0] == '#')
292*f6dc9357SAndroid Build Coastguard Worker {
293*f6dc9357SAndroid Build Coastguard Worker const char *end;
294*f6dc9357SAndroid Build Coastguard Worker const UInt32 number = ConvertStringToUInt32(p + 1, &end);
295*f6dc9357SAndroid Build Coastguard Worker if (*end == ';' && number != 0 && number <= 127)
296*f6dc9357SAndroid Build Coastguard Worker {
297*f6dc9357SAndroid Build Coastguard Worker p = end + 1;
298*f6dc9357SAndroid Build Coastguard Worker c = (char)number;
299*f6dc9357SAndroid Build Coastguard Worker }
300*f6dc9357SAndroid Build Coastguard Worker }
301*f6dc9357SAndroid Build Coastguard Worker else if (
302*f6dc9357SAndroid Build Coastguard Worker p[0] == 'a' &&
303*f6dc9357SAndroid Build Coastguard Worker p[1] == 'm' &&
304*f6dc9357SAndroid Build Coastguard Worker p[2] == 'p' &&
305*f6dc9357SAndroid Build Coastguard Worker p[3] == ';')
306*f6dc9357SAndroid Build Coastguard Worker {
307*f6dc9357SAndroid Build Coastguard Worker p += 4;
308*f6dc9357SAndroid Build Coastguard Worker }
309*f6dc9357SAndroid Build Coastguard Worker else if (
310*f6dc9357SAndroid Build Coastguard Worker p[0] == 'l' &&
311*f6dc9357SAndroid Build Coastguard Worker p[1] == 't' &&
312*f6dc9357SAndroid Build Coastguard Worker p[2] == ';')
313*f6dc9357SAndroid Build Coastguard Worker {
314*f6dc9357SAndroid Build Coastguard Worker p += 3;
315*f6dc9357SAndroid Build Coastguard Worker c = '<';
316*f6dc9357SAndroid Build Coastguard Worker }
317*f6dc9357SAndroid Build Coastguard Worker else if (
318*f6dc9357SAndroid Build Coastguard Worker p[0] == 'g' &&
319*f6dc9357SAndroid Build Coastguard Worker p[1] == 't' &&
320*f6dc9357SAndroid Build Coastguard Worker p[2] == ';')
321*f6dc9357SAndroid Build Coastguard Worker {
322*f6dc9357SAndroid Build Coastguard Worker p += 3;
323*f6dc9357SAndroid Build Coastguard Worker c = '>';
324*f6dc9357SAndroid Build Coastguard Worker }
325*f6dc9357SAndroid Build Coastguard Worker else if (
326*f6dc9357SAndroid Build Coastguard Worker p[0] == 'a' &&
327*f6dc9357SAndroid Build Coastguard Worker p[1] == 'p' &&
328*f6dc9357SAndroid Build Coastguard Worker p[2] == 'o' &&
329*f6dc9357SAndroid Build Coastguard Worker p[3] == 's' &&
330*f6dc9357SAndroid Build Coastguard Worker p[4] == ';')
331*f6dc9357SAndroid Build Coastguard Worker {
332*f6dc9357SAndroid Build Coastguard Worker p += 5;
333*f6dc9357SAndroid Build Coastguard Worker c = '\'';
334*f6dc9357SAndroid Build Coastguard Worker }
335*f6dc9357SAndroid Build Coastguard Worker else if (
336*f6dc9357SAndroid Build Coastguard Worker p[0] == 'q' &&
337*f6dc9357SAndroid Build Coastguard Worker p[1] == 'u' &&
338*f6dc9357SAndroid Build Coastguard Worker p[2] == 'o' &&
339*f6dc9357SAndroid Build Coastguard Worker p[3] == 't' &&
340*f6dc9357SAndroid Build Coastguard Worker p[4] == ';')
341*f6dc9357SAndroid Build Coastguard Worker {
342*f6dc9357SAndroid Build Coastguard Worker p += 5;
343*f6dc9357SAndroid Build Coastguard Worker c = '\"';
344*f6dc9357SAndroid Build Coastguard Worker }
345*f6dc9357SAndroid Build Coastguard Worker }
346*f6dc9357SAndroid Build Coastguard Worker *dest++ = c;
347*f6dc9357SAndroid Build Coastguard Worker }
348*f6dc9357SAndroid Build Coastguard Worker temp.ReleaseBuf_SetEnd((unsigned)(dest - beg));
349*f6dc9357SAndroid Build Coastguard Worker }
350