diff --git a/expat/xmlparse/xmlparse.c b/expat/xmlparse/xmlparse.c
index 1215a258..708eb6bd 100755
--- a/expat/xmlparse/xmlparse.c
+++ b/expat/xmlparse/xmlparse.c
@@ -214,6 +214,8 @@ static enum XML_Error
storeEntityValue(XML_Parser parser, const char *start, const char *end);
static int
reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
+static int
+reportComment(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
static void
reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, const char *end);
@@ -265,6 +267,7 @@ typedef struct {
XML_EndElementHandler endElementHandler;
XML_CharacterDataHandler characterDataHandler;
XML_ProcessingInstructionHandler processingInstructionHandler;
+ XML_CommentHandler commentHandler;
XML_DefaultHandler defaultHandler;
XML_UnparsedEntityDeclHandler unparsedEntityDeclHandler;
XML_NotationDeclHandler notationDeclHandler;
@@ -315,6 +318,7 @@ typedef struct {
#define endElementHandler (((Parser *)parser)->endElementHandler)
#define characterDataHandler (((Parser *)parser)->characterDataHandler)
#define processingInstructionHandler (((Parser *)parser)->processingInstructionHandler)
+#define commentHandler (((Parser *)parser)->commentHandler)
#define defaultHandler (((Parser *)parser)->defaultHandler)
#define unparsedEntityDeclHandler (((Parser *)parser)->unparsedEntityDeclHandler)
#define notationDeclHandler (((Parser *)parser)->notationDeclHandler)
@@ -380,6 +384,7 @@ XML_Parser XML_ParserCreate(const XML_Char *encodingName)
endElementHandler = 0;
characterDataHandler = 0;
processingInstructionHandler = 0;
+ commentHandler = 0;
defaultHandler = 0;
unparsedEntityDeclHandler = 0;
notationDeclHandler = 0;
@@ -453,6 +458,7 @@ XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser,
XML_EndElementHandler oldEndElementHandler = endElementHandler;
XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler;
XML_ProcessingInstructionHandler oldProcessingInstructionHandler = processingInstructionHandler;
+ XML_CommentHandler oldCommentHandler = commentHandler;
XML_DefaultHandler oldDefaultHandler = defaultHandler;
XML_ExternalEntityRefHandler oldExternalEntityRefHandler = externalEntityRefHandler;
XML_UnknownEncodingHandler oldUnknownEncodingHandler = unknownEncodingHandler;
@@ -468,6 +474,7 @@ XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser,
endElementHandler = oldEndElementHandler;
characterDataHandler = oldCharacterDataHandler;
processingInstructionHandler = oldProcessingInstructionHandler;
+ commentHandler = oldCommentHandler;
defaultHandler = oldDefaultHandler;
externalEntityRefHandler = oldExternalEntityRefHandler;
unknownEncodingHandler = oldUnknownEncodingHandler;
@@ -579,6 +586,12 @@ void XML_SetProcessingInstructionHandler(XML_Parser parser,
processingInstructionHandler = handler;
}
+void XML_SetCommentHandler(XML_Parser parser,
+ XML_CommentHandler handler)
+{
+ commentHandler = handler;
+}
+
void XML_SetDefaultHandler(XML_Parser parser,
XML_DefaultHandler handler)
{
@@ -1284,6 +1297,10 @@ doContent(XML_Parser parser,
if (!reportProcessingInstruction(parser, enc, s, next))
return XML_ERROR_NO_MEMORY;
break;
+ case XML_TOK_COMMENT:
+ if (!reportComment(parser, enc, s, next))
+ return XML_ERROR_NO_MEMORY;
+ break;
default:
if (defaultHandler)
reportDefault(parser, enc, s, next);
@@ -2045,12 +2062,19 @@ prologProcessor(XML_Parser parser,
if (!reportProcessingInstruction(parser, encoding, s, next))
return XML_ERROR_NO_MEMORY;
break;
+ case XML_TOK_COMMENT:
+ eventPtr = s;
+ eventEndPtr = next;
+ if (!reportComment(parser, encoding, s, next))
+ return XML_ERROR_NO_MEMORY;
+ break;
}
break;
}
if (defaultHandler) {
switch (tok) {
case XML_TOK_PI:
+ case XML_TOK_COMMENT:
case XML_TOK_BOM:
case XML_TOK_XML_DECL:
break;
@@ -2089,7 +2113,6 @@ enum XML_Error epilogProcessor(XML_Parser parser,
*nextPtr = end;
return XML_ERROR_NONE;
case XML_TOK_PROLOG_S:
- case XML_TOK_COMMENT:
if (defaultHandler)
reportDefault(parser, encoding, s, next);
break;
@@ -2097,6 +2120,10 @@ enum XML_Error epilogProcessor(XML_Parser parser,
if (!reportProcessingInstruction(parser, encoding, s, next))
return XML_ERROR_NO_MEMORY;
break;
+ case XML_TOK_COMMENT:
+ if (!reportComment(parser, encoding, s, next))
+ return XML_ERROR_NO_MEMORY;
+ break;
case XML_TOK_INVALID:
eventPtr = next;
return XML_ERROR_INVALID_TOKEN;
@@ -2388,6 +2415,27 @@ reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *
return 1;
}
+static int
+reportComment(XML_Parser parser, const ENCODING *enc, const char *start, const char *end)
+{
+ XML_Char *data;
+ if (!commentHandler) {
+ if (defaultHandler)
+ reportDefault(parser, enc, start, end);
+ return 1;
+ }
+ data = poolStoreString(&tempPool,
+ enc,
+ start + enc->minBytesPerChar * 4,
+ end - enc->minBytesPerChar * 3);
+ if (!data)
+ return 0;
+ normalizeLines(data);
+ commentHandler(handlerArg, data);
+ poolClear(&tempPool);
+ return 1;
+}
+
static void
reportDefault(XML_Parser parser, const ENCODING *enc, const char *s, const char *end)
{
@@ -2792,9 +2840,13 @@ static int dtdCopy(DTD *newDtd, const DTD *oldDtd)
for (i = 0; i < newE->nDefaultAtts; i++) {
newE->defaultAtts[i].id = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;
- newE->defaultAtts[i].value = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value);
- if (!newE->defaultAtts[i].value)
- return 0;
+ if (oldE->defaultAtts[i].value) {
+ newE->defaultAtts[i].value = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value);
+ if (!newE->defaultAtts[i].value)
+ return 0;
+ }
+ else
+ newE->defaultAtts[i].value = 0;
}
}
diff --git a/expat/xmlparse/xmlparse.h b/expat/xmlparse/xmlparse.h
index 73dbb562..57549e52 100755
--- a/expat/xmlparse/xmlparse.h
+++ b/expat/xmlparse/xmlparse.h
@@ -104,6 +104,9 @@ typedef void (*XML_ProcessingInstructionHandler)(void *userData,
const XML_Char *target,
const XML_Char *data);
+/* data is 0 terminated */
+typedef void (*XML_CommentHandler)(void *userData, const XML_Char *data);
+
/* This is called for any characters in the XML document for
which there is no applicable handler. This includes both
characters that are part of markup which is of a kind that is
@@ -248,6 +251,9 @@ XML_SetCharacterDataHandler(XML_Parser parser,
void XMLPARSEAPI
XML_SetProcessingInstructionHandler(XML_Parser parser,
XML_ProcessingInstructionHandler handler);
+void XMLPARSEAPI
+XML_SetCommentHandler(XML_Parser parser,
+ XML_CommentHandler handler);
/* This sets the default handler and also inhibits expansion of internal entities.
The entity reference will be passed to the default handler. */
diff --git a/expat/xmlwf/xmlwf.c b/expat/xmlwf/xmlwf.c
index 7968c4cd..d3c89de1 100755
--- a/expat/xmlwf/xmlwf.c
+++ b/expat/xmlwf/xmlwf.c
@@ -323,6 +323,17 @@ void metaProcessingInstruction(XML_Parser parser, const XML_Char *target, const
fputts(T("/>\n"), fp);
}
+static
+void metaComment(XML_Parser parser, const XML_Char *data)
+{
+ FILE *fp = XML_GetUserData(parser);
+ fputts(T("\n"), fp);
+}
+
static
void metaCharacterData(XML_Parser parser, const XML_Char *s, int len)
{
@@ -683,6 +694,7 @@ int tmain(int argc, XML_Char **argv)
fputts(T("\n"), fp);
XML_SetElementHandler(parser, metaStartElement, metaEndElement);
XML_SetProcessingInstructionHandler(parser, metaProcessingInstruction);
+ XML_SetCommentHandler(parser, metaComment);
XML_SetCharacterDataHandler(parser, metaCharacterData);
XML_SetUnparsedEntityDeclHandler(parser, metaUnparsedEntityDecl);
XML_SetNotationDeclHandler(parser, metaNotationDecl);