[XML-SIG] PyXML 0.5.5.1 extensions/pyexpat.c not ANSI C

Albert Chin-A-Young china@thewrittenword.com
Sat, 2 Sep 2000 19:40:33 -0500


In PyXML 0.5.5.1, extensions/pyexpat.c contains:
 staticforward struct HandlerInfo handler_info[];

This is not valid ANSI C. gcc -pedantic complains with:
  array size missing

The Digital UNIX and IRIX C compilers failed to compile pyexpat.c
because of this. The following patch fixes things. What do you think?

-- 
albert chin (china@thewrittenword.com)

-- snip snip
--- extensions/pyexpat.c.orig	Sat Sep  2 19:35:15 2000
+++ extensions/pyexpat.c	Sat Sep  2 19:35:28 2000
@@ -59,6 +59,17 @@
 
 /* ----------------------------------------------------- */
 
+/* Prototypes */
+
+void pyxml_SetEndCdataSection( XML_Parser *, void * );
+void pyxml_SetEndElementHandler( XML_Parser *, void * );
+void pyxml_SetEndNamespaceDeclHandler( XML_Parser *, void * );
+void pyxml_SetStartCdataSection( XML_Parser *, void * );
+void pyxml_SetStartElementHandler( XML_Parser *, void * );
+void pyxml_SetStartNamespaceDeclHandler( XML_Parser *, void * );
+
+/* ----------------------------------------------------- */
+
 /* Declarations for objects of type xmlparser */
 
 typedef struct {
@@ -79,8 +90,6 @@
         xmlhandler handler;
 };
 
-staticforward struct HandlerInfo handler_info[];
-
 static PyObject *conv_atts( XML_Char **atts){
         PyObject *attrs_obj=NULL;
         XML_Char **attrs_p, **attrs_k;
@@ -122,6 +131,8 @@
         clear_handlers(self);
 }
 
+#define RC_HANDLER_PROTO( RC, NAME, PARAMS ) \
+static RC my_##NAME##Handler PARAMS;
 #define RC_HANDLER( RC, NAME, PARAMS, INIT, PARAM_FORMAT, CONVERSION, \
                 RETURN, GETUSERDATA) \
 \
@@ -149,15 +160,106 @@
 
 #define NOTHING /**/
 
+#define VOID_HANDLER_PROTO( NAME, PARAMS ) \
+	RC_HANDLER_PROTO( void, NAME, PARAMS )
 #define VOID_HANDLER( NAME, PARAMS, PARAM_FORMAT ) \
         RC_HANDLER( void, NAME, PARAMS, NOTHING, PARAM_FORMAT, NOTHING, NOTHING,\
         (xmlparseobject *)userData )
 
+#define INT_HANDLER_PROTO( NAME, PARAMS ) \
+	RC_HANDLER_PROTO( int, NAME, PARAMS )
 #define INT_HANDLER( NAME, PARAMS, PARAM_FORMAT )\
         RC_HANDLER( int, NAME, PARAMS, int rc=0;, PARAM_FORMAT,  \
                         rc = PyInt_AsLong( rv );, rc, \
         (xmlparseobject *)userData )
 
+/* Prototypes for all handler functions */
+VOID_HANDLER_PROTO( StartElement,
+		(void *, const XML_Char *, const XML_Char **) )
+VOID_HANDLER_PROTO( EndElement,
+		(void *, const XML_Char *) )
+VOID_HANDLER_PROTO( ProcessingInstruction,
+		(void *, const XML_Char *, const XML_Char *) )
+VOID_HANDLER_PROTO( CharacterData, 
+                (void *, const XML_Char *, int) )
+VOID_HANDLER_PROTO( UnparsedEntityDecl,
+                (void *, const XML_Char *, const XML_Char *,
+		const XML_Char *, const XML_Char *, const XML_Char *) )
+VOID_HANDLER_PROTO( NotationDecl, 
+		(void *, const XML_Char *, const XML_Char *,
+		const XML_Char *, const XML_Char *) )
+VOID_HANDLER_PROTO( StartNamespaceDecl,
+		(void *, const XML_Char *, const XML_Char *) )
+VOID_HANDLER_PROTO( EndNamespaceDecl,
+		(void *, const XML_Char *) )
+VOID_HANDLER_PROTO( Comment,
+		(void *, const XML_Char *) )
+VOID_HANDLER_PROTO( StartCdataSection,
+		(void *) )
+VOID_HANDLER_PROTO( EndCdataSection,
+               (void *) )
+VOID_HANDLER_PROTO( Default,
+                (void *,  const XML_Char *, int) )
+VOID_HANDLER_PROTO( DefaultHandlerExpand,
+                (void *,  const XML_Char *, int) )
+INT_HANDLER_PROTO( NotStandalone,
+                (void *) )
+RC_HANDLER_PROTO( int, ExternalEntityRef,
+		(XML_Parser, const XML_Char *, const XML_Char *,
+		const XML_Char *, const XML_Char *) )
+
+static struct HandlerInfo handler_info[]=
+{{"StartElementHandler", 
+        pyxml_SetStartElementHandler, 
+        my_StartElementHandler},
+{"EndElementHandler", 
+        pyxml_SetEndElementHandler, 
+        my_EndElementHandler},
+{"ProcessingInstructionHandler", 
+        (xmlhandlersetter)XML_SetProcessingInstructionHandler,
+        my_ProcessingInstructionHandler},
+{"CharacterDataHandler", 
+        (xmlhandlersetter)XML_SetCharacterDataHandler,
+        my_CharacterDataHandler},
+{"UnparsedEntityDeclHandler", 
+        (xmlhandlersetter)XML_SetUnparsedEntityDeclHandler,
+        my_UnparsedEntityDeclHandler },
+{"NotationDeclHandler", 
+        (xmlhandlersetter)XML_SetNotationDeclHandler,
+        my_NotationDeclHandler },
+{"StartNamespaceDeclHandler", 
+        pyxml_SetStartNamespaceDeclHandler,
+        my_StartNamespaceDeclHandler },
+{"EndNamespaceDeclHandler", 
+        pyxml_SetEndNamespaceDeclHandler,
+        my_EndNamespaceDeclHandler },
+{"CommentHandler",
+        (xmlhandlersetter)XML_SetCommentHandler,
+        my_CommentHandler},
+{"StartCdataSectionHandler",
+        pyxml_SetStartCdataSection,
+        my_StartCdataSectionHandler},
+{"EndCdataSectionHandler",
+        pyxml_SetEndCdataSection,
+        my_EndCdataSectionHandler},
+{"DefaultHandler",
+        (xmlhandlersetter)XML_SetDefaultHandler,
+        my_DefaultHandler},
+{"DefaultHandlerExpand",
+        (xmlhandlersetter)XML_SetDefaultHandlerExpand,
+        my_DefaultHandlerExpandHandler},
+{"NotStandaloneHandler",
+        (xmlhandlersetter)XML_SetNotStandaloneHandler,
+        my_NotStandaloneHandler},
+{"ExternalEntityRefHandler",
+        (xmlhandlersetter)XML_SetExternalEntityRefHandler,
+        my_ExternalEntityRefHandler },
+
+{NULL, NULL, NULL } /* sentinel */
+};
+
+/* Handler functions */
+
 VOID_HANDLER( StartElement, 
                 (void *userData, const XML_Char *name, const XML_Char **atts ), 
                 ("(sO&)", name, conv_atts, atts ) )
@@ -827,55 +929,4 @@
                 StartCdataSection, EndCdataSection, 
                 (pairsetter)XML_SetCdataSectionHandler);
 }
-
-static struct HandlerInfo handler_info[]=
-{{"StartElementHandler", 
-        pyxml_SetStartElementHandler, 
-        my_StartElementHandler},
-{"EndElementHandler", 
-        pyxml_SetEndElementHandler, 
-        my_EndElementHandler},
-{"ProcessingInstructionHandler", 
-        (xmlhandlersetter)XML_SetProcessingInstructionHandler,
-        my_ProcessingInstructionHandler},
-{"CharacterDataHandler", 
-        (xmlhandlersetter)XML_SetCharacterDataHandler,
-        my_CharacterDataHandler},
-{"UnparsedEntityDeclHandler", 
-        (xmlhandlersetter)XML_SetUnparsedEntityDeclHandler,
-        my_UnparsedEntityDeclHandler },
-{"NotationDeclHandler", 
-        (xmlhandlersetter)XML_SetNotationDeclHandler,
-        my_NotationDeclHandler },
-{"StartNamespaceDeclHandler", 
-        pyxml_SetStartNamespaceDeclHandler,
-        my_StartNamespaceDeclHandler },
-{"EndNamespaceDeclHandler", 
-        pyxml_SetEndNamespaceDeclHandler,
-        my_EndNamespaceDeclHandler },
-{"CommentHandler",
-        (xmlhandlersetter)XML_SetCommentHandler,
-        my_CommentHandler},
-{"StartCdataSectionHandler",
-        pyxml_SetStartCdataSection,
-        my_StartCdataSectionHandler},
-{"EndCdataSectionHandler",
-        pyxml_SetEndCdataSection,
-        my_EndCdataSectionHandler},
-{"DefaultHandler",
-        (xmlhandlersetter)XML_SetDefaultHandler,
-        my_DefaultHandler},
-{"DefaultHandlerExpand",
-        (xmlhandlersetter)XML_SetDefaultHandlerExpand,
-        my_DefaultHandlerExpandHandler},
-{"NotStandaloneHandler",
-        (xmlhandlersetter)XML_SetNotStandaloneHandler,
-        my_NotStandaloneHandler},
-{"ExternalEntityRefHandler",
-        (xmlhandlersetter)XML_SetExternalEntityRefHandler,
-        my_ExternalEntityRefHandler },
-
-{NULL, NULL, NULL } /* sentinel */
-};
-