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("&"), fp);
35*1230fdc1SLionel Sambuc break;
36*1230fdc1SLionel Sambuc case T('<'):
37*1230fdc1SLionel Sambuc fputts(T("<"), fp);
38*1230fdc1SLionel Sambuc break;
39*1230fdc1SLionel Sambuc case T('>'):
40*1230fdc1SLionel Sambuc fputts(T(">"), fp);
41*1230fdc1SLionel Sambuc break;
42*1230fdc1SLionel Sambuc #ifdef W3C14N
43*1230fdc1SLionel Sambuc case 13:
44*1230fdc1SLionel Sambuc fputts(T("
"), fp);
45*1230fdc1SLionel Sambuc break;
46*1230fdc1SLionel Sambuc #else
47*1230fdc1SLionel Sambuc case T('"'):
48*1230fdc1SLionel Sambuc fputts(T("""), 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("&"), fp);
76*1230fdc1SLionel Sambuc break;
77*1230fdc1SLionel Sambuc case T('<'):
78*1230fdc1SLionel Sambuc fputts(T("<"), fp);
79*1230fdc1SLionel Sambuc break;
80*1230fdc1SLionel Sambuc case T('"'):
81*1230fdc1SLionel Sambuc fputts(T("""), fp);
82*1230fdc1SLionel Sambuc break;
83*1230fdc1SLionel Sambuc #ifdef W3C14N
84*1230fdc1SLionel Sambuc case 9:
85*1230fdc1SLionel Sambuc fputts(T("	"), fp);
86*1230fdc1SLionel Sambuc break;
87*1230fdc1SLionel Sambuc case 10:
88*1230fdc1SLionel Sambuc fputts(T("
"), fp);
89*1230fdc1SLionel Sambuc break;
90*1230fdc1SLionel Sambuc case 13:
91*1230fdc1SLionel Sambuc fputts(T("
"), fp);
92*1230fdc1SLionel Sambuc break;
93*1230fdc1SLionel Sambuc #else
94*1230fdc1SLionel Sambuc case T('>'):
95*1230fdc1SLionel Sambuc fputts(T(">"), 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