From 624af829a7d930d29f359c3d8a2408efc36b34e8 Mon Sep 17 00:00:00 2001
From: Trent Mick <trentm@activestate.com>
Date: Mon, 19 Jun 2006 23:57:41 +0000
Subject: [ 1295808 ] expat symbols should be namespaced in pyexpat
 (http://python.org/sf/1295808)

---
 Modules/expat/expat_external.h |   4 ++
 Modules/expat/pyexpatns.h      | 124 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 128 insertions(+)
 create mode 100644 Modules/expat/pyexpatns.h

diff --git a/Modules/expat/expat_external.h b/Modules/expat/expat_external.h
index 8a2d708..f054014 100644
--- a/Modules/expat/expat_external.h
+++ b/Modules/expat/expat_external.h
@@ -7,6 +7,10 @@
 
 /* External API definitions */
 
+/* Namespace external symbols to allow multiple libexpat version to
+   co-exist. */
+#include "pyexpatns.h"
+
 #if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__)
 #define XML_USE_MSC_EXTENSIONS 1
 #endif
diff --git a/Modules/expat/pyexpatns.h b/Modules/expat/pyexpatns.h
new file mode 100644
index 0000000..7fbd341
--- /dev/null
+++ b/Modules/expat/pyexpatns.h
@@ -0,0 +1,124 @@
+/* Copyright (c) 2005-2006 ActiveState Software Inc.
+ *
+ * Namespace all expat exported symbols to avoid dynamic loading symbol
+ * collisions when embedding Python.
+ *
+ * The Problem:
+ * - you embed Python in some app
+ * - the app dynamically loads libexpat of version X
+ * - the embedded Python imports pyexpat (which was built against
+ *   libexpat version X+n)
+ * --> pyexpat gets the expat symbols from the already loaded and *older*
+ *     libexpat: crash (Specifically the crash we observed was in
+ *     getting an old XML_ErrorString (from xmlparse.c) and then calling
+ *     it with newer values in the XML_Error enum:
+ *
+ *       // pyexpat.c, line 1970
+ *       ...
+ *       // Added in Expat 1.95.7.
+ *       MYCONST(XML_ERROR_UNBOUND_PREFIX);
+ *       ...
+ *
+ *
+ * The Solution:
+ * Prefix all a exported symbols with "PyExpat_". This is similar to
+ * what Mozilla does for some common libs:
+ * http://lxr.mozilla.org/seamonkey/source/modules/libimg/png/mozpngconf.h#115
+ *
+ * The list of relevant exported symbols can be had with this command:
+ * 
+       nm pyexpat.so \
+           | grep -v " [a-zBUA] " \
+           | grep -v "_fini\|_init\|initpyexpat"
+ *
+ * If any of those symbols are NOT prefixed with "PyExpat_" then
+ * a #define should be added for it here.
+ */
+
+#ifndef PYEXPATNS_H
+#define PYEXPATNS_H
+
+#define XML_DefaultCurrent              PyExpat_XML_DefaultCurrent
+#define XML_ErrorString                 PyExpat_XML_ErrorString
+#define XML_ExpatVersion                PyExpat_XML_ExpatVersion
+#define XML_ExpatVersionInfo            PyExpat_XML_ExpatVersionInfo
+#define XML_ExternalEntityParserCreate  PyExpat_XML_ExternalEntityParserCreate
+#define XML_FreeContentModel            PyExpat_XML_FreeContentModel
+#define XML_GetBase                     PyExpat_XML_GetBase
+#define XML_GetBuffer                   PyExpat_XML_GetBuffer
+#define XML_GetCurrentByteCount         PyExpat_XML_GetCurrentByteCount
+#define XML_GetCurrentByteIndex         PyExpat_XML_GetCurrentByteIndex
+#define XML_GetCurrentColumnNumber      PyExpat_XML_GetCurrentColumnNumber
+#define XML_GetCurrentLineNumber        PyExpat_XML_GetCurrentLineNumber
+#define XML_GetErrorCode                PyExpat_XML_GetErrorCode
+#define XML_GetFeatureList              PyExpat_XML_GetFeatureList
+#define XML_GetIdAttributeIndex         PyExpat_XML_GetIdAttributeIndex
+#define XML_GetInputContext             PyExpat_XML_GetInputContext
+#define XML_GetParsingStatus            PyExpat_XML_GetParsingStatus
+#define XML_GetSpecifiedAttributeCount  PyExpat_XML_GetSpecifiedAttributeCount
+#define XmlGetUtf16InternalEncoding     PyExpat_XmlGetUtf16InternalEncoding
+#define XmlGetUtf16InternalEncodingNS   PyExpat_XmlGetUtf16InternalEncodingNS
+#define XmlGetUtf8InternalEncoding      PyExpat_XmlGetUtf8InternalEncoding
+#define XmlGetUtf8InternalEncodingNS    PyExpat_XmlGetUtf8InternalEncodingNS
+#define XmlInitEncoding                 PyExpat_XmlInitEncoding
+#define XmlInitEncodingNS               PyExpat_XmlInitEncodingNS
+#define XmlInitUnknownEncoding          PyExpat_XmlInitUnknownEncoding
+#define XmlInitUnknownEncodingNS        PyExpat_XmlInitUnknownEncodingNS
+#define XML_MemFree                     PyExpat_XML_MemFree
+#define XML_MemMalloc                   PyExpat_XML_MemMalloc
+#define XML_MemRealloc                  PyExpat_XML_MemRealloc
+#define XML_Parse                       PyExpat_XML_Parse
+#define XML_ParseBuffer                 PyExpat_XML_ParseBuffer
+#define XML_ParserCreate                PyExpat_XML_ParserCreate
+#define XML_ParserCreate_MM             PyExpat_XML_ParserCreate_MM
+#define XML_ParserCreateNS              PyExpat_XML_ParserCreateNS
+#define XML_ParserFree                  PyExpat_XML_ParserFree
+#define XML_ParserReset                 PyExpat_XML_ParserReset
+#define XmlParseXmlDecl                 PyExpat_XmlParseXmlDecl
+#define XmlParseXmlDeclNS               PyExpat_XmlParseXmlDeclNS
+#define XmlPrologStateInit              PyExpat_XmlPrologStateInit
+#define XmlPrologStateInitExternalEntity    PyExpat_XmlPrologStateInitExternalEntity
+#define XML_ResumeParser                PyExpat_XML_ResumeParser
+#define XML_SetAttlistDeclHandler       PyExpat_XML_SetAttlistDeclHandler
+#define XML_SetBase                     PyExpat_XML_SetBase
+#define XML_SetCdataSectionHandler      PyExpat_XML_SetCdataSectionHandler
+#define XML_SetCharacterDataHandler     PyExpat_XML_SetCharacterDataHandler
+#define XML_SetCommentHandler           PyExpat_XML_SetCommentHandler
+#define XML_SetDefaultHandler           PyExpat_XML_SetDefaultHandler
+#define XML_SetDefaultHandlerExpand     PyExpat_XML_SetDefaultHandlerExpand
+#define XML_SetDoctypeDeclHandler       PyExpat_XML_SetDoctypeDeclHandler
+#define XML_SetElementDeclHandler       PyExpat_XML_SetElementDeclHandler
+#define XML_SetElementHandler           PyExpat_XML_SetElementHandler
+#define XML_SetEncoding                 PyExpat_XML_SetEncoding
+#define XML_SetEndCdataSectionHandler   PyExpat_XML_SetEndCdataSectionHandler
+#define XML_SetEndDoctypeDeclHandler    PyExpat_XML_SetEndDoctypeDeclHandler
+#define XML_SetEndElementHandler        PyExpat_XML_SetEndElementHandler
+#define XML_SetEndNamespaceDeclHandler  PyExpat_XML_SetEndNamespaceDeclHandler
+#define XML_SetEntityDeclHandler        PyExpat_XML_SetEntityDeclHandler
+#define XML_SetExternalEntityRefHandler PyExpat_XML_SetExternalEntityRefHandler
+#define XML_SetExternalEntityRefHandlerArg  PyExpat_XML_SetExternalEntityRefHandlerArg
+#define XML_SetNamespaceDeclHandler     PyExpat_XML_SetNamespaceDeclHandler
+#define XML_SetNotationDeclHandler      PyExpat_XML_SetNotationDeclHandler
+#define XML_SetNotStandaloneHandler     PyExpat_XML_SetNotStandaloneHandler
+#define XML_SetParamEntityParsing       PyExpat_XML_SetParamEntityParsing
+#define XML_SetProcessingInstructionHandler PyExpat_XML_SetProcessingInstructionHandler
+#define XML_SetReturnNSTriplet          PyExpat_XML_SetReturnNSTriplet
+#define XML_SetSkippedEntityHandler     PyExpat_XML_SetSkippedEntityHandler
+#define XML_SetStartCdataSectionHandler PyExpat_XML_SetStartCdataSectionHandler
+#define XML_SetStartDoctypeDeclHandler  PyExpat_XML_SetStartDoctypeDeclHandler
+#define XML_SetStartElementHandler      PyExpat_XML_SetStartElementHandler
+#define XML_SetStartNamespaceDeclHandler    PyExpat_XML_SetStartNamespaceDeclHandler
+#define XML_SetUnknownEncodingHandler   PyExpat_XML_SetUnknownEncodingHandler
+#define XML_SetUnparsedEntityDeclHandler    PyExpat_XML_SetUnparsedEntityDeclHandler
+#define XML_SetUserData                 PyExpat_XML_SetUserData
+#define XML_SetXmlDeclHandler           PyExpat_XML_SetXmlDeclHandler
+#define XmlSizeOfUnknownEncoding        PyExpat_XmlSizeOfUnknownEncoding
+#define XML_StopParser                  PyExpat_XML_StopParser
+#define XML_UseForeignDTD               PyExpat_XML_UseForeignDTD
+#define XML_UseParserAsHandlerArg       PyExpat_XML_UseParserAsHandlerArg
+#define XmlUtf16Encode                  PyExpat_XmlUtf16Encode
+#define XmlUtf8Encode                   PyExpat_XmlUtf8Encode
+
+
+#endif /* !PYEXPATNS_H */
+
-- 
cgit v0.12

