-/*
-Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
-See the file COPYING for copying permission.
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
*/
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <fcntl.h>
+#ifdef COMPILED_FROM_DSP
+#include "winconfig.h"
+#else
+#include "expat_config.h"
+#endif
#include "expat.h"
#include "xmlfile.h"
#include "xmltchar.h"
#include <io.h>
#endif
-#ifdef _POSIX_SOURCE
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#endif
-
typedef struct {
XML_Parser parser;
int *retPtr;
} PROCESS_ARGS;
-static
-void reportError(XML_Parser parser, const XML_Char *filename)
+static void
+reportError(XML_Parser parser, const XML_Char *filename)
+ /*@globals fileSystem @*/
+ /*@modifies parser, fileSystem @*/
{
int code = XML_GetErrorCode(parser);
const XML_Char *message = XML_ErrorString(code);
if (message)
ftprintf(stdout, T("%s:%d:%d: %s\n"),
- filename,
- XML_GetErrorLineNumber(parser),
- XML_GetErrorColumnNumber(parser),
- message);
+ filename,
+ XML_GetErrorLineNumber(parser),
+ XML_GetErrorColumnNumber(parser),
+ message);
else
ftprintf(stderr, T("%s: (unknown message %d)\n"), filename, code);
}
-static
-void processFile(const void *data,
- size_t size,
- const XML_Char *filename,
- void *args)
+static void
+processFile(const void *data, size_t size,
+ const XML_Char *filename, void *args)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/
{
XML_Parser parser = ((PROCESS_ARGS *)args)->parser;
int *retPtr = ((PROCESS_ARGS *)args)->retPtr;
- if (!XML_Parse(parser, data, size, 1)) {
+ if (XML_Parse(parser, data, size, 1) == XML_STATUS_ERROR) {
reportError(parser, filename);
*retPtr = 0;
}
#ifdef WIN32
-static
-int isAsciiLetter(XML_Char c)
+static int
+isAsciiLetter(XML_Char c)
+ /*@*/
{
return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z'));
}
#endif /* WIN32 */
-static
-const XML_Char *resolveSystemId(const XML_Char *base, const XML_Char *systemId, XML_Char **toFree)
+static const XML_Char *
+resolveSystemId(const XML_Char *base, const XML_Char *systemId,
+ XML_Char **toFree)
+ /*@modifies *toFree @*/
{
XML_Char *s;
*toFree = 0;
#endif
)
return systemId;
- *toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2)*sizeof(XML_Char));
+ *toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2)
+ * sizeof(XML_Char));
if (!*toFree)
return systemId;
tcscpy(*toFree, base);
return *toFree;
}
-static
-int externalEntityRefFilemap(XML_Parser parser,
- const XML_Char *context,
- const XML_Char *base,
- const XML_Char *systemId,
- const XML_Char *publicId)
+static int
+externalEntityRefFilemap(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId)
+ /*@globals fileSystem, internalState @*/
+ /*@modifies fileSystem, internalState @*/
{
int result;
XML_Char *s;
args.retPtr = &result;
args.parser = entParser;
filename = resolveSystemId(base, systemId, &s);
- XML_SetBase(entParser, filename);
+ (void) XML_SetBase(entParser, filename);
if (!filemap(filename, processFile, &args))
result = 0;
free(s);
return result;
}
-static
-int processStream(const XML_Char *filename, XML_Parser parser)
+static int
+processStream(const XML_Char *filename, XML_Parser parser)
+ /*@globals fileSystem, internalState @*/
+ /*@modifies parser, fileSystem, internalState @*/
{
- int fd = topen(filename, O_BINARY|O_RDONLY);
- if (fd < 0) {
- tperror(filename);
- return 0;
+ /* passing NULL for filename means read intput from stdin */
+ int fd = 0; /* 0 is the fileno for stdin */
+
+ if (filename != NULL) {
+ fd = topen(filename, O_BINARY|O_RDONLY);
+ if (fd < 0) {
+ tperror(filename);
+ return 0;
+ }
}
for (;;) {
int nread;
char *buf = XML_GetBuffer(parser, READ_SIZE);
if (!buf) {
- close(fd);
- ftprintf(stderr, T("%s: out of memory\n"), filename);
+ if (filename != NULL)
+ close(fd);
+ ftprintf(stderr, T("%s: out of memory\n"),
+ filename != NULL ? filename : "xmlwf");
return 0;
}
nread = read(fd, buf, READ_SIZE);
if (nread < 0) {
- tperror(filename);
- close(fd);
+ tperror(filename != NULL ? filename : "STDIN");
+ if (filename != NULL)
+ close(fd);
return 0;
}
- if (!XML_ParseBuffer(parser, nread, nread == 0)) {
- reportError(parser, filename);
- close(fd);
+ if (XML_ParseBuffer(parser, nread, nread == 0) == XML_STATUS_ERROR) {
+ reportError(parser, filename != NULL ? filename : "STDIN");
+ if (filename != NULL)
+ close(fd);
return 0;
}
if (nread == 0) {
- close(fd);
+ if (filename != NULL)
+ close(fd);
break;;
}
}
return 1;
}
-static
-int externalEntityRefStream(XML_Parser parser,
- const XML_Char *context,
- const XML_Char *base,
- const XML_Char *systemId,
- const XML_Char *publicId)
+static int
+externalEntityRefStream(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId)
+ /*@globals fileSystem, internalState @*/
+ /*@modifies fileSystem, internalState @*/
{
XML_Char *s;
const XML_Char *filename;
int ret;
XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
filename = resolveSystemId(base, systemId, &s);
- XML_SetBase(entParser, filename);
+ (void) XML_SetBase(entParser, filename);
ret = processStream(filename, entParser);
free(s);
XML_ParserFree(entParser);
return ret;
}
-int XML_ProcessFile(XML_Parser parser,
- const XML_Char *filename,
- unsigned flags)
+int
+XML_ProcessFile(XML_Parser parser,
+ const XML_Char *filename,
+ unsigned flags)
{
int result;
if (flags & XML_EXTERNAL_ENTITIES)
XML_SetExternalEntityRefHandler(parser,
- (flags & XML_MAP_FILE)
- ? externalEntityRefFilemap
- : externalEntityRefStream);
+ (flags & XML_MAP_FILE)
+ ? externalEntityRefFilemap
+ : externalEntityRefStream);
if (flags & XML_MAP_FILE) {
PROCESS_ARGS args;
args.retPtr = &result;
-/*
-Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
-See the file COPYING for copying permission.
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
*/
#include <stdio.h>
#define NSSEP T('\001')
-static void characterData(void *userData, const XML_Char *s, int len)
+static void
+characterData(void *userData, const XML_Char *s, int len)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
FILE *fp = userData;
for (; len > 0; --len, ++s) {
}
}
-static void attributeValue(FILE *fp, const XML_Char *s)
+static void
+attributeValue(FILE *fp, const XML_Char *s)
+ /*@globals fileSystem @*/
+ /*@modifies fp, fileSystem @*/
{
puttc(T('='), fp);
puttc(T('"'), fp);
/* Lexicographically comparing UTF-8 encoded attribute values,
is equivalent to lexicographically comparing based on the character number. */
-static int attcmp(const void *att1, const void *att2)
+static int
+attcmp(const void *att1, const void *att2)
+ /*@*/
{
return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2);
}
-static void startElement(void *userData, const XML_Char *name, const XML_Char **atts)
+static void
+startElement(void *userData, const XML_Char *name, const XML_Char **atts)
+ /*@globals fileSystem @*/
+ /*@modifies userData, *atts, fileSystem @*/
{
int nAtts;
const XML_Char **p;
puttc(T('>'), fp);
}
-static void endElement(void *userData, const XML_Char *name)
+static void
+endElement(void *userData, const XML_Char *name)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
FILE *fp = userData;
puttc(T('<'), fp);
puttc(T('>'), fp);
}
-static int nsattcmp(const void *p1, const void *p2)
+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;
return tcscmp(att1, att2);
}
-static void startElementNS(void *userData, const XML_Char *name, const XML_Char **atts)
+static void
+startElementNS(void *userData, const XML_Char *name, const XML_Char **atts)
+ /*@globals fileSystem @*/
+ /*@modifies userData, *atts, fileSystem @*/
{
int nAtts;
int nsi;
puttc(T('>'), fp);
}
-static void endElementNS(void *userData, const XML_Char *name)
+static void
+endElementNS(void *userData, const XML_Char *name)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
FILE *fp = userData;
const XML_Char *sep;
#ifndef W3C14N
-static void processingInstruction(void *userData, const XML_Char *target, const XML_Char *data)
+static void
+processingInstruction(void *userData, const XML_Char *target,
+ const XML_Char *data)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
FILE *fp = userData;
puttc(T('<'), fp);
#endif /* not W3C14N */
-static void defaultCharacterData(XML_Parser parser, const XML_Char *s, int len)
+static void
+defaultCharacterData(void *userData, const XML_Char *s, int len)
+ /*@modifies userData @*/
{
- XML_DefaultCurrent(parser);
+ XML_DefaultCurrent((XML_Parser) userData);
}
-static void defaultStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts)
+static void
+defaultStartElement(void *userData, const XML_Char *name,
+ const XML_Char **atts)
+ /*@modifies userData @*/
{
- XML_DefaultCurrent(parser);
+ XML_DefaultCurrent((XML_Parser) userData);
}
-static void defaultEndElement(XML_Parser parser, const XML_Char *name)
+static void
+defaultEndElement(void *userData, const XML_Char *name)
+ /*@modifies userData @*/
{
- XML_DefaultCurrent(parser);
+ XML_DefaultCurrent((XML_Parser) userData);
}
-static void defaultProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data)
+static void
+defaultProcessingInstruction(void *userData, const XML_Char *target,
+ const XML_Char *data)
+ /*@modifies userData @*/
{
- XML_DefaultCurrent(parser);
+ XML_DefaultCurrent((XML_Parser) userData);
}
-static void nopCharacterData(XML_Parser parser, const XML_Char *s, int len)
+static void
+nopCharacterData(void *userData, const XML_Char *s, int len)
+ /*@*/
{
}
-static void nopStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts)
+static void
+nopStartElement(void *userData, const XML_Char *name, const XML_Char **atts)
+ /*@*/
{
}
-static void nopEndElement(XML_Parser parser, const XML_Char *name)
+static void
+nopEndElement(void *userData, const XML_Char *name)
+ /*@*/
{
}
-static void nopProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data)
+static void
+nopProcessingInstruction(void *userData, const XML_Char *target,
+ const XML_Char *data)
+ /*@*/
{
}
-static void markup(XML_Parser parser, const XML_Char *s, int len)
+static void
+markup(void *userData, const XML_Char *s, int len)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/
{
- FILE *fp = XML_GetUserData(parser);
+ FILE *fp = XML_GetUserData((XML_Parser) userData);
for (; len > 0; --len, ++s)
puttc(*s, fp);
}
-static
-void metaLocation(XML_Parser parser)
+static void
+metaLocation(XML_Parser parser)
+ /*@globals fileSystem @*/
+ /*@modifies parser, fileSystem @*/
{
const XML_Char *uri = XML_GetBase(parser);
if (uri)
ftprintf(XML_GetUserData(parser), T(" uri=\"%s\""), uri);
ftprintf(XML_GetUserData(parser),
T(" byte=\"%ld\" nbytes=\"%d\" line=\"%d\" col=\"%d\""),
- XML_GetCurrentByteIndex(parser),
- XML_GetCurrentByteCount(parser),
- XML_GetCurrentLineNumber(parser),
- XML_GetCurrentColumnNumber(parser));
+ XML_GetCurrentByteIndex(parser),
+ XML_GetCurrentByteCount(parser),
+ XML_GetCurrentLineNumber(parser),
+ XML_GetCurrentColumnNumber(parser));
}
-static
-void metaStartDocument(XML_Parser parser)
+static void
+metaStartDocument(void *userData)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/
{
- fputts(T("<document>\n"), XML_GetUserData(parser));
+ fputts(T("<document>\n"), XML_GetUserData((XML_Parser) userData));
}
-static
-void metaEndDocument(XML_Parser parser)
+static void
+metaEndDocument(void *userData)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/
{
- fputts(T("</document>\n"), XML_GetUserData(parser));
+ fputts(T("</document>\n"), XML_GetUserData((XML_Parser) userData));
}
-static
-void metaStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts)
+static void
+metaStartElement(void *userData, const XML_Char *name,
+ const XML_Char **atts)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
const XML_Char **specifiedAttsEnd
= atts + XML_GetSpecifiedAttributeCount(parser);
ftprintf(fp, T("<attribute name=\"%s\" value=\""), atts[0]);
characterData(fp, atts[1], tcslen(atts[1]));
if (atts >= specifiedAttsEnd)
- fputts(T("\" defaulted=\"yes\"/>\n"), fp);
+ fputts(T("\" defaulted=\"yes\"/>\n"), fp);
else if (atts == idAttPtr)
- fputts(T("\" id=\"yes\"/>\n"), fp);
+ fputts(T("\" id=\"yes\"/>\n"), fp);
else
- fputts(T("\"/>\n"), fp);
+ fputts(T("\"/>\n"), fp);
} while (*(atts += 2));
fputts(T("</starttag>\n"), fp);
}
fputts(T("/>\n"), fp);
}
-static
-void metaEndElement(XML_Parser parser, const XML_Char *name)
+static void
+metaEndElement(void *userData, const XML_Char *name)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
ftprintf(fp, T("<endtag name=\"%s\""), name);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
-static
-void metaProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data)
+static void
+metaProcessingInstruction(void *userData, const XML_Char *target,
+ const XML_Char *data)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
ftprintf(fp, T("<pi target=\"%s\" data=\""), target);
characterData(fp, data, tcslen(data));
fputts(T("/>\n"), fp);
}
-static
-void metaComment(XML_Parser parser, const XML_Char *data)
+static void
+metaComment(void *userData, const XML_Char *data)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
fputts(T("<comment data=\""), fp);
characterData(fp, data, tcslen(data));
fputts(T("/>\n"), fp);
}
-static
-void metaStartCdataSection(XML_Parser parser)
+static void
+metaStartCdataSection(void *userData)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
fputts(T("<startcdata"), fp);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
-static
-void metaEndCdataSection(XML_Parser parser)
+static void
+metaEndCdataSection(void *userData)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
fputts(T("<endcdata"), fp);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
-static
-void metaCharacterData(XML_Parser parser, const XML_Char *s, int len)
+static void
+metaCharacterData(void *userData, const XML_Char *s, int len)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
fputts(T("<chars str=\""), fp);
characterData(fp, s, len);
fputts(T("/>\n"), fp);
}
-static
-void metaStartDoctypeDecl(XML_Parser parser,
- const XML_Char *doctypeName,
- const XML_Char *sysid,
- const XML_Char *pubid,
- int has_internal_subset)
+static void
+metaStartDoctypeDecl(void *userData,
+ const XML_Char *doctypeName,
+ const XML_Char *sysid,
+ const XML_Char *pubid,
+ int has_internal_subset)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
ftprintf(fp, T("<startdoctype name=\"%s\""), doctypeName);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
-static
-void metaEndDoctypeDecl(XML_Parser parser)
+static void
+metaEndDoctypeDecl(void *userData)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
fputts(T("<enddoctype"), fp);
metaLocation(parser);
fputts(T("/>\n"), fp);
}
-static
-void metaNotationDecl(XML_Parser parser,
- const XML_Char *notationName,
- const XML_Char *base,
- const XML_Char *systemId,
- const XML_Char *publicId)
+static void
+metaNotationDecl(void *userData,
+ const XML_Char *notationName,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
ftprintf(fp, T("<notation name=\"%s\""), notationName);
if (publicId)
}
-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)
+static void
+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)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
if (value) {
}
}
-static
-void metaStartNamespaceDecl(XML_Parser parser,
- const XML_Char *prefix,
- const XML_Char *uri)
+static void
+metaStartNamespaceDecl(void *userData,
+ const XML_Char *prefix,
+ const XML_Char *uri)
+ /*@globals fileSystem @*/
+ /*@modifies userData, fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
fputts(T("<startns"), fp);
if (prefix)
fputts(T("/>\n"), fp);
}
-static
-void metaEndNamespaceDecl(XML_Parser parser, const XML_Char *prefix)
+static void
+metaEndNamespaceDecl(void *userData, const XML_Char *prefix)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/
{
+ XML_Parser parser = (XML_Parser) userData;
FILE *fp = XML_GetUserData(parser);
if (!prefix)
fputts(T("<endns/>\n"), fp);
ftprintf(fp, T("<endns prefix=\"%s\"/>\n"), prefix);
}
-static
-int unknownEncodingConvert(void *data, const char *p)
+static int
+unknownEncodingConvert(void *data, const char *p)
+ /*@*/
{
return codepageConvert(*(int *)data, p);
}
-static
-int unknownEncoding(void *userData,
- const XML_Char *name,
- XML_Encoding *info)
+static int
+unknownEncoding(void *userData, const XML_Char *name, XML_Encoding *info)
+ /*@modifies info @*/
{
int cp;
static const XML_Char prefixL[] = T("windows-");
return 1;
}
-static
-int notStandalone(void *userData)
+static int
+notStandalone(void *userData)
+ /*@*/
{
return 0;
}
-static
-void usage(const XML_Char *prog)
+static void
+showVersion(XML_Char *prog)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/
+{
+ XML_Char *s = prog;
+ XML_Char ch;
+ const XML_Feature *features = XML_GetFeatureList();
+ while ((ch = *s) != 0) {
+ if (ch == '/'
+#ifdef WIN32
+ || ch == '\\'
+#endif
+ )
+ prog = s + 1;
+ ++s;
+ }
+ ftprintf(stdout, T("%s using %s\n"), prog, XML_ExpatVersion());
+ if (features != NULL && features[0].feature != XML_FEATURE_END) {
+ int i = 1;
+ ftprintf(stdout, T("%s"), features[0].name);
+ if (features[0].value)
+ ftprintf(stdout, T("=%ld"), features[0].value);
+ while (features[i].feature != XML_FEATURE_END) {
+ ftprintf(stdout, T(", %s"), features[i].name);
+ if (features[i].value)
+ ftprintf(stdout, T("=%ld"), features[i].value);
+ ++i;
+ }
+ ftprintf(stdout, T("\n"));
+ }
+}
+
+/*@exits@*/
+static void
+usage(const XML_Char *prog, int rc)
+ /*@globals fileSystem @*/
+ /*@modifies fileSystem @*/
{
- ftprintf(stderr, T("usage: %s [-n] [-p] [-r] [-s] [-w] [-x] [-d output-dir] [-e encoding] file ...\n"), prog);
- exit(1);
+ ftprintf(stderr,
+ T("usage: %s [-n] [-p] [-r] [-s] [-w] [-x] [-d output-dir] "
+ "[-e encoding] file ...\n"), prog);
+ exit(rc);
}
-int tmain(int argc, XML_Char **argv)
+int
+tmain(int argc, XML_Char **argv)
+ /*@globals fileSystem, internalState @*/
+ /*@modifies fileSystem, internalState @*/
{
int i, j;
- const XML_Char *outputDir = 0;
- const XML_Char *encoding = 0;
+ const XML_Char *outputDir = NULL;
+ const XML_Char *encoding = NULL;
unsigned processFlags = XML_MAP_FILE;
int windowsCodePages = 0;
int outputType = 0;
int useNamespaces = 0;
int requireStandalone = 0;
int paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
+ int useStdin = 0;
#ifdef _MSC_VER
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
while (i < argc) {
if (j == 0) {
if (argv[i][0] != T('-'))
- break;
+ break;
if (argv[i][1] == T('-') && argv[i][2] == T('\0')) {
- i++;
- break;
+ i++;
+ break;
}
j++;
}
break;
case T('p'):
paramEntityParsing = XML_PARAM_ENTITY_PARSING_ALWAYS;
- /* fall through */
+ /*@fallthrough@*/
case T('x'):
processFlags |= XML_EXTERNAL_ENTITIES;
j++;
break;
case T('d'):
if (argv[i][j + 1] == T('\0')) {
- if (++i == argc)
- usage(argv[0]);
- outputDir = argv[i];
+ if (++i == argc)
+ usage(argv[0], 2);
+ outputDir = argv[i];
}
else
- outputDir = argv[i] + j + 1;
+ outputDir = argv[i] + j + 1;
i++;
j = 0;
break;
case T('e'):
if (argv[i][j + 1] == T('\0')) {
- if (++i == argc)
- usage(argv[0]);
- encoding = argv[i];
+ if (++i == argc)
+ usage(argv[0], 2);
+ encoding = argv[i];
}
else
- encoding = argv[i] + j + 1;
+ encoding = argv[i] + j + 1;
i++;
j = 0;
break;
+ case T('h'):
+ usage(argv[0], 0);
+ /*@notreached@*/
+ return 0;
+ case T('v'):
+ showVersion(argv[0]);
+ return 0;
case T('\0'):
if (j > 1) {
- i++;
- j = 0;
- break;
+ i++;
+ j = 0;
+ break;
}
- /* fall through */
+ /*@fallthrough@*/
default:
- usage(argv[0]);
+ usage(argv[0], 2);
}
}
- if (i == argc)
- usage(argv[0]);
+ if (i == argc) {
+ useStdin = 1;
+ processFlags &= ~XML_MAP_FILE;
+ i--;
+ }
for (; i < argc; i++) {
FILE *fp = 0;
XML_Char *outName = 0;
XML_SetParamEntityParsing(parser, paramEntityParsing);
if (outputType == 't') {
/* This is for doing timings; this gives a more realistic estimate of
- the parsing time. */
+ the parsing time. */
outputDir = 0;
XML_SetElementHandler(parser, nopStartElement, nopEndElement);
XML_SetCharacterDataHandler(parser, nopCharacterData);
XML_SetProcessingInstructionHandler(parser, nopProcessingInstruction);
}
else if (outputDir) {
- const XML_Char *file = argv[i];
+ const XML_Char *file = useStdin ? T("STDIN") : argv[i];
if (tcsrchr(file, T('/')))
- file = tcsrchr(file, T('/')) + 1;
+ file = tcsrchr(file, T('/')) + 1;
#ifdef WIN32
if (tcsrchr(file, T('\\')))
- file = tcsrchr(file, T('\\')) + 1;
+ file = tcsrchr(file, T('\\')) + 1;
#endif
- outName = malloc((tcslen(outputDir) + tcslen(file) + 2) * sizeof(XML_Char));
+ outName = malloc((tcslen(outputDir) + tcslen(file) + 2)
+ * sizeof(XML_Char));
tcscpy(outName, outputDir);
tcscat(outName, T("/"));
tcscat(outName, file);
fp = tfopen(outName, T("wb"));
if (!fp) {
- tperror(outName);
- exit(1);
+ tperror(outName);
+ exit(1);
}
setvbuf(fp, NULL, _IOFBF, 16384);
#ifdef XML_UNICODE
XML_SetUserData(parser, fp);
switch (outputType) {
case 'm':
- XML_UseParserAsHandlerArg(parser);
- XML_SetElementHandler(parser, metaStartElement, metaEndElement);
- XML_SetProcessingInstructionHandler(parser, metaProcessingInstruction);
- XML_SetCommentHandler(parser, metaComment);
- XML_SetCdataSectionHandler(parser, metaStartCdataSection, metaEndCdataSection);
- XML_SetCharacterDataHandler(parser, metaCharacterData);
- XML_SetDoctypeDeclHandler(parser, metaStartDoctypeDecl, metaEndDoctypeDecl);
- XML_SetEntityDeclHandler(parser, metaEntityDecl);
- XML_SetNotationDeclHandler(parser, metaNotationDecl);
- XML_SetNamespaceDeclHandler(parser, metaStartNamespaceDecl, metaEndNamespaceDecl);
- metaStartDocument(parser);
- break;
+ XML_UseParserAsHandlerArg(parser);
+ XML_SetElementHandler(parser, metaStartElement, metaEndElement);
+ XML_SetProcessingInstructionHandler(parser, metaProcessingInstruction);
+ XML_SetCommentHandler(parser, metaComment);
+ XML_SetCdataSectionHandler(parser, metaStartCdataSection,
+ metaEndCdataSection);
+ XML_SetCharacterDataHandler(parser, metaCharacterData);
+ XML_SetDoctypeDeclHandler(parser, metaStartDoctypeDecl,
+ metaEndDoctypeDecl);
+ XML_SetEntityDeclHandler(parser, metaEntityDecl);
+ XML_SetNotationDeclHandler(parser, metaNotationDecl);
+ XML_SetNamespaceDeclHandler(parser, metaStartNamespaceDecl,
+ metaEndNamespaceDecl);
+ metaStartDocument(parser);
+ break;
case 'c':
- XML_UseParserAsHandlerArg(parser);
- XML_SetDefaultHandler(parser, markup);
- XML_SetElementHandler(parser, defaultStartElement, defaultEndElement);
- XML_SetCharacterDataHandler(parser, defaultCharacterData);
- XML_SetProcessingInstructionHandler(parser, defaultProcessingInstruction);
- break;
+ XML_UseParserAsHandlerArg(parser);
+ XML_SetDefaultHandler(parser, markup);
+ XML_SetElementHandler(parser, defaultStartElement, defaultEndElement);
+ XML_SetCharacterDataHandler(parser, defaultCharacterData);
+ XML_SetProcessingInstructionHandler(parser,
+ defaultProcessingInstruction);
+ break;
default:
- if (useNamespaces)
- XML_SetElementHandler(parser, startElementNS, endElementNS);
- else
- XML_SetElementHandler(parser, startElement, endElement);
- XML_SetCharacterDataHandler(parser, characterData);
+ if (useNamespaces)
+ XML_SetElementHandler(parser, startElementNS, endElementNS);
+ else
+ XML_SetElementHandler(parser, startElement, endElement);
+ XML_SetCharacterDataHandler(parser, characterData);
#ifndef W3C14N
- XML_SetProcessingInstructionHandler(parser, processingInstruction);
+ XML_SetProcessingInstructionHandler(parser, processingInstruction);
#endif /* not W3C14N */
- break;
+ break;
}
}
if (windowsCodePages)
XML_SetUnknownEncodingHandler(parser, unknownEncoding, 0);
- result = XML_ProcessFile(parser, argv[i], processFlags);
+ result = XML_ProcessFile(parser, useStdin ? NULL : argv[i], processFlags);
if (outputDir) {
if (outputType == 'm')
- metaEndDocument(parser);
+ metaEndDocument(parser);
fclose(fp);
if (!result)
- tremove(outName);
+ tremove(outName);
free(outName);
}
XML_ParserFree(parser);