XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler;
XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler;
XML_NotationDeclHandler m_notationDeclHandler;
+ XML_ExternalParsedEntityDeclHandler m_externalParsedEntityDeclHandler;
+ XML_InternalParsedEntityDeclHandler m_internalParsedEntityDeclHandler;
XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler;
XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler;
XML_NotStandaloneHandler m_notStandaloneHandler;
#define endDoctypeDeclHandler (((Parser *)parser)->m_endDoctypeDeclHandler)
#define unparsedEntityDeclHandler (((Parser *)parser)->m_unparsedEntityDeclHandler)
#define notationDeclHandler (((Parser *)parser)->m_notationDeclHandler)
+#define externalParsedEntityDeclHandler (((Parser *)parser)->m_externalParsedEntityDeclHandler)
+#define internalParsedEntityDeclHandler (((Parser *)parser)->m_internalParsedEntityDeclHandler)
#define startNamespaceDeclHandler (((Parser *)parser)->m_startNamespaceDeclHandler)
#define endNamespaceDeclHandler (((Parser *)parser)->m_endNamespaceDeclHandler)
#define notStandaloneHandler (((Parser *)parser)->m_notStandaloneHandler)
endDoctypeDeclHandler = 0;
unparsedEntityDeclHandler = 0;
notationDeclHandler = 0;
+ externalParsedEntityDeclHandler = 0;
+ internalParsedEntityDeclHandler = 0;
startNamespaceDeclHandler = 0;
endNamespaceDeclHandler = 0;
notStandaloneHandler = 0;
unparsedEntityDeclHandler = handler;
}
+void XML_SetExternalParsedEntityDeclHandler(XML_Parser parser,
+ XML_ExternalParsedEntityDeclHandler handler)
+{
+ externalParsedEntityDeclHandler = handler;
+}
+
+void XML_SetInternalParsedEntityDeclHandler(XML_Parser parser,
+ XML_InternalParsedEntityDeclHandler handler)
+{
+ internalParsedEntityDeclHandler = handler;
+}
+
void XML_SetNotationDeclHandler(XML_Parser parser,
XML_NotationDeclHandler handler)
{
declEntity->textPtr = poolStart(&dtd.pool);
declEntity->textLen = poolLength(&dtd.pool);
poolFinish(&dtd.pool);
+ if (internalParsedEntityDeclHandler
+ // Check it's not a parameter entity
+ && ((ENTITY *)lookup(&dtd.generalEntities, declEntity->name, 0)
+ == declEntity)) {
+ *eventEndPP = s;
+ internalParsedEntityDeclHandler(handlerArg,
+ declEntity->name,
+ declEntity->textPtr,
+ declEntity->textLen);
+ }
}
else
poolDiscard(&dtd.pool);
}
break;
+ case XML_ROLE_EXTERNAL_GENERAL_ENTITY_NO_NOTATION:
+ if (declEntity && externalParsedEntityDeclHandler) {
+ *eventEndPP = s;
+ externalParsedEntityDeclHandler(handlerArg,
+ declEntity->name,
+ declEntity->base,
+ declEntity->systemId,
+ declEntity->publicId);
+ }
+ break;
case XML_ROLE_GENERAL_ENTITY_NAME:
{
const XML_Char *name;
const XML_Char *systemId,
const XML_Char *publicId);
+typedef void (*XML_ExternalParsedEntityDeclHandler)(void *userData,
+ const XML_Char *entityName,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+typedef void (*XML_InternalParsedEntityDeclHandler)(void *userData,
+ const XML_Char *entityName,
+ const XML_Char *replacementText,
+ int replacementTextLength);
+
/* When namespace processing is enabled, these are called once for
each namespace declaration. The call to the start and end element
handlers occur between the calls to the start and end namespace
XML_SetNotationDeclHandler(XML_Parser parser,
XML_NotationDeclHandler handler);
+void XMLPARSEAPI
+XML_SetExternalParsedEntityDeclHandler(XML_Parser parser,
+ XML_ExternalParsedEntityDeclHandler handler);
+
+void XMLPARSEAPI
+XML_SetInternalParsedEntityDeclHandler(XML_Parser parser,
+ XML_InternalParsedEntityDeclHandler handler);
+
void XMLPARSEAPI
XML_SetNamespaceDeclHandler(XML_Parser parser,
XML_StartNamespaceDeclHandler start,
return XML_ROLE_NONE;
case XML_TOK_DECL_CLOSE:
setTopLevel(state);
- return XML_ROLE_NONE;
+ return XML_ROLE_EXTERNAL_GENERAL_ENTITY_NO_NOTATION;
case XML_TOK_NAME:
if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
state->handler = entity6;
XML_ROLE_IGNORE_SECT,
XML_ROLE_INNER_PARAM_ENTITY_REF,
#endif /* XML_DTD */
- XML_ROLE_PARAM_ENTITY_REF
+ XML_ROLE_PARAM_ENTITY_REF,
+ XML_ROLE_EXTERNAL_GENERAL_ENTITY_NO_NOTATION
};
typedef struct prolog_state {
fputts(T("/>\n"), fp);
}
+
+static
+void metaExternalParsedEntityDecl(XML_Parser parser,
+ const XML_Char *entityName,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId)
+{
+ FILE *fp = XML_GetUserData(parser);
+ 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);
+}
+
+static
+void metaInternalParsedEntityDecl(XML_Parser parser,
+ const XML_Char *entityName,
+ const XML_Char *text,
+ int textLen)
+{
+ FILE *fp = XML_GetUserData(parser);
+ ftprintf(fp, T("<entity name=\"%s\""), entityName);
+ metaLocation(parser);
+ puttc(T('>'), fp);
+ characterData(fp, text, textLen);
+ fputts(T("</entity/>\n"), fp);
+}
+
static
void metaStartNamespaceDecl(XML_Parser parser,
const XML_Char *prefix,
XML_SetDoctypeDeclHandler(parser, metaStartDoctypeDecl, metaEndDoctypeDecl);
XML_SetUnparsedEntityDeclHandler(parser, metaUnparsedEntityDecl);
XML_SetNotationDeclHandler(parser, metaNotationDecl);
+ XML_SetExternalParsedEntityDeclHandler(parser, metaExternalParsedEntityDecl);
+ XML_SetInternalParsedEntityDeclHandler(parser, metaInternalParsedEntityDecl);
XML_SetNamespaceDeclHandler(parser, metaStartNamespaceDecl, metaEndNamespaceDecl);
metaStartDocument(parser);
break;