xref: /minix3/external/mit/expat/dist/xmlwf/xmlwf.c (revision 1230fdc108a70388f87f1b3abdb6731e789a6d94)
1*1230fdc1SLionel Sambuc /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
2*1230fdc1SLionel Sambuc    See the file COPYING for copying permission.
3*1230fdc1SLionel Sambuc */
4*1230fdc1SLionel Sambuc 
5*1230fdc1SLionel Sambuc #include <stdio.h>
6*1230fdc1SLionel Sambuc #include <stdlib.h>
7*1230fdc1SLionel Sambuc #include <stddef.h>
8*1230fdc1SLionel Sambuc #include <string.h>
9*1230fdc1SLionel Sambuc 
10*1230fdc1SLionel Sambuc #include "expat.h"
11*1230fdc1SLionel Sambuc #include "codepage.h"
12*1230fdc1SLionel Sambuc #include "xmlfile.h"
13*1230fdc1SLionel Sambuc #include "xmltchar.h"
14*1230fdc1SLionel Sambuc 
15*1230fdc1SLionel Sambuc #ifdef _MSC_VER
16*1230fdc1SLionel Sambuc #include <crtdbg.h>
17*1230fdc1SLionel Sambuc #endif
18*1230fdc1SLionel Sambuc 
19*1230fdc1SLionel Sambuc #if defined(__amigaos__) && defined(__USE_INLINE__)
20*1230fdc1SLionel Sambuc #include <proto/expat.h>
21*1230fdc1SLionel Sambuc #endif
22*1230fdc1SLionel Sambuc 
23*1230fdc1SLionel Sambuc /* This ensures proper sorting. */
24*1230fdc1SLionel Sambuc 
25*1230fdc1SLionel Sambuc #define NSSEP T('\001')
26*1230fdc1SLionel Sambuc 
27*1230fdc1SLionel Sambuc static void XMLCALL
characterData(void * userData,const XML_Char * s,int len)28*1230fdc1SLionel Sambuc characterData(void *userData, const XML_Char *s, int len)
29*1230fdc1SLionel Sambuc {
30*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)userData;
31*1230fdc1SLionel Sambuc   for (; len > 0; --len, ++s) {
32*1230fdc1SLionel Sambuc     switch (*s) {
33*1230fdc1SLionel Sambuc     case T('&'):
34*1230fdc1SLionel Sambuc       fputts(T("&amp;"), fp);
35*1230fdc1SLionel Sambuc       break;
36*1230fdc1SLionel Sambuc     case T('<'):
37*1230fdc1SLionel Sambuc       fputts(T("&lt;"), fp);
38*1230fdc1SLionel Sambuc       break;
39*1230fdc1SLionel Sambuc     case T('>'):
40*1230fdc1SLionel Sambuc       fputts(T("&gt;"), fp);
41*1230fdc1SLionel Sambuc       break;
42*1230fdc1SLionel Sambuc #ifdef W3C14N
43*1230fdc1SLionel Sambuc     case 13:
44*1230fdc1SLionel Sambuc       fputts(T("&#xD;"), fp);
45*1230fdc1SLionel Sambuc       break;
46*1230fdc1SLionel Sambuc #else
47*1230fdc1SLionel Sambuc     case T('"'):
48*1230fdc1SLionel Sambuc       fputts(T("&quot;"), fp);
49*1230fdc1SLionel Sambuc       break;
50*1230fdc1SLionel Sambuc     case 9:
51*1230fdc1SLionel Sambuc     case 10:
52*1230fdc1SLionel Sambuc     case 13:
53*1230fdc1SLionel Sambuc       ftprintf(fp, T("&#%d;"), *s);
54*1230fdc1SLionel Sambuc       break;
55*1230fdc1SLionel Sambuc #endif
56*1230fdc1SLionel Sambuc     default:
57*1230fdc1SLionel Sambuc       puttc(*s, fp);
58*1230fdc1SLionel Sambuc       break;
59*1230fdc1SLionel Sambuc     }
60*1230fdc1SLionel Sambuc   }
61*1230fdc1SLionel Sambuc }
62*1230fdc1SLionel Sambuc 
63*1230fdc1SLionel Sambuc static void
attributeValue(FILE * fp,const XML_Char * s)64*1230fdc1SLionel Sambuc attributeValue(FILE *fp, const XML_Char *s)
65*1230fdc1SLionel Sambuc {
66*1230fdc1SLionel Sambuc   puttc(T('='), fp);
67*1230fdc1SLionel Sambuc   puttc(T('"'), fp);
68*1230fdc1SLionel Sambuc   for (;;) {
69*1230fdc1SLionel Sambuc     switch (*s) {
70*1230fdc1SLionel Sambuc     case 0:
71*1230fdc1SLionel Sambuc     case NSSEP:
72*1230fdc1SLionel Sambuc       puttc(T('"'), fp);
73*1230fdc1SLionel Sambuc       return;
74*1230fdc1SLionel Sambuc     case T('&'):
75*1230fdc1SLionel Sambuc       fputts(T("&amp;"), fp);
76*1230fdc1SLionel Sambuc       break;
77*1230fdc1SLionel Sambuc     case T('<'):
78*1230fdc1SLionel Sambuc       fputts(T("&lt;"), fp);
79*1230fdc1SLionel Sambuc       break;
80*1230fdc1SLionel Sambuc     case T('"'):
81*1230fdc1SLionel Sambuc       fputts(T("&quot;"), fp);
82*1230fdc1SLionel Sambuc       break;
83*1230fdc1SLionel Sambuc #ifdef W3C14N
84*1230fdc1SLionel Sambuc     case 9:
85*1230fdc1SLionel Sambuc       fputts(T("&#x9;"), fp);
86*1230fdc1SLionel Sambuc       break;
87*1230fdc1SLionel Sambuc     case 10:
88*1230fdc1SLionel Sambuc       fputts(T("&#xA;"), fp);
89*1230fdc1SLionel Sambuc       break;
90*1230fdc1SLionel Sambuc     case 13:
91*1230fdc1SLionel Sambuc       fputts(T("&#xD;"), fp);
92*1230fdc1SLionel Sambuc       break;
93*1230fdc1SLionel Sambuc #else
94*1230fdc1SLionel Sambuc     case T('>'):
95*1230fdc1SLionel Sambuc       fputts(T("&gt;"), fp);
96*1230fdc1SLionel Sambuc       break;
97*1230fdc1SLionel Sambuc     case 9:
98*1230fdc1SLionel Sambuc     case 10:
99*1230fdc1SLionel Sambuc     case 13:
100*1230fdc1SLionel Sambuc       ftprintf(fp, T("&#%d;"), *s);
101*1230fdc1SLionel Sambuc       break;
102*1230fdc1SLionel Sambuc #endif
103*1230fdc1SLionel Sambuc     default:
104*1230fdc1SLionel Sambuc       puttc(*s, fp);
105*1230fdc1SLionel Sambuc       break;
106*1230fdc1SLionel Sambuc     }
107*1230fdc1SLionel Sambuc     s++;
108*1230fdc1SLionel Sambuc   }
109*1230fdc1SLionel Sambuc }
110*1230fdc1SLionel Sambuc 
111*1230fdc1SLionel Sambuc /* Lexicographically comparing UTF-8 encoded attribute values,
112*1230fdc1SLionel Sambuc is equivalent to lexicographically comparing based on the character number. */
113*1230fdc1SLionel Sambuc 
114*1230fdc1SLionel Sambuc static int
attcmp(const void * att1,const void * att2)115*1230fdc1SLionel Sambuc attcmp(const void *att1, const void *att2)
116*1230fdc1SLionel Sambuc {
117*1230fdc1SLionel Sambuc   return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2);
118*1230fdc1SLionel Sambuc }
119*1230fdc1SLionel Sambuc 
120*1230fdc1SLionel Sambuc static void XMLCALL
startElement(void * userData,const XML_Char * name,const XML_Char ** atts)121*1230fdc1SLionel Sambuc startElement(void *userData, const XML_Char *name, const XML_Char **atts)
122*1230fdc1SLionel Sambuc {
123*1230fdc1SLionel Sambuc   int nAtts;
124*1230fdc1SLionel Sambuc   const XML_Char **p;
125*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)userData;
126*1230fdc1SLionel Sambuc   puttc(T('<'), fp);
127*1230fdc1SLionel Sambuc   fputts(name, fp);
128*1230fdc1SLionel Sambuc 
129*1230fdc1SLionel Sambuc   p = atts;
130*1230fdc1SLionel Sambuc   while (*p)
131*1230fdc1SLionel Sambuc     ++p;
132*1230fdc1SLionel Sambuc   nAtts = (int)((p - atts) >> 1);
133*1230fdc1SLionel Sambuc   if (nAtts > 1)
134*1230fdc1SLionel Sambuc     qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, attcmp);
135*1230fdc1SLionel Sambuc   while (*atts) {
136*1230fdc1SLionel Sambuc     puttc(T(' '), fp);
137*1230fdc1SLionel Sambuc     fputts(*atts++, fp);
138*1230fdc1SLionel Sambuc     attributeValue(fp, *atts);
139*1230fdc1SLionel Sambuc     atts++;
140*1230fdc1SLionel Sambuc   }
141*1230fdc1SLionel Sambuc   puttc(T('>'), fp);
142*1230fdc1SLionel Sambuc }
143*1230fdc1SLionel Sambuc 
144*1230fdc1SLionel Sambuc static void XMLCALL
endElement(void * userData,const XML_Char * name)145*1230fdc1SLionel Sambuc endElement(void *userData, const XML_Char *name)
146*1230fdc1SLionel Sambuc {
147*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)userData;
148*1230fdc1SLionel Sambuc   puttc(T('<'), fp);
149*1230fdc1SLionel Sambuc   puttc(T('/'), fp);
150*1230fdc1SLionel Sambuc   fputts(name, fp);
151*1230fdc1SLionel Sambuc   puttc(T('>'), fp);
152*1230fdc1SLionel Sambuc }
153*1230fdc1SLionel Sambuc 
154*1230fdc1SLionel Sambuc static int
nsattcmp(const void * p1,const void * p2)155*1230fdc1SLionel Sambuc nsattcmp(const void *p1, const void *p2)
156*1230fdc1SLionel Sambuc {
157*1230fdc1SLionel Sambuc   const XML_Char *att1 = *(const XML_Char **)p1;
158*1230fdc1SLionel Sambuc   const XML_Char *att2 = *(const XML_Char **)p2;
159*1230fdc1SLionel Sambuc   int sep1 = (tcsrchr(att1, NSSEP) != 0);
160*1230fdc1SLionel Sambuc   int sep2 = (tcsrchr(att1, NSSEP) != 0);
161*1230fdc1SLionel Sambuc   if (sep1 != sep2)
162*1230fdc1SLionel Sambuc     return sep1 - sep2;
163*1230fdc1SLionel Sambuc   return tcscmp(att1, att2);
164*1230fdc1SLionel Sambuc }
165*1230fdc1SLionel Sambuc 
166*1230fdc1SLionel Sambuc static void XMLCALL
startElementNS(void * userData,const XML_Char * name,const XML_Char ** atts)167*1230fdc1SLionel Sambuc startElementNS(void *userData, const XML_Char *name, const XML_Char **atts)
168*1230fdc1SLionel Sambuc {
169*1230fdc1SLionel Sambuc   int nAtts;
170*1230fdc1SLionel Sambuc   int nsi;
171*1230fdc1SLionel Sambuc   const XML_Char **p;
172*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)userData;
173*1230fdc1SLionel Sambuc   const XML_Char *sep;
174*1230fdc1SLionel Sambuc   puttc(T('<'), fp);
175*1230fdc1SLionel Sambuc 
176*1230fdc1SLionel Sambuc   sep = tcsrchr(name, NSSEP);
177*1230fdc1SLionel Sambuc   if (sep) {
178*1230fdc1SLionel Sambuc     fputts(T("n1:"), fp);
179*1230fdc1SLionel Sambuc     fputts(sep + 1, fp);
180*1230fdc1SLionel Sambuc     fputts(T(" xmlns:n1"), fp);
181*1230fdc1SLionel Sambuc     attributeValue(fp, name);
182*1230fdc1SLionel Sambuc     nsi = 2;
183*1230fdc1SLionel Sambuc   }
184*1230fdc1SLionel Sambuc   else {
185*1230fdc1SLionel Sambuc     fputts(name, fp);
186*1230fdc1SLionel Sambuc     nsi = 1;
187*1230fdc1SLionel Sambuc   }
188*1230fdc1SLionel Sambuc 
189*1230fdc1SLionel Sambuc   p = atts;
190*1230fdc1SLionel Sambuc   while (*p)
191*1230fdc1SLionel Sambuc     ++p;
192*1230fdc1SLionel Sambuc   nAtts = (int)((p - atts) >> 1);
193*1230fdc1SLionel Sambuc   if (nAtts > 1)
194*1230fdc1SLionel Sambuc     qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, nsattcmp);
195*1230fdc1SLionel Sambuc   while (*atts) {
196*1230fdc1SLionel Sambuc     name = *atts++;
197*1230fdc1SLionel Sambuc     sep = tcsrchr(name, NSSEP);
198*1230fdc1SLionel Sambuc     puttc(T(' '), fp);
199*1230fdc1SLionel Sambuc     if (sep) {
200*1230fdc1SLionel Sambuc       ftprintf(fp, T("n%d:"), nsi);
201*1230fdc1SLionel Sambuc       fputts(sep + 1, fp);
202*1230fdc1SLionel Sambuc     }
203*1230fdc1SLionel Sambuc     else
204*1230fdc1SLionel Sambuc       fputts(name, fp);
205*1230fdc1SLionel Sambuc     attributeValue(fp, *atts);
206*1230fdc1SLionel Sambuc     if (sep) {
207*1230fdc1SLionel Sambuc       ftprintf(fp, T(" xmlns:n%d"), nsi++);
208*1230fdc1SLionel Sambuc       attributeValue(fp, name);
209*1230fdc1SLionel Sambuc     }
210*1230fdc1SLionel Sambuc     atts++;
211*1230fdc1SLionel Sambuc   }
212*1230fdc1SLionel Sambuc   puttc(T('>'), fp);
213*1230fdc1SLionel Sambuc }
214*1230fdc1SLionel Sambuc 
215*1230fdc1SLionel Sambuc static void XMLCALL
endElementNS(void * userData,const XML_Char * name)216*1230fdc1SLionel Sambuc endElementNS(void *userData, const XML_Char *name)
217*1230fdc1SLionel Sambuc {
218*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)userData;
219*1230fdc1SLionel Sambuc   const XML_Char *sep;
220*1230fdc1SLionel Sambuc   puttc(T('<'), fp);
221*1230fdc1SLionel Sambuc   puttc(T('/'), fp);
222*1230fdc1SLionel Sambuc   sep = tcsrchr(name, NSSEP);
223*1230fdc1SLionel Sambuc   if (sep) {
224*1230fdc1SLionel Sambuc     fputts(T("n1:"), fp);
225*1230fdc1SLionel Sambuc     fputts(sep + 1, fp);
226*1230fdc1SLionel Sambuc   }
227*1230fdc1SLionel Sambuc   else
228*1230fdc1SLionel Sambuc     fputts(name, fp);
229*1230fdc1SLionel Sambuc   puttc(T('>'), fp);
230*1230fdc1SLionel Sambuc }
231*1230fdc1SLionel Sambuc 
232*1230fdc1SLionel Sambuc #ifndef W3C14N
233*1230fdc1SLionel Sambuc 
234*1230fdc1SLionel Sambuc static void XMLCALL
processingInstruction(void * userData,const XML_Char * target,const XML_Char * data)235*1230fdc1SLionel Sambuc processingInstruction(void *userData, const XML_Char *target,
236*1230fdc1SLionel Sambuc                       const XML_Char *data)
237*1230fdc1SLionel Sambuc {
238*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)userData;
239*1230fdc1SLionel Sambuc   puttc(T('<'), fp);
240*1230fdc1SLionel Sambuc   puttc(T('?'), fp);
241*1230fdc1SLionel Sambuc   fputts(target, fp);
242*1230fdc1SLionel Sambuc   puttc(T(' '), fp);
243*1230fdc1SLionel Sambuc   fputts(data, fp);
244*1230fdc1SLionel Sambuc   puttc(T('?'), fp);
245*1230fdc1SLionel Sambuc   puttc(T('>'), fp);
246*1230fdc1SLionel Sambuc }
247*1230fdc1SLionel Sambuc 
248*1230fdc1SLionel Sambuc #endif /* not W3C14N */
249*1230fdc1SLionel Sambuc 
250*1230fdc1SLionel Sambuc static void XMLCALL
defaultCharacterData(void * userData,const XML_Char * s,int len)251*1230fdc1SLionel Sambuc defaultCharacterData(void *userData, const XML_Char *s, int len)
252*1230fdc1SLionel Sambuc {
253*1230fdc1SLionel Sambuc   XML_DefaultCurrent((XML_Parser) userData);
254*1230fdc1SLionel Sambuc }
255*1230fdc1SLionel Sambuc 
256*1230fdc1SLionel Sambuc static void XMLCALL
defaultStartElement(void * userData,const XML_Char * name,const XML_Char ** atts)257*1230fdc1SLionel Sambuc defaultStartElement(void *userData, const XML_Char *name,
258*1230fdc1SLionel Sambuc                     const XML_Char **atts)
259*1230fdc1SLionel Sambuc {
260*1230fdc1SLionel Sambuc   XML_DefaultCurrent((XML_Parser) userData);
261*1230fdc1SLionel Sambuc }
262*1230fdc1SLionel Sambuc 
263*1230fdc1SLionel Sambuc static void XMLCALL
defaultEndElement(void * userData,const XML_Char * name)264*1230fdc1SLionel Sambuc defaultEndElement(void *userData, const XML_Char *name)
265*1230fdc1SLionel Sambuc {
266*1230fdc1SLionel Sambuc   XML_DefaultCurrent((XML_Parser) userData);
267*1230fdc1SLionel Sambuc }
268*1230fdc1SLionel Sambuc 
269*1230fdc1SLionel Sambuc static void XMLCALL
defaultProcessingInstruction(void * userData,const XML_Char * target,const XML_Char * data)270*1230fdc1SLionel Sambuc defaultProcessingInstruction(void *userData, const XML_Char *target,
271*1230fdc1SLionel Sambuc                              const XML_Char *data)
272*1230fdc1SLionel Sambuc {
273*1230fdc1SLionel Sambuc   XML_DefaultCurrent((XML_Parser) userData);
274*1230fdc1SLionel Sambuc }
275*1230fdc1SLionel Sambuc 
276*1230fdc1SLionel Sambuc static void XMLCALL
nopCharacterData(void * userData,const XML_Char * s,int len)277*1230fdc1SLionel Sambuc nopCharacterData(void *userData, const XML_Char *s, int len)
278*1230fdc1SLionel Sambuc {
279*1230fdc1SLionel Sambuc }
280*1230fdc1SLionel Sambuc 
281*1230fdc1SLionel Sambuc static void XMLCALL
nopStartElement(void * userData,const XML_Char * name,const XML_Char ** atts)282*1230fdc1SLionel Sambuc nopStartElement(void *userData, const XML_Char *name, const XML_Char **atts)
283*1230fdc1SLionel Sambuc {
284*1230fdc1SLionel Sambuc }
285*1230fdc1SLionel Sambuc 
286*1230fdc1SLionel Sambuc static void XMLCALL
nopEndElement(void * userData,const XML_Char * name)287*1230fdc1SLionel Sambuc nopEndElement(void *userData, const XML_Char *name)
288*1230fdc1SLionel Sambuc {
289*1230fdc1SLionel Sambuc }
290*1230fdc1SLionel Sambuc 
291*1230fdc1SLionel Sambuc static void XMLCALL
nopProcessingInstruction(void * userData,const XML_Char * target,const XML_Char * data)292*1230fdc1SLionel Sambuc nopProcessingInstruction(void *userData, const XML_Char *target,
293*1230fdc1SLionel Sambuc                          const XML_Char *data)
294*1230fdc1SLionel Sambuc {
295*1230fdc1SLionel Sambuc }
296*1230fdc1SLionel Sambuc 
297*1230fdc1SLionel Sambuc static void XMLCALL
markup(void * userData,const XML_Char * s,int len)298*1230fdc1SLionel Sambuc markup(void *userData, const XML_Char *s, int len)
299*1230fdc1SLionel Sambuc {
300*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData((XML_Parser) userData);
301*1230fdc1SLionel Sambuc   for (; len > 0; --len, ++s)
302*1230fdc1SLionel Sambuc     puttc(*s, fp);
303*1230fdc1SLionel Sambuc }
304*1230fdc1SLionel Sambuc 
305*1230fdc1SLionel Sambuc static void
metaLocation(XML_Parser parser)306*1230fdc1SLionel Sambuc metaLocation(XML_Parser parser)
307*1230fdc1SLionel Sambuc {
308*1230fdc1SLionel Sambuc   const XML_Char *uri = XML_GetBase(parser);
309*1230fdc1SLionel Sambuc   if (uri)
310*1230fdc1SLionel Sambuc     ftprintf((FILE *)XML_GetUserData(parser), T(" uri=\"%s\""), uri);
311*1230fdc1SLionel Sambuc   ftprintf((FILE *)XML_GetUserData(parser),
312*1230fdc1SLionel Sambuc            T(" byte=\"%" XML_FMT_INT_MOD "d\" nbytes=\"%d\" \
313*1230fdc1SLionel Sambuc 			 line=\"%" XML_FMT_INT_MOD "u\" col=\"%" XML_FMT_INT_MOD "u\""),
314*1230fdc1SLionel Sambuc            XML_GetCurrentByteIndex(parser),
315*1230fdc1SLionel Sambuc            XML_GetCurrentByteCount(parser),
316*1230fdc1SLionel Sambuc            XML_GetCurrentLineNumber(parser),
317*1230fdc1SLionel Sambuc            XML_GetCurrentColumnNumber(parser));
318*1230fdc1SLionel Sambuc }
319*1230fdc1SLionel Sambuc 
320*1230fdc1SLionel Sambuc static void
metaStartDocument(void * userData)321*1230fdc1SLionel Sambuc metaStartDocument(void *userData)
322*1230fdc1SLionel Sambuc {
323*1230fdc1SLionel Sambuc   fputts(T("<document>\n"), (FILE *)XML_GetUserData((XML_Parser) userData));
324*1230fdc1SLionel Sambuc }
325*1230fdc1SLionel Sambuc 
326*1230fdc1SLionel Sambuc static void
metaEndDocument(void * userData)327*1230fdc1SLionel Sambuc metaEndDocument(void *userData)
328*1230fdc1SLionel Sambuc {
329*1230fdc1SLionel Sambuc   fputts(T("</document>\n"), (FILE *)XML_GetUserData((XML_Parser) userData));
330*1230fdc1SLionel Sambuc }
331*1230fdc1SLionel Sambuc 
332*1230fdc1SLionel Sambuc static void XMLCALL
metaStartElement(void * userData,const XML_Char * name,const XML_Char ** atts)333*1230fdc1SLionel Sambuc metaStartElement(void *userData, const XML_Char *name,
334*1230fdc1SLionel Sambuc                  const XML_Char **atts)
335*1230fdc1SLionel Sambuc {
336*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
337*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
338*1230fdc1SLionel Sambuc   const XML_Char **specifiedAttsEnd
339*1230fdc1SLionel Sambuc     = atts + XML_GetSpecifiedAttributeCount(parser);
340*1230fdc1SLionel Sambuc   const XML_Char **idAttPtr;
341*1230fdc1SLionel Sambuc   int idAttIndex = XML_GetIdAttributeIndex(parser);
342*1230fdc1SLionel Sambuc   if (idAttIndex < 0)
343*1230fdc1SLionel Sambuc     idAttPtr = 0;
344*1230fdc1SLionel Sambuc   else
345*1230fdc1SLionel Sambuc     idAttPtr = atts + idAttIndex;
346*1230fdc1SLionel Sambuc 
347*1230fdc1SLionel Sambuc   ftprintf(fp, T("<starttag name=\"%s\""), name);
348*1230fdc1SLionel Sambuc   metaLocation(parser);
349*1230fdc1SLionel Sambuc   if (*atts) {
350*1230fdc1SLionel Sambuc     fputts(T(">\n"), fp);
351*1230fdc1SLionel Sambuc     do {
352*1230fdc1SLionel Sambuc       ftprintf(fp, T("<attribute name=\"%s\" value=\""), atts[0]);
353*1230fdc1SLionel Sambuc       characterData(fp, atts[1], (int)tcslen(atts[1]));
354*1230fdc1SLionel Sambuc       if (atts >= specifiedAttsEnd)
355*1230fdc1SLionel Sambuc         fputts(T("\" defaulted=\"yes\"/>\n"), fp);
356*1230fdc1SLionel Sambuc       else if (atts == idAttPtr)
357*1230fdc1SLionel Sambuc         fputts(T("\" id=\"yes\"/>\n"), fp);
358*1230fdc1SLionel Sambuc       else
359*1230fdc1SLionel Sambuc         fputts(T("\"/>\n"), fp);
360*1230fdc1SLionel Sambuc     } while (*(atts += 2));
361*1230fdc1SLionel Sambuc     fputts(T("</starttag>\n"), fp);
362*1230fdc1SLionel Sambuc   }
363*1230fdc1SLionel Sambuc   else
364*1230fdc1SLionel Sambuc     fputts(T("/>\n"), fp);
365*1230fdc1SLionel Sambuc }
366*1230fdc1SLionel Sambuc 
367*1230fdc1SLionel Sambuc static void XMLCALL
metaEndElement(void * userData,const XML_Char * name)368*1230fdc1SLionel Sambuc metaEndElement(void *userData, const XML_Char *name)
369*1230fdc1SLionel Sambuc {
370*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
371*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
372*1230fdc1SLionel Sambuc   ftprintf(fp, T("<endtag name=\"%s\""), name);
373*1230fdc1SLionel Sambuc   metaLocation(parser);
374*1230fdc1SLionel Sambuc   fputts(T("/>\n"), fp);
375*1230fdc1SLionel Sambuc }
376*1230fdc1SLionel Sambuc 
377*1230fdc1SLionel Sambuc static void XMLCALL
metaProcessingInstruction(void * userData,const XML_Char * target,const XML_Char * data)378*1230fdc1SLionel Sambuc metaProcessingInstruction(void *userData, const XML_Char *target,
379*1230fdc1SLionel Sambuc                           const XML_Char *data)
380*1230fdc1SLionel Sambuc {
381*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
382*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
383*1230fdc1SLionel Sambuc   ftprintf(fp, T("<pi target=\"%s\" data=\""), target);
384*1230fdc1SLionel Sambuc   characterData(fp, data, (int)tcslen(data));
385*1230fdc1SLionel Sambuc   puttc(T('"'), fp);
386*1230fdc1SLionel Sambuc   metaLocation(parser);
387*1230fdc1SLionel Sambuc   fputts(T("/>\n"), fp);
388*1230fdc1SLionel Sambuc }
389*1230fdc1SLionel Sambuc 
390*1230fdc1SLionel Sambuc static void XMLCALL
metaComment(void * userData,const XML_Char * data)391*1230fdc1SLionel Sambuc metaComment(void *userData, const XML_Char *data)
392*1230fdc1SLionel Sambuc {
393*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
394*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
395*1230fdc1SLionel Sambuc   fputts(T("<comment data=\""), fp);
396*1230fdc1SLionel Sambuc   characterData(fp, data, (int)tcslen(data));
397*1230fdc1SLionel Sambuc   puttc(T('"'), fp);
398*1230fdc1SLionel Sambuc   metaLocation(parser);
399*1230fdc1SLionel Sambuc   fputts(T("/>\n"), fp);
400*1230fdc1SLionel Sambuc }
401*1230fdc1SLionel Sambuc 
402*1230fdc1SLionel Sambuc static void XMLCALL
metaStartCdataSection(void * userData)403*1230fdc1SLionel Sambuc metaStartCdataSection(void *userData)
404*1230fdc1SLionel Sambuc {
405*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
406*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
407*1230fdc1SLionel Sambuc   fputts(T("<startcdata"), fp);
408*1230fdc1SLionel Sambuc   metaLocation(parser);
409*1230fdc1SLionel Sambuc   fputts(T("/>\n"), fp);
410*1230fdc1SLionel Sambuc }
411*1230fdc1SLionel Sambuc 
412*1230fdc1SLionel Sambuc static void XMLCALL
metaEndCdataSection(void * userData)413*1230fdc1SLionel Sambuc metaEndCdataSection(void *userData)
414*1230fdc1SLionel Sambuc {
415*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
416*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
417*1230fdc1SLionel Sambuc   fputts(T("<endcdata"), fp);
418*1230fdc1SLionel Sambuc   metaLocation(parser);
419*1230fdc1SLionel Sambuc   fputts(T("/>\n"), fp);
420*1230fdc1SLionel Sambuc }
421*1230fdc1SLionel Sambuc 
422*1230fdc1SLionel Sambuc static void XMLCALL
metaCharacterData(void * userData,const XML_Char * s,int len)423*1230fdc1SLionel Sambuc metaCharacterData(void *userData, const XML_Char *s, int len)
424*1230fdc1SLionel Sambuc {
425*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
426*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
427*1230fdc1SLionel Sambuc   fputts(T("<chars str=\""), fp);
428*1230fdc1SLionel Sambuc   characterData(fp, s, len);
429*1230fdc1SLionel Sambuc   puttc(T('"'), fp);
430*1230fdc1SLionel Sambuc   metaLocation(parser);
431*1230fdc1SLionel Sambuc   fputts(T("/>\n"), fp);
432*1230fdc1SLionel Sambuc }
433*1230fdc1SLionel Sambuc 
434*1230fdc1SLionel Sambuc static void XMLCALL
metaStartDoctypeDecl(void * userData,const XML_Char * doctypeName,const XML_Char * sysid,const XML_Char * pubid,int has_internal_subset)435*1230fdc1SLionel Sambuc metaStartDoctypeDecl(void *userData,
436*1230fdc1SLionel Sambuc                      const XML_Char *doctypeName,
437*1230fdc1SLionel Sambuc                      const XML_Char *sysid,
438*1230fdc1SLionel Sambuc                      const XML_Char *pubid,
439*1230fdc1SLionel Sambuc                      int has_internal_subset)
440*1230fdc1SLionel Sambuc {
441*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
442*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
443*1230fdc1SLionel Sambuc   ftprintf(fp, T("<startdoctype name=\"%s\""), doctypeName);
444*1230fdc1SLionel Sambuc   metaLocation(parser);
445*1230fdc1SLionel Sambuc   fputts(T("/>\n"), fp);
446*1230fdc1SLionel Sambuc }
447*1230fdc1SLionel Sambuc 
448*1230fdc1SLionel Sambuc static void XMLCALL
metaEndDoctypeDecl(void * userData)449*1230fdc1SLionel Sambuc metaEndDoctypeDecl(void *userData)
450*1230fdc1SLionel Sambuc {
451*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
452*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
453*1230fdc1SLionel Sambuc   fputts(T("<enddoctype"), fp);
454*1230fdc1SLionel Sambuc   metaLocation(parser);
455*1230fdc1SLionel Sambuc   fputts(T("/>\n"), fp);
456*1230fdc1SLionel Sambuc }
457*1230fdc1SLionel Sambuc 
458*1230fdc1SLionel Sambuc static void XMLCALL
metaNotationDecl(void * userData,const XML_Char * notationName,const XML_Char * base,const XML_Char * systemId,const XML_Char * publicId)459*1230fdc1SLionel Sambuc metaNotationDecl(void *userData,
460*1230fdc1SLionel Sambuc                  const XML_Char *notationName,
461*1230fdc1SLionel Sambuc                  const XML_Char *base,
462*1230fdc1SLionel Sambuc                  const XML_Char *systemId,
463*1230fdc1SLionel Sambuc                  const XML_Char *publicId)
464*1230fdc1SLionel Sambuc {
465*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
466*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
467*1230fdc1SLionel Sambuc   ftprintf(fp, T("<notation name=\"%s\""), notationName);
468*1230fdc1SLionel Sambuc   if (publicId)
469*1230fdc1SLionel Sambuc     ftprintf(fp, T(" public=\"%s\""), publicId);
470*1230fdc1SLionel Sambuc   if (systemId) {
471*1230fdc1SLionel Sambuc     fputts(T(" system=\""), fp);
472*1230fdc1SLionel Sambuc     characterData(fp, systemId, (int)tcslen(systemId));
473*1230fdc1SLionel Sambuc     puttc(T('"'), fp);
474*1230fdc1SLionel Sambuc   }
475*1230fdc1SLionel Sambuc   metaLocation(parser);
476*1230fdc1SLionel Sambuc   fputts(T("/>\n"), fp);
477*1230fdc1SLionel Sambuc }
478*1230fdc1SLionel Sambuc 
479*1230fdc1SLionel Sambuc 
480*1230fdc1SLionel Sambuc static void XMLCALL
metaEntityDecl(void * userData,const XML_Char * entityName,int is_param,const XML_Char * value,int value_length,const XML_Char * base,const XML_Char * systemId,const XML_Char * publicId,const XML_Char * notationName)481*1230fdc1SLionel Sambuc metaEntityDecl(void *userData,
482*1230fdc1SLionel Sambuc                const XML_Char *entityName,
483*1230fdc1SLionel Sambuc                int  is_param,
484*1230fdc1SLionel Sambuc                const XML_Char *value,
485*1230fdc1SLionel Sambuc                int  value_length,
486*1230fdc1SLionel Sambuc                const XML_Char *base,
487*1230fdc1SLionel Sambuc                const XML_Char *systemId,
488*1230fdc1SLionel Sambuc                const XML_Char *publicId,
489*1230fdc1SLionel Sambuc                const XML_Char *notationName)
490*1230fdc1SLionel Sambuc {
491*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
492*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
493*1230fdc1SLionel Sambuc 
494*1230fdc1SLionel Sambuc   if (value) {
495*1230fdc1SLionel Sambuc     ftprintf(fp, T("<entity name=\"%s\""), entityName);
496*1230fdc1SLionel Sambuc     metaLocation(parser);
497*1230fdc1SLionel Sambuc     puttc(T('>'), fp);
498*1230fdc1SLionel Sambuc     characterData(fp, value, value_length);
499*1230fdc1SLionel Sambuc     fputts(T("</entity/>\n"), fp);
500*1230fdc1SLionel Sambuc   }
501*1230fdc1SLionel Sambuc   else if (notationName) {
502*1230fdc1SLionel Sambuc     ftprintf(fp, T("<entity name=\"%s\""), entityName);
503*1230fdc1SLionel Sambuc     if (publicId)
504*1230fdc1SLionel Sambuc       ftprintf(fp, T(" public=\"%s\""), publicId);
505*1230fdc1SLionel Sambuc     fputts(T(" system=\""), fp);
506*1230fdc1SLionel Sambuc     characterData(fp, systemId, (int)tcslen(systemId));
507*1230fdc1SLionel Sambuc     puttc(T('"'), fp);
508*1230fdc1SLionel Sambuc     ftprintf(fp, T(" notation=\"%s\""), notationName);
509*1230fdc1SLionel Sambuc     metaLocation(parser);
510*1230fdc1SLionel Sambuc     fputts(T("/>\n"), fp);
511*1230fdc1SLionel Sambuc   }
512*1230fdc1SLionel Sambuc   else {
513*1230fdc1SLionel Sambuc     ftprintf(fp, T("<entity name=\"%s\""), entityName);
514*1230fdc1SLionel Sambuc     if (publicId)
515*1230fdc1SLionel Sambuc       ftprintf(fp, T(" public=\"%s\""), publicId);
516*1230fdc1SLionel Sambuc     fputts(T(" system=\""), fp);
517*1230fdc1SLionel Sambuc     characterData(fp, systemId, (int)tcslen(systemId));
518*1230fdc1SLionel Sambuc     puttc(T('"'), fp);
519*1230fdc1SLionel Sambuc     metaLocation(parser);
520*1230fdc1SLionel Sambuc     fputts(T("/>\n"), fp);
521*1230fdc1SLionel Sambuc   }
522*1230fdc1SLionel Sambuc }
523*1230fdc1SLionel Sambuc 
524*1230fdc1SLionel Sambuc static void XMLCALL
metaStartNamespaceDecl(void * userData,const XML_Char * prefix,const XML_Char * uri)525*1230fdc1SLionel Sambuc metaStartNamespaceDecl(void *userData,
526*1230fdc1SLionel Sambuc                        const XML_Char *prefix,
527*1230fdc1SLionel Sambuc                        const XML_Char *uri)
528*1230fdc1SLionel Sambuc {
529*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
530*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
531*1230fdc1SLionel Sambuc   fputts(T("<startns"), fp);
532*1230fdc1SLionel Sambuc   if (prefix)
533*1230fdc1SLionel Sambuc     ftprintf(fp, T(" prefix=\"%s\""), prefix);
534*1230fdc1SLionel Sambuc   if (uri) {
535*1230fdc1SLionel Sambuc     fputts(T(" ns=\""), fp);
536*1230fdc1SLionel Sambuc     characterData(fp, uri, (int)tcslen(uri));
537*1230fdc1SLionel Sambuc     fputts(T("\"/>\n"), fp);
538*1230fdc1SLionel Sambuc   }
539*1230fdc1SLionel Sambuc   else
540*1230fdc1SLionel Sambuc     fputts(T("/>\n"), fp);
541*1230fdc1SLionel Sambuc }
542*1230fdc1SLionel Sambuc 
543*1230fdc1SLionel Sambuc static void XMLCALL
metaEndNamespaceDecl(void * userData,const XML_Char * prefix)544*1230fdc1SLionel Sambuc metaEndNamespaceDecl(void *userData, const XML_Char *prefix)
545*1230fdc1SLionel Sambuc {
546*1230fdc1SLionel Sambuc   XML_Parser parser = (XML_Parser) userData;
547*1230fdc1SLionel Sambuc   FILE *fp = (FILE *)XML_GetUserData(parser);
548*1230fdc1SLionel Sambuc   if (!prefix)
549*1230fdc1SLionel Sambuc     fputts(T("<endns/>\n"), fp);
550*1230fdc1SLionel Sambuc   else
551*1230fdc1SLionel Sambuc     ftprintf(fp, T("<endns prefix=\"%s\"/>\n"), prefix);
552*1230fdc1SLionel Sambuc }
553*1230fdc1SLionel Sambuc 
554*1230fdc1SLionel Sambuc static int XMLCALL
unknownEncodingConvert(void * data,const char * p)555*1230fdc1SLionel Sambuc unknownEncodingConvert(void *data, const char *p)
556*1230fdc1SLionel Sambuc {
557*1230fdc1SLionel Sambuc   return codepageConvert(*(int *)data, p);
558*1230fdc1SLionel Sambuc }
559*1230fdc1SLionel Sambuc 
560*1230fdc1SLionel Sambuc static int XMLCALL
unknownEncoding(void * userData,const XML_Char * name,XML_Encoding * info)561*1230fdc1SLionel Sambuc unknownEncoding(void *userData, const XML_Char *name, XML_Encoding *info)
562*1230fdc1SLionel Sambuc {
563*1230fdc1SLionel Sambuc   int cp;
564*1230fdc1SLionel Sambuc   static const XML_Char prefixL[] = T("windows-");
565*1230fdc1SLionel Sambuc   static const XML_Char prefixU[] = T("WINDOWS-");
566*1230fdc1SLionel Sambuc   int i;
567*1230fdc1SLionel Sambuc 
568*1230fdc1SLionel Sambuc   for (i = 0; prefixU[i]; i++)
569*1230fdc1SLionel Sambuc     if (name[i] != prefixU[i] && name[i] != prefixL[i])
570*1230fdc1SLionel Sambuc       return 0;
571*1230fdc1SLionel Sambuc 
572*1230fdc1SLionel Sambuc   cp = 0;
573*1230fdc1SLionel Sambuc   for (; name[i]; i++) {
574*1230fdc1SLionel Sambuc     static const XML_Char digits[] = T("0123456789");
575*1230fdc1SLionel Sambuc     const XML_Char *s = tcschr(digits, name[i]);
576*1230fdc1SLionel Sambuc     if (!s)
577*1230fdc1SLionel Sambuc       return 0;
578*1230fdc1SLionel Sambuc     cp *= 10;
579*1230fdc1SLionel Sambuc     cp += (int)(s - digits);
580*1230fdc1SLionel Sambuc     if (cp >= 0x10000)
581*1230fdc1SLionel Sambuc       return 0;
582*1230fdc1SLionel Sambuc   }
583*1230fdc1SLionel Sambuc   if (!codepageMap(cp, info->map))
584*1230fdc1SLionel Sambuc     return 0;
585*1230fdc1SLionel Sambuc   info->convert = unknownEncodingConvert;
586*1230fdc1SLionel Sambuc   /* We could just cast the code page integer to a void *,
587*1230fdc1SLionel Sambuc   and avoid the use of release. */
588*1230fdc1SLionel Sambuc   info->release = free;
589*1230fdc1SLionel Sambuc   info->data = malloc(sizeof(int));
590*1230fdc1SLionel Sambuc   if (!info->data)
591*1230fdc1SLionel Sambuc     return 0;
592*1230fdc1SLionel Sambuc   *(int *)info->data = cp;
593*1230fdc1SLionel Sambuc   return 1;
594*1230fdc1SLionel Sambuc }
595*1230fdc1SLionel Sambuc 
596*1230fdc1SLionel Sambuc static int XMLCALL
notStandalone(void * userData)597*1230fdc1SLionel Sambuc notStandalone(void *userData)
598*1230fdc1SLionel Sambuc {
599*1230fdc1SLionel Sambuc   return 0;
600*1230fdc1SLionel Sambuc }
601*1230fdc1SLionel Sambuc 
602*1230fdc1SLionel Sambuc static void
showVersion(XML_Char * prog)603*1230fdc1SLionel Sambuc showVersion(XML_Char *prog)
604*1230fdc1SLionel Sambuc {
605*1230fdc1SLionel Sambuc   XML_Char *s = prog;
606*1230fdc1SLionel Sambuc   XML_Char ch;
607*1230fdc1SLionel Sambuc   const XML_Feature *features = XML_GetFeatureList();
608*1230fdc1SLionel Sambuc   while ((ch = *s) != 0) {
609*1230fdc1SLionel Sambuc     if (ch == '/'
610*1230fdc1SLionel Sambuc #if (defined(WIN32) || defined(__WATCOMC__))
611*1230fdc1SLionel Sambuc         || ch == '\\'
612*1230fdc1SLionel Sambuc #endif
613*1230fdc1SLionel Sambuc         )
614*1230fdc1SLionel Sambuc       prog = s + 1;
615*1230fdc1SLionel Sambuc     ++s;
616*1230fdc1SLionel Sambuc   }
617*1230fdc1SLionel Sambuc   ftprintf(stdout, T("%s using %s\n"), prog, XML_ExpatVersion());
618*1230fdc1SLionel Sambuc   if (features != NULL && features[0].feature != XML_FEATURE_END) {
619*1230fdc1SLionel Sambuc     int i = 1;
620*1230fdc1SLionel Sambuc     ftprintf(stdout, T("%s"), features[0].name);
621*1230fdc1SLionel Sambuc     if (features[0].value)
622*1230fdc1SLionel Sambuc       ftprintf(stdout, T("=%ld"), features[0].value);
623*1230fdc1SLionel Sambuc     while (features[i].feature != XML_FEATURE_END) {
624*1230fdc1SLionel Sambuc       ftprintf(stdout, T(", %s"), features[i].name);
625*1230fdc1SLionel Sambuc       if (features[i].value)
626*1230fdc1SLionel Sambuc         ftprintf(stdout, T("=%ld"), features[i].value);
627*1230fdc1SLionel Sambuc       ++i;
628*1230fdc1SLionel Sambuc     }
629*1230fdc1SLionel Sambuc     ftprintf(stdout, T("\n"));
630*1230fdc1SLionel Sambuc   }
631*1230fdc1SLionel Sambuc }
632*1230fdc1SLionel Sambuc 
633*1230fdc1SLionel Sambuc static void
usage(const XML_Char * prog,int rc)634*1230fdc1SLionel Sambuc usage(const XML_Char *prog, int rc)
635*1230fdc1SLionel Sambuc {
636*1230fdc1SLionel Sambuc   ftprintf(stderr,
637*1230fdc1SLionel Sambuc            T("usage: %s [-n] [-p] [-r] [-s] [-w] [-x] [-d output-dir] "
638*1230fdc1SLionel Sambuc              "[-e encoding] file ...\n"), prog);
639*1230fdc1SLionel Sambuc   exit(rc);
640*1230fdc1SLionel Sambuc }
641*1230fdc1SLionel Sambuc 
642*1230fdc1SLionel Sambuc int
tmain(int argc,XML_Char ** argv)643*1230fdc1SLionel Sambuc tmain(int argc, XML_Char **argv)
644*1230fdc1SLionel Sambuc {
645*1230fdc1SLionel Sambuc   int i, j;
646*1230fdc1SLionel Sambuc   const XML_Char *outputDir = NULL;
647*1230fdc1SLionel Sambuc   const XML_Char *encoding = NULL;
648*1230fdc1SLionel Sambuc   unsigned processFlags = XML_MAP_FILE;
649*1230fdc1SLionel Sambuc   int windowsCodePages = 0;
650*1230fdc1SLionel Sambuc   int outputType = 0;
651*1230fdc1SLionel Sambuc   int useNamespaces = 0;
652*1230fdc1SLionel Sambuc   int requireStandalone = 0;
653*1230fdc1SLionel Sambuc   enum XML_ParamEntityParsing paramEntityParsing =
654*1230fdc1SLionel Sambuc     XML_PARAM_ENTITY_PARSING_NEVER;
655*1230fdc1SLionel Sambuc   int useStdin = 0;
656*1230fdc1SLionel Sambuc 
657*1230fdc1SLionel Sambuc #ifdef _MSC_VER
658*1230fdc1SLionel Sambuc   _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
659*1230fdc1SLionel Sambuc #endif
660*1230fdc1SLionel Sambuc 
661*1230fdc1SLionel Sambuc   i = 1;
662*1230fdc1SLionel Sambuc   j = 0;
663*1230fdc1SLionel Sambuc   while (i < argc) {
664*1230fdc1SLionel Sambuc     if (j == 0) {
665*1230fdc1SLionel Sambuc       if (argv[i][0] != T('-'))
666*1230fdc1SLionel Sambuc         break;
667*1230fdc1SLionel Sambuc       if (argv[i][1] == T('-') && argv[i][2] == T('\0')) {
668*1230fdc1SLionel Sambuc         i++;
669*1230fdc1SLionel Sambuc         break;
670*1230fdc1SLionel Sambuc       }
671*1230fdc1SLionel Sambuc       j++;
672*1230fdc1SLionel Sambuc     }
673*1230fdc1SLionel Sambuc     switch (argv[i][j]) {
674*1230fdc1SLionel Sambuc     case T('r'):
675*1230fdc1SLionel Sambuc       processFlags &= ~XML_MAP_FILE;
676*1230fdc1SLionel Sambuc       j++;
677*1230fdc1SLionel Sambuc       break;
678*1230fdc1SLionel Sambuc     case T('s'):
679*1230fdc1SLionel Sambuc       requireStandalone = 1;
680*1230fdc1SLionel Sambuc       j++;
681*1230fdc1SLionel Sambuc       break;
682*1230fdc1SLionel Sambuc     case T('n'):
683*1230fdc1SLionel Sambuc       useNamespaces = 1;
684*1230fdc1SLionel Sambuc       j++;
685*1230fdc1SLionel Sambuc       break;
686*1230fdc1SLionel Sambuc     case T('p'):
687*1230fdc1SLionel Sambuc       paramEntityParsing = XML_PARAM_ENTITY_PARSING_ALWAYS;
688*1230fdc1SLionel Sambuc       /* fall through */
689*1230fdc1SLionel Sambuc     case T('x'):
690*1230fdc1SLionel Sambuc       processFlags |= XML_EXTERNAL_ENTITIES;
691*1230fdc1SLionel Sambuc       j++;
692*1230fdc1SLionel Sambuc       break;
693*1230fdc1SLionel Sambuc     case T('w'):
694*1230fdc1SLionel Sambuc       windowsCodePages = 1;
695*1230fdc1SLionel Sambuc       j++;
696*1230fdc1SLionel Sambuc       break;
697*1230fdc1SLionel Sambuc     case T('m'):
698*1230fdc1SLionel Sambuc       outputType = 'm';
699*1230fdc1SLionel Sambuc       j++;
700*1230fdc1SLionel Sambuc       break;
701*1230fdc1SLionel Sambuc     case T('c'):
702*1230fdc1SLionel Sambuc       outputType = 'c';
703*1230fdc1SLionel Sambuc       useNamespaces = 0;
704*1230fdc1SLionel Sambuc       j++;
705*1230fdc1SLionel Sambuc       break;
706*1230fdc1SLionel Sambuc     case T('t'):
707*1230fdc1SLionel Sambuc       outputType = 't';
708*1230fdc1SLionel Sambuc       j++;
709*1230fdc1SLionel Sambuc       break;
710*1230fdc1SLionel Sambuc     case T('d'):
711*1230fdc1SLionel Sambuc       if (argv[i][j + 1] == T('\0')) {
712*1230fdc1SLionel Sambuc         if (++i == argc)
713*1230fdc1SLionel Sambuc           usage(argv[0], 2);
714*1230fdc1SLionel Sambuc         outputDir = argv[i];
715*1230fdc1SLionel Sambuc       }
716*1230fdc1SLionel Sambuc       else
717*1230fdc1SLionel Sambuc         outputDir = argv[i] + j + 1;
718*1230fdc1SLionel Sambuc       i++;
719*1230fdc1SLionel Sambuc       j = 0;
720*1230fdc1SLionel Sambuc       break;
721*1230fdc1SLionel Sambuc     case T('e'):
722*1230fdc1SLionel Sambuc       if (argv[i][j + 1] == T('\0')) {
723*1230fdc1SLionel Sambuc         if (++i == argc)
724*1230fdc1SLionel Sambuc           usage(argv[0], 2);
725*1230fdc1SLionel Sambuc         encoding = argv[i];
726*1230fdc1SLionel Sambuc       }
727*1230fdc1SLionel Sambuc       else
728*1230fdc1SLionel Sambuc         encoding = argv[i] + j + 1;
729*1230fdc1SLionel Sambuc       i++;
730*1230fdc1SLionel Sambuc       j = 0;
731*1230fdc1SLionel Sambuc       break;
732*1230fdc1SLionel Sambuc     case T('h'):
733*1230fdc1SLionel Sambuc       usage(argv[0], 0);
734*1230fdc1SLionel Sambuc       return 0;
735*1230fdc1SLionel Sambuc     case T('v'):
736*1230fdc1SLionel Sambuc       showVersion(argv[0]);
737*1230fdc1SLionel Sambuc       return 0;
738*1230fdc1SLionel Sambuc     case T('\0'):
739*1230fdc1SLionel Sambuc       if (j > 1) {
740*1230fdc1SLionel Sambuc         i++;
741*1230fdc1SLionel Sambuc         j = 0;
742*1230fdc1SLionel Sambuc         break;
743*1230fdc1SLionel Sambuc       }
744*1230fdc1SLionel Sambuc       /* fall through */
745*1230fdc1SLionel Sambuc     default:
746*1230fdc1SLionel Sambuc       usage(argv[0], 2);
747*1230fdc1SLionel Sambuc     }
748*1230fdc1SLionel Sambuc   }
749*1230fdc1SLionel Sambuc   if (i == argc) {
750*1230fdc1SLionel Sambuc     useStdin = 1;
751*1230fdc1SLionel Sambuc     processFlags &= ~XML_MAP_FILE;
752*1230fdc1SLionel Sambuc     i--;
753*1230fdc1SLionel Sambuc   }
754*1230fdc1SLionel Sambuc   for (; i < argc; i++) {
755*1230fdc1SLionel Sambuc     FILE *fp = 0;
756*1230fdc1SLionel Sambuc     XML_Char *outName = 0;
757*1230fdc1SLionel Sambuc     int result;
758*1230fdc1SLionel Sambuc     XML_Parser parser;
759*1230fdc1SLionel Sambuc     if (useNamespaces)
760*1230fdc1SLionel Sambuc       parser = XML_ParserCreateNS(encoding, NSSEP);
761*1230fdc1SLionel Sambuc     else
762*1230fdc1SLionel Sambuc       parser = XML_ParserCreate(encoding);
763*1230fdc1SLionel Sambuc     if (requireStandalone)
764*1230fdc1SLionel Sambuc       XML_SetNotStandaloneHandler(parser, notStandalone);
765*1230fdc1SLionel Sambuc     XML_SetParamEntityParsing(parser, paramEntityParsing);
766*1230fdc1SLionel Sambuc     if (outputType == 't') {
767*1230fdc1SLionel Sambuc       /* This is for doing timings; this gives a more realistic estimate of
768*1230fdc1SLionel Sambuc          the parsing time. */
769*1230fdc1SLionel Sambuc       outputDir = 0;
770*1230fdc1SLionel Sambuc       XML_SetElementHandler(parser, nopStartElement, nopEndElement);
771*1230fdc1SLionel Sambuc       XML_SetCharacterDataHandler(parser, nopCharacterData);
772*1230fdc1SLionel Sambuc       XML_SetProcessingInstructionHandler(parser, nopProcessingInstruction);
773*1230fdc1SLionel Sambuc     }
774*1230fdc1SLionel Sambuc     else if (outputDir) {
775*1230fdc1SLionel Sambuc       const XML_Char * delim = T("/");
776*1230fdc1SLionel Sambuc       const XML_Char *file = useStdin ? T("STDIN") : argv[i];
777*1230fdc1SLionel Sambuc       if (!useStdin) {
778*1230fdc1SLionel Sambuc         /* Jump after last (back)slash */
779*1230fdc1SLionel Sambuc         const XML_Char * lastDelim = tcsrchr(file, delim[0]);
780*1230fdc1SLionel Sambuc         if (lastDelim)
781*1230fdc1SLionel Sambuc           file = lastDelim + 1;
782*1230fdc1SLionel Sambuc #if (defined(WIN32) || defined(__WATCOMC__))
783*1230fdc1SLionel Sambuc         else {
784*1230fdc1SLionel Sambuc           const XML_Char * winDelim = T("\\");
785*1230fdc1SLionel Sambuc           lastDelim = tcsrchr(file, winDelim[0]);
786*1230fdc1SLionel Sambuc           if (lastDelim) {
787*1230fdc1SLionel Sambuc             file = lastDelim + 1;
788*1230fdc1SLionel Sambuc             delim = winDelim;
789*1230fdc1SLionel Sambuc           }
790*1230fdc1SLionel Sambuc         }
791*1230fdc1SLionel Sambuc #endif
792*1230fdc1SLionel Sambuc       }
793*1230fdc1SLionel Sambuc       outName = (XML_Char *)malloc((tcslen(outputDir) + tcslen(file) + 2)
794*1230fdc1SLionel Sambuc                        * sizeof(XML_Char));
795*1230fdc1SLionel Sambuc       tcscpy(outName, outputDir);
796*1230fdc1SLionel Sambuc       tcscat(outName, delim);
797*1230fdc1SLionel Sambuc       tcscat(outName, file);
798*1230fdc1SLionel Sambuc       fp = tfopen(outName, T("wb"));
799*1230fdc1SLionel Sambuc       if (!fp) {
800*1230fdc1SLionel Sambuc         tperror(outName);
801*1230fdc1SLionel Sambuc         exit(1);
802*1230fdc1SLionel Sambuc       }
803*1230fdc1SLionel Sambuc       setvbuf(fp, NULL, _IOFBF, 16384);
804*1230fdc1SLionel Sambuc #ifdef XML_UNICODE
805*1230fdc1SLionel Sambuc       puttc(0xFEFF, fp);
806*1230fdc1SLionel Sambuc #endif
807*1230fdc1SLionel Sambuc       XML_SetUserData(parser, fp);
808*1230fdc1SLionel Sambuc       switch (outputType) {
809*1230fdc1SLionel Sambuc       case 'm':
810*1230fdc1SLionel Sambuc         XML_UseParserAsHandlerArg(parser);
811*1230fdc1SLionel Sambuc         XML_SetElementHandler(parser, metaStartElement, metaEndElement);
812*1230fdc1SLionel Sambuc         XML_SetProcessingInstructionHandler(parser, metaProcessingInstruction);
813*1230fdc1SLionel Sambuc         XML_SetCommentHandler(parser, metaComment);
814*1230fdc1SLionel Sambuc         XML_SetCdataSectionHandler(parser, metaStartCdataSection,
815*1230fdc1SLionel Sambuc                                    metaEndCdataSection);
816*1230fdc1SLionel Sambuc         XML_SetCharacterDataHandler(parser, metaCharacterData);
817*1230fdc1SLionel Sambuc         XML_SetDoctypeDeclHandler(parser, metaStartDoctypeDecl,
818*1230fdc1SLionel Sambuc                                   metaEndDoctypeDecl);
819*1230fdc1SLionel Sambuc         XML_SetEntityDeclHandler(parser, metaEntityDecl);
820*1230fdc1SLionel Sambuc         XML_SetNotationDeclHandler(parser, metaNotationDecl);
821*1230fdc1SLionel Sambuc         XML_SetNamespaceDeclHandler(parser, metaStartNamespaceDecl,
822*1230fdc1SLionel Sambuc                                     metaEndNamespaceDecl);
823*1230fdc1SLionel Sambuc         metaStartDocument(parser);
824*1230fdc1SLionel Sambuc         break;
825*1230fdc1SLionel Sambuc       case 'c':
826*1230fdc1SLionel Sambuc         XML_UseParserAsHandlerArg(parser);
827*1230fdc1SLionel Sambuc         XML_SetDefaultHandler(parser, markup);
828*1230fdc1SLionel Sambuc         XML_SetElementHandler(parser, defaultStartElement, defaultEndElement);
829*1230fdc1SLionel Sambuc         XML_SetCharacterDataHandler(parser, defaultCharacterData);
830*1230fdc1SLionel Sambuc         XML_SetProcessingInstructionHandler(parser,
831*1230fdc1SLionel Sambuc                                             defaultProcessingInstruction);
832*1230fdc1SLionel Sambuc         break;
833*1230fdc1SLionel Sambuc       default:
834*1230fdc1SLionel Sambuc         if (useNamespaces)
835*1230fdc1SLionel Sambuc           XML_SetElementHandler(parser, startElementNS, endElementNS);
836*1230fdc1SLionel Sambuc         else
837*1230fdc1SLionel Sambuc           XML_SetElementHandler(parser, startElement, endElement);
838*1230fdc1SLionel Sambuc         XML_SetCharacterDataHandler(parser, characterData);
839*1230fdc1SLionel Sambuc #ifndef W3C14N
840*1230fdc1SLionel Sambuc         XML_SetProcessingInstructionHandler(parser, processingInstruction);
841*1230fdc1SLionel Sambuc #endif /* not W3C14N */
842*1230fdc1SLionel Sambuc         break;
843*1230fdc1SLionel Sambuc       }
844*1230fdc1SLionel Sambuc     }
845*1230fdc1SLionel Sambuc     if (windowsCodePages)
846*1230fdc1SLionel Sambuc       XML_SetUnknownEncodingHandler(parser, unknownEncoding, 0);
847*1230fdc1SLionel Sambuc     result = XML_ProcessFile(parser, useStdin ? NULL : argv[i], processFlags);
848*1230fdc1SLionel Sambuc     if (outputDir) {
849*1230fdc1SLionel Sambuc       if (outputType == 'm')
850*1230fdc1SLionel Sambuc         metaEndDocument(parser);
851*1230fdc1SLionel Sambuc       fclose(fp);
852*1230fdc1SLionel Sambuc       if (!result) {
853*1230fdc1SLionel Sambuc         tremove(outName);
854*1230fdc1SLionel Sambuc         exit(2);
855*1230fdc1SLionel Sambuc       }
856*1230fdc1SLionel Sambuc       free(outName);
857*1230fdc1SLionel Sambuc     }
858*1230fdc1SLionel Sambuc     XML_ParserFree(parser);
859*1230fdc1SLionel Sambuc   }
860*1230fdc1SLionel Sambuc   return 0;
861*1230fdc1SLionel Sambuc }
862