libexpat/expat/xmlwf/xmlwf.c

760 lines
17 KiB
C
Raw Normal View History

/*
Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
See the file COPYING for copying permission.
*/
1998-04-05 11:11:29 -04:00
1997-11-11 00:52:10 -05:00
#include <stdio.h>
1998-02-04 00:25:27 -05:00
#include <stdlib.h>
1998-02-04 02:20:46 -05:00
#include <stddef.h>
1997-12-10 02:44:19 -05:00
#include <string.h>
1998-02-04 00:25:27 -05:00
#include "expat.h"
#include "codepage.h"
#include "xmlfile.h"
#include "xmltchar.h"
1998-02-04 00:25:27 -05:00
#ifdef _MSC_VER
#include <crtdbg.h>
#endif
1997-11-11 00:52:10 -05:00
/* This ensures proper sorting. */
#define NSSEP T('\001')
1998-08-26 05:10:50 -04:00
1998-05-31 07:53:28 -04:00
static void characterData(void *userData, const XML_Char *s, int len)
1998-02-04 00:25:27 -05:00
{
FILE *fp = userData;
for (; len > 0; --len, ++s) {
switch (*s) {
1998-05-31 07:53:28 -04:00
case T('&'):
fputts(T("&amp;"), fp);
1998-02-04 00:25:27 -05:00
break;
1998-05-31 07:53:28 -04:00
case T('<'):
fputts(T("&lt;"), fp);
1998-02-04 00:25:27 -05:00
break;
1998-05-31 07:53:28 -04:00
case T('>'):
fputts(T("&gt;"), fp);
1998-02-04 00:25:27 -05:00
break;
#ifdef W3C14N
case 13:
fputts(T("&#xD;"), fp);
break;
#else
1998-05-31 07:53:28 -04:00
case T('"'):
fputts(T("&quot;"), fp);
1998-02-04 00:25:27 -05:00
break;
case 9:
case 10:
case 13:
1998-05-31 07:53:28 -04:00
ftprintf(fp, T("&#%d;"), *s);
1998-02-04 00:25:27 -05:00
break;
#endif
1998-02-04 00:25:27 -05:00
default:
1998-05-31 07:53:28 -04:00
puttc(*s, fp);
1998-02-04 00:25:27 -05:00
break;
}
}
}
static void attributeValue(FILE *fp, const XML_Char *s)
{
puttc(T('='), fp);
puttc(T('"'), fp);
for (;;) {
switch (*s) {
case 0:
case NSSEP:
puttc(T('"'), fp);
return;
case T('&'):
fputts(T("&amp;"), fp);
break;
case T('<'):
fputts(T("&lt;"), fp);
break;
case T('"'):
fputts(T("&quot;"), fp);
break;
#ifdef W3C14N
case 9:
fputts(T("&#x9;"), fp);
break;
case 10:
fputts(T("&#xA;"), fp);
break;
case 13:
fputts(T("&#xD;"), fp);
break;
#else
case T('>'):
fputts(T("&gt;"), fp);
break;
case 9:
case 10:
case 13:
ftprintf(fp, T("&#%d;"), *s);
break;
#endif
default:
puttc(*s, fp);
break;
}
s++;
}
}
/* Lexicographically comparing UTF-8 encoded attribute values,
1998-02-04 00:25:27 -05:00
is equivalent to lexicographically comparing based on the character number. */
static int attcmp(const void *att1, const void *att2)
{
1998-05-31 07:53:28 -04:00
return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2);
1998-02-04 00:25:27 -05:00
}
1998-05-31 07:53:28 -04:00
static void startElement(void *userData, const XML_Char *name, const XML_Char **atts)
1998-02-04 00:25:27 -05:00
{
int nAtts;
1998-05-31 07:53:28 -04:00
const XML_Char **p;
1998-02-04 00:25:27 -05:00
FILE *fp = userData;
1998-05-31 07:53:28 -04:00
puttc(T('<'), fp);
fputts(name, fp);
1998-02-04 00:25:27 -05:00
p = atts;
while (*p)
++p;
nAtts = (p - atts) >> 1;
if (nAtts > 1)
1998-05-31 07:53:28 -04:00
qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, attcmp);
1998-02-04 00:25:27 -05:00
while (*atts) {
1998-05-31 07:53:28 -04:00
puttc(T(' '), fp);
fputts(*atts++, fp);
attributeValue(fp, *atts);
1998-02-04 00:25:27 -05:00
atts++;
}
1998-05-31 07:53:28 -04:00
puttc(T('>'), fp);
1998-02-04 00:25:27 -05:00
}
1998-05-31 07:53:28 -04:00
static void endElement(void *userData, const XML_Char *name)
1998-02-04 00:25:27 -05:00
{
FILE *fp = userData;
1998-05-31 07:53:28 -04:00
puttc(T('<'), fp);
puttc(T('/'), fp);
fputts(name, fp);
puttc(T('>'), fp);
1998-02-04 00:25:27 -05:00
}
static int nsattcmp(const void *p1, const void *p2)
{
const XML_Char *att1 = *(const XML_Char **)p1;
const XML_Char *att2 = *(const XML_Char **)p2;
int sep1 = (tcsrchr(att1, NSSEP) != 0);
int sep2 = (tcsrchr(att1, NSSEP) != 0);
if (sep1 != sep2)
return sep1 - sep2;
return tcscmp(att1, att2);
}
1998-08-26 05:10:50 -04:00
static void startElementNS(void *userData, const XML_Char *name, const XML_Char **atts)
{
int nAtts;
int nsi;
const XML_Char **p;
FILE *fp = userData;
const XML_Char *sep;
puttc(T('<'), fp);
sep = tcsrchr(name, NSSEP);
if (sep) {
fputts(T("n1:"), fp);
1998-08-26 05:10:50 -04:00
fputts(sep + 1, fp);
fputts(T(" xmlns:n1"), fp);
attributeValue(fp, name);
nsi = 2;
1998-08-26 05:10:50 -04:00
}
else {
fputts(name, fp);
nsi = 1;
1998-08-26 05:10:50 -04:00
}
p = atts;
while (*p)
++p;
nAtts = (p - atts) >> 1;
if (nAtts > 1)
qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, nsattcmp);
1998-08-26 05:10:50 -04:00
while (*atts) {
name = *atts++;
sep = tcsrchr(name, NSSEP);
puttc(T(' '), fp);
1998-08-26 05:10:50 -04:00
if (sep) {
ftprintf(fp, T("n%d:"), nsi);
fputts(sep + 1, fp);
1998-08-26 05:10:50 -04:00
}
else
fputts(name, fp);
attributeValue(fp, *atts);
if (sep) {
ftprintf(fp, T(" xmlns:n%d"), nsi++);
attributeValue(fp, name);
}
1998-08-26 05:10:50 -04:00
atts++;
}
puttc(T('>'), fp);
}
static void endElementNS(void *userData, const XML_Char *name)
{
FILE *fp = userData;
const XML_Char *sep;
puttc(T('<'), fp);
puttc(T('/'), fp);
sep = tcsrchr(name, NSSEP);
if (sep) {
fputts(T("n1:"), fp);
1998-08-26 05:10:50 -04:00
fputts(sep + 1, fp);
}
else
fputts(name, fp);
puttc(T('>'), fp);
}
#ifndef W3C14N
1998-05-31 07:53:28 -04:00
static void processingInstruction(void *userData, const XML_Char *target, const XML_Char *data)
1998-02-04 00:25:27 -05:00
{
FILE *fp = userData;
1998-05-31 07:53:28 -04:00
puttc(T('<'), fp);
puttc(T('?'), fp);
fputts(target, fp);
puttc(T(' '), fp);
fputts(data, fp);
puttc(T('?'), fp);
puttc(T('>'), fp);
1998-02-04 00:25:27 -05:00
}
#endif /* not W3C14N */
1998-06-21 02:53:13 -04:00
static void defaultCharacterData(XML_Parser parser, const XML_Char *s, int len)
1998-06-17 06:04:31 -04:00
{
1998-06-21 02:53:13 -04:00
XML_DefaultCurrent(parser);
}
static void defaultStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts)
{
XML_DefaultCurrent(parser);
}
static void defaultEndElement(XML_Parser parser, const XML_Char *name)
{
XML_DefaultCurrent(parser);
}
static void defaultProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data)
{
XML_DefaultCurrent(parser);
}
1998-11-24 10:24:59 -05:00
static void nopCharacterData(XML_Parser parser, const XML_Char *s, int len)
{
}
static void nopStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts)
{
}
static void nopEndElement(XML_Parser parser, const XML_Char *name)
{
}
static void nopProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data)
{
}
1998-06-21 02:53:13 -04:00
static void markup(XML_Parser parser, const XML_Char *s, int len)
{
FILE *fp = XML_GetUserData(parser);
1998-06-17 06:04:31 -04:00
for (; len > 0; --len, ++s)
1998-06-21 02:53:13 -04:00
puttc(*s, fp);
1998-06-17 06:04:31 -04:00
}
1998-06-03 06:16:20 -04:00
static
void metaLocation(XML_Parser parser)
{
1998-06-03 06:16:20 -04:00
const XML_Char *uri = XML_GetBase(parser);
if (uri)
ftprintf(XML_GetUserData(parser), T(" uri=\"%s\""), uri);
ftprintf(XML_GetUserData(parser),
1999-04-25 07:34:07 -04:00
T(" byte=\"%ld\" nbytes=\"%d\" line=\"%d\" col=\"%d\""),
1998-06-03 06:16:20 -04:00
XML_GetCurrentByteIndex(parser),
1999-04-25 07:34:07 -04:00
XML_GetCurrentByteCount(parser),
1998-06-03 06:16:20 -04:00
XML_GetCurrentLineNumber(parser),
XML_GetCurrentColumnNumber(parser));
}
static
void metaStartDocument(XML_Parser parser)
{
fputts(T("<document>\n"), XML_GetUserData(parser));
}
static
void metaEndDocument(XML_Parser parser)
{
fputts(T("</document>\n"), XML_GetUserData(parser));
}
1998-06-03 06:16:20 -04:00
static
void metaStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts)
{
1998-06-03 06:16:20 -04:00
FILE *fp = XML_GetUserData(parser);
1999-03-25 22:53:05 -05:00
const XML_Char **specifiedAttsEnd
2000-04-14 06:53:33 -04:00
= atts + XML_GetSpecifiedAttributeCount(parser);
const XML_Char **idAttPtr;
int idAttIndex = XML_GetIdAttributeIndex(parser);
if (idAttIndex < 0)
idAttPtr = 0;
else
idAttPtr = atts + idAttIndex;
1998-06-03 06:16:20 -04:00
ftprintf(fp, T("<starttag name=\"%s\""), name);
metaLocation(parser);
if (*atts) {
fputts(T(">\n"), fp);
do {
1998-06-03 06:55:52 -04:00
ftprintf(fp, T("<attribute name=\"%s\" value=\""), atts[0]);
1998-06-03 06:16:20 -04:00
characterData(fp, atts[1], tcslen(atts[1]));
1999-03-25 22:53:05 -05:00
if (atts >= specifiedAttsEnd)
1999-06-26 08:10:00 -04:00
fputts(T("\" defaulted=\"yes\"/>\n"), fp);
2000-04-14 06:53:33 -04:00
else if (atts == idAttPtr)
fputts(T("\" id=\"yes\"/>\n"), fp);
1999-03-25 22:53:05 -05:00
else
fputts(T("\"/>\n"), fp);
1998-06-03 06:16:20 -04:00
} while (*(atts += 2));
fputts(T("</starttag>\n"), fp);
}
else
1998-06-03 06:16:20 -04:00
fputts(T("/>\n"), fp);
}
static
void metaEndElement(XML_Parser parser, const XML_Char *name)
{
FILE *fp = XML_GetUserData(parser);
ftprintf(fp, T("<endtag name=\"%s\""), name);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
1998-06-03 06:16:20 -04:00
static
void metaProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data)
{
FILE *fp = XML_GetUserData(parser);
ftprintf(fp, T("<pi target=\"%s\" data=\""), target);
characterData(fp, data, tcslen(data));
puttc(T('"'), fp);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
1998-09-24 00:12:12 -04:00
static
void metaComment(XML_Parser parser, const XML_Char *data)
{
FILE *fp = XML_GetUserData(parser);
fputts(T("<comment data=\""), fp);
characterData(fp, data, tcslen(data));
puttc(T('"'), fp);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
1998-11-24 00:42:17 -05:00
static
void metaStartCdataSection(XML_Parser parser)
{
FILE *fp = XML_GetUserData(parser);
fputts(T("<startcdata"), fp);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
static
void metaEndCdataSection(XML_Parser parser)
{
FILE *fp = XML_GetUserData(parser);
fputts(T("<endcdata"), fp);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
static
1998-06-03 06:16:20 -04:00
void metaCharacterData(XML_Parser parser, const XML_Char *s, int len)
{
1998-06-03 06:16:20 -04:00
FILE *fp = XML_GetUserData(parser);
fputts(T("<chars str=\""), fp);
characterData(fp, s, len);
puttc(T('"'), fp);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
1999-07-28 05:34:18 -04:00
static
void metaStartDoctypeDecl(XML_Parser parser,
const XML_Char *doctypeName,
const XML_Char *sysid,
const XML_Char *pubid,
int has_internal_subset)
1999-07-28 05:34:18 -04:00
{
FILE *fp = XML_GetUserData(parser);
ftprintf(fp, T("<startdoctype name=\"%s\""), doctypeName);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
static
void metaEndDoctypeDecl(XML_Parser parser)
{
FILE *fp = XML_GetUserData(parser);
fputts(T("<enddoctype"), fp);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
static
1998-06-03 06:16:20 -04:00
void metaNotationDecl(XML_Parser parser,
const XML_Char *notationName,
const XML_Char *base,
const XML_Char *systemId,
const XML_Char *publicId)
{
FILE *fp = XML_GetUserData(parser);
1998-06-03 06:16:20 -04:00
ftprintf(fp, T("<notation name=\"%s\""), notationName);
if (publicId)
ftprintf(fp, T(" public=\"%s\""), publicId);
if (systemId) {
fputts(T(" system=\""), fp);
characterData(fp, systemId, tcslen(systemId));
puttc(T('"'), fp);
}
metaLocation(parser);
fputts(T("/>\n"), fp);
}
2000-05-12 01:56:27 -04:00
static
void metaEntityDecl(XML_Parser parser,
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)
2000-05-12 01:56:27 -04:00
{
FILE *fp = XML_GetUserData(parser);
if (value) {
ftprintf(fp, T("<entity name=\"%s\""), entityName);
metaLocation(parser);
puttc(T('>'), fp);
characterData(fp, value, value_length);
fputts(T("</entity/>\n"), fp);
}
else if (notationName) {
ftprintf(fp, T("<entity name=\"%s\""), entityName);
if (publicId)
ftprintf(fp, T(" public=\"%s\""), publicId);
fputts(T(" system=\""), fp);
characterData(fp, systemId, tcslen(systemId));
puttc(T('"'), fp);
ftprintf(fp, T(" notation=\"%s\""), notationName);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
else {
ftprintf(fp, T("<entity name=\"%s\""), entityName);
if (publicId)
ftprintf(fp, T(" public=\"%s\""), publicId);
fputts(T(" system=\""), fp);
characterData(fp, systemId, tcslen(systemId));
puttc(T('"'), fp);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
2000-05-12 01:56:27 -04:00
}
static
void metaStartNamespaceDecl(XML_Parser parser,
const XML_Char *prefix,
const XML_Char *uri)
{
FILE *fp = XML_GetUserData(parser);
fputts(T("<startns"), fp);
if (prefix)
ftprintf(fp, T(" prefix=\"%s\""), prefix);
if (uri) {
fputts(T(" ns=\""), fp);
characterData(fp, uri, tcslen(uri));
fputts(T("\"/>\n"), fp);
}
else
fputts(T("/>\n"), fp);
}
static
void metaEndNamespaceDecl(XML_Parser parser, const XML_Char *prefix)
{
FILE *fp = XML_GetUserData(parser);
if (!prefix)
fputts(T("<endns/>\n"), fp);
else
ftprintf(fp, T("<endns prefix=\"%s\"/>\n"), prefix);
}
1998-05-10 06:18:15 -04:00
static
int unknownEncodingConvert(void *data, const char *p)
1998-06-02 04:57:14 -04:00
{
return codepageConvert(*(int *)data, p);
}
static
int unknownEncoding(void *userData,
const XML_Char *name,
XML_Encoding *info)
{
int cp;
static const XML_Char prefixL[] = T("windows-");
static const XML_Char prefixU[] = T("WINDOWS-");
int i;
for (i = 0; prefixU[i]; i++)
1998-06-02 04:57:14 -04:00
if (name[i] != prefixU[i] && name[i] != prefixL[i])
return 0;
cp = 0;
1998-06-02 04:57:14 -04:00
for (; name[i]; i++) {
static const XML_Char digits[] = T("0123456789");
1998-06-02 04:57:14 -04:00
const XML_Char *s = tcschr(digits, name[i]);
if (!s)
return 0;
cp *= 10;
cp += s - digits;
if (cp >= 0x10000)
return 0;
}
1998-06-02 04:57:14 -04:00
if (!codepageMap(cp, info->map))
return 0;
info->convert = unknownEncodingConvert;
/* We could just cast the code page integer to a void *,
and avoid the use of release. */
info->release = free;
info->data = malloc(sizeof(int));
if (!info->data)
return 0;
*(int *)info->data = cp;
return 1;
}
1999-04-19 22:52:43 -04:00
static
int notStandalone(void *userData)
{
return 0;
}
1998-02-04 00:25:27 -05:00
static
1998-05-31 07:53:28 -04:00
void usage(const XML_Char *prog)
1998-02-04 00:25:27 -05:00
{
1999-06-26 07:29:49 -04:00
ftprintf(stderr, T("usage: %s [-n] [-p] [-r] [-s] [-w] [-x] [-d output-dir] [-e encoding] file ...\n"), prog);
1998-02-04 00:25:27 -05:00
exit(1);
1997-11-11 00:52:10 -05:00
}
1998-05-31 07:53:28 -04:00
int tmain(int argc, XML_Char **argv)
1997-11-11 00:52:10 -05:00
{
1999-04-19 22:52:43 -04:00
int i, j;
1998-05-31 07:53:28 -04:00
const XML_Char *outputDir = 0;
const XML_Char *encoding = 0;
unsigned processFlags = XML_MAP_FILE;
int windowsCodePages = 0;
1998-06-17 06:04:31 -04:00
int outputType = 0;
1998-08-26 05:10:50 -04:00
int useNamespaces = 0;
1999-04-19 22:52:43 -04:00
int requireStandalone = 0;
1999-06-26 07:29:49 -04:00
int paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
1997-12-10 02:44:19 -05:00
#ifdef _MSC_VER
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
#endif
1997-12-10 02:44:19 -05:00
1998-02-04 00:25:27 -05:00
i = 1;
1999-04-19 22:52:43 -04:00
j = 0;
while (i < argc) {
if (j == 0) {
if (argv[i][0] != T('-'))
break;
if (argv[i][1] == T('-') && argv[i][2] == T('\0')) {
i++;
break;
}
j++;
1998-02-04 00:25:27 -05:00
}
1999-04-19 22:52:43 -04:00
switch (argv[i][j]) {
case T('r'):
processFlags &= ~XML_MAP_FILE;
1998-02-04 00:25:27 -05:00
j++;
1999-04-19 22:52:43 -04:00
break;
case T('s'):
requireStandalone = 1;
j++;
break;
case T('n'):
1998-08-26 05:10:50 -04:00
useNamespaces = 1;
1998-08-22 18:40:45 -04:00
j++;
1999-04-19 22:52:43 -04:00
break;
1999-06-26 07:29:49 -04:00
case T('p'):
paramEntityParsing = XML_PARAM_ENTITY_PARSING_ALWAYS;
/* fall through */
1999-04-19 22:52:43 -04:00
case T('x'):
processFlags |= XML_EXTERNAL_ENTITIES;
1998-05-10 06:18:15 -04:00
j++;
1999-04-19 22:52:43 -04:00
break;
case T('w'):
windowsCodePages = 1;
j++;
1999-04-19 22:52:43 -04:00
break;
case T('m'):
1998-06-17 06:04:31 -04:00
outputType = 'm';
j++;
1999-04-19 22:52:43 -04:00
break;
case T('c'):
1998-06-17 06:04:31 -04:00
outputType = 'c';
1998-08-26 05:10:50 -04:00
useNamespaces = 0;
j++;
1999-04-19 22:52:43 -04:00
break;
case T('t'):
1998-11-24 10:24:59 -05:00
outputType = 't';
j++;
1999-04-19 22:52:43 -04:00
break;
case T('d'):
1998-05-31 07:53:28 -04:00
if (argv[i][j + 1] == T('\0')) {
1998-02-04 00:25:27 -05:00
if (++i == argc)
usage(argv[0]);
outputDir = argv[i];
}
else
outputDir = argv[i] + j + 1;
i++;
1999-04-19 22:52:43 -04:00
j = 0;
break;
case T('e'):
1998-05-31 07:53:28 -04:00
if (argv[i][j + 1] == T('\0')) {
if (++i == argc)
usage(argv[0]);
encoding = argv[i];
}
else
encoding = argv[i] + j + 1;
i++;
1999-04-19 22:52:43 -04:00
j = 0;
break;
case T('\0'):
if (j > 1) {
i++;
j = 0;
break;
}
/* fall through */
default:
1998-02-04 00:25:27 -05:00
usage(argv[0]);
1999-04-19 22:52:43 -04:00
}
1997-11-11 00:52:10 -05:00
}
1998-02-04 00:25:27 -05:00
if (i == argc)
usage(argv[0]);
1997-12-10 02:44:19 -05:00
for (; i < argc; i++) {
1998-02-04 00:25:27 -05:00
FILE *fp = 0;
1998-05-31 07:53:28 -04:00
XML_Char *outName = 0;
1998-02-04 00:25:27 -05:00
int result;
1998-08-26 05:10:50 -04:00
XML_Parser parser;
if (useNamespaces)
parser = XML_ParserCreateNS(encoding, NSSEP);
else
parser = XML_ParserCreate(encoding);
1999-04-19 22:52:43 -04:00
if (requireStandalone)
XML_SetNotStandaloneHandler(parser, notStandalone);
1999-06-26 07:29:49 -04:00
XML_SetParamEntityParsing(parser, paramEntityParsing);
1999-03-07 03:44:14 -05:00
if (outputType == 't') {
/* This is for doing timings; this gives a more realistic estimate of
the parsing time. */
outputDir = 0;
XML_SetElementHandler(parser, nopStartElement, nopEndElement);
XML_SetCharacterDataHandler(parser, nopCharacterData);
XML_SetProcessingInstructionHandler(parser, nopProcessingInstruction);
}
else if (outputDir) {
1998-05-31 07:53:28 -04:00
const XML_Char *file = argv[i];
if (tcsrchr(file, T('/')))
file = tcsrchr(file, T('/')) + 1;
#ifdef WIN32
1998-05-31 07:53:28 -04:00
if (tcsrchr(file, T('\\')))
file = tcsrchr(file, T('\\')) + 1;
#endif
1998-05-31 07:53:28 -04:00
outName = malloc((tcslen(outputDir) + tcslen(file) + 2) * sizeof(XML_Char));
tcscpy(outName, outputDir);
tcscat(outName, T("/"));
tcscat(outName, file);
fp = tfopen(outName, T("wb"));
1998-02-04 00:25:27 -05:00
if (!fp) {
1998-05-31 07:53:28 -04:00
tperror(outName);
1998-02-04 00:25:27 -05:00
exit(1);
}
1998-08-26 05:10:50 -04:00
setvbuf(fp, NULL, _IOFBF, 16384);
1998-05-31 07:53:28 -04:00
#ifdef XML_UNICODE
puttc(0xFEFF, fp);
#endif
1998-02-04 00:25:27 -05:00
XML_SetUserData(parser, fp);
1998-06-17 06:04:31 -04:00
switch (outputType) {
case 'm':
XML_UseParserAsHandlerArg(parser);
XML_SetElementHandler(parser, metaStartElement, metaEndElement);
1998-06-03 06:16:20 -04:00
XML_SetProcessingInstructionHandler(parser, metaProcessingInstruction);
1998-09-24 00:12:12 -04:00
XML_SetCommentHandler(parser, metaComment);
1998-11-24 00:42:17 -05:00
XML_SetCdataSectionHandler(parser, metaStartCdataSection, metaEndCdataSection);
1998-06-03 06:16:20 -04:00
XML_SetCharacterDataHandler(parser, metaCharacterData);
1999-07-28 05:34:18 -04:00
XML_SetDoctypeDeclHandler(parser, metaStartDoctypeDecl, metaEndDoctypeDecl);
XML_SetEntityDeclHandler(parser, metaEntityDecl);
1998-06-03 06:16:20 -04:00
XML_SetNotationDeclHandler(parser, metaNotationDecl);
XML_SetNamespaceDeclHandler(parser, metaStartNamespaceDecl, metaEndNamespaceDecl);
metaStartDocument(parser);
1998-06-17 06:04:31 -04:00
break;
case 'c':
1998-06-21 02:53:13 -04:00
XML_UseParserAsHandlerArg(parser);
1998-06-17 06:04:31 -04:00
XML_SetDefaultHandler(parser, markup);
1998-06-21 02:53:13 -04:00
XML_SetElementHandler(parser, defaultStartElement, defaultEndElement);
XML_SetCharacterDataHandler(parser, defaultCharacterData);
XML_SetProcessingInstructionHandler(parser, defaultProcessingInstruction);
1998-06-17 06:04:31 -04:00
break;
default:
1998-08-26 05:10:50 -04:00
if (useNamespaces)
XML_SetElementHandler(parser, startElementNS, endElementNS);
else
XML_SetElementHandler(parser, startElement, endElement);
XML_SetCharacterDataHandler(parser, characterData);
#ifndef W3C14N
XML_SetProcessingInstructionHandler(parser, processingInstruction);
#endif /* not W3C14N */
1998-06-17 06:04:31 -04:00
break;
}
}
if (windowsCodePages)
1998-06-02 04:57:14 -04:00
XML_SetUnknownEncodingHandler(parser, unknownEncoding, 0);
result = XML_ProcessFile(parser, argv[i], processFlags);
1998-02-04 00:25:27 -05:00
if (outputDir) {
1998-06-17 06:04:31 -04:00
if (outputType == 'm')
metaEndDocument(parser);
1998-02-04 00:25:27 -05:00
fclose(fp);
if (!result)
1998-05-31 07:53:28 -04:00
tremove(outName);
1998-02-04 00:25:27 -05:00
free(outName);
}
XML_ParserFree(parser);
1997-11-11 00:52:10 -05:00
}
1998-02-04 00:25:27 -05:00
return 0;
1997-11-11 00:52:10 -05:00
}