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