]> granicus.if.org Git - libexpat/commitdiff
Report parsed entity declarations
authorJames Clark <jjc@jclark.com>
Fri, 12 May 2000 05:56:27 +0000 (05:56 +0000)
committerJames Clark <jjc@jclark.com>
Fri, 12 May 2000 05:56:27 +0000 (05:56 +0000)
expat/xmlparse/xmlparse.c
expat/xmlparse/xmlparse.h
expat/xmltok/xmlrole.c
expat/xmltok/xmlrole.h
expat/xmlwf/xmlwf.c

index f40f73d7919111dab3df243f69783fec017c7e10..ad53c4304a73202e21b158d71272ed9ef6312182 100755 (executable)
@@ -303,6 +303,8 @@ typedef struct {
   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;
@@ -371,6 +373,8 @@ typedef struct {
 #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)
@@ -463,6 +467,8 @@ XML_Parser XML_ParserCreate(const XML_Char *encodingName)
   endDoctypeDeclHandler = 0;
   unparsedEntityDeclHandler = 0;
   notationDeclHandler = 0;
+  externalParsedEntityDeclHandler = 0;
+  internalParsedEntityDeclHandler = 0;
   startNamespaceDeclHandler = 0;
   endNamespaceDeclHandler = 0;
   notStandaloneHandler = 0;
@@ -793,6 +799,18 @@ void XML_SetUnparsedEntityDeclHandler(XML_Parser parser,
   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)
 {
@@ -2388,6 +2406,16 @@ doProlog(XML_Parser parser,
          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);
@@ -2445,6 +2473,16 @@ doProlog(XML_Parser parser,
 
       }
       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;
index 89f352bc2dae44402fc92f9a6ef306ac99444ce8..6dffe74107a70758d8821a1c2a731a57dc5907c7 100755 (executable)
@@ -143,6 +143,17 @@ typedef void (*XML_NotationDeclHandler)(void *userData,
                                        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
@@ -305,6 +316,14 @@ void XMLPARSEAPI
 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,
index 20bd518a2ab6b4b3d110366f260aadbcecfb9087..8eaba3a741fbaa56a95c0e1da73f03d45c2922e8 100755 (executable)
@@ -492,7 +492,7 @@ int entity5(PROLOG_STATE *state,
     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;
index 087d5bdce77aecf041bcdc964d18e955c8c50bec..22958dfe2fc278d628d2f9faf9269c6e040d6a7f 100755 (executable)
@@ -67,7 +67,8 @@ enum {
   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 {
index 0a86de92df324924eb39d364646e65345a4886b6..2b8fe12081bc9276f28c691841cd6ec93779423b 100755 (executable)
@@ -454,6 +454,39 @@ void metaNotationDecl(XML_Parser parser,
   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,
@@ -692,6 +725,8 @@ int tmain(int argc, XML_Char **argv)
        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;