mirror of https://github.com/python/cpython
Use included Expat library. Drop support for older expat versions.
This commit is contained in:
parent
481f68aaa6
commit
cf453fe2a8
|
@ -6,23 +6,7 @@
|
|||
|
||||
#include "compile.h"
|
||||
#include "frameobject.h"
|
||||
#ifdef HAVE_EXPAT_H
|
||||
#include "expat.h"
|
||||
#ifdef XML_MAJOR_VERSION
|
||||
#define EXPAT_VERSION (0x10000 * XML_MAJOR_VERSION \
|
||||
+ 0x100 * XML_MINOR_VERSION \
|
||||
+ XML_MICRO_VERSION)
|
||||
#else
|
||||
/* Assume the oldest Expat that used expat.h and did not have version info */
|
||||
#define EXPAT_VERSION 0x015f00
|
||||
#endif
|
||||
#else /* !defined(HAVE_EXPAT_H) */
|
||||
#include "xmlparse.h"
|
||||
/* Assume Expat 1.1 unless told otherwise */
|
||||
#ifndef EXPAT_VERSION
|
||||
#define EXPAT_VERSION 0x010100
|
||||
#endif
|
||||
#endif /* !defined(HAVE_EXPAT_H) */
|
||||
|
||||
#ifndef PyGC_HEAD_SIZE
|
||||
#define PyGC_HEAD_SIZE 0
|
||||
|
@ -52,20 +36,12 @@ enum HandlerTypes {
|
|||
DefaultHandlerExpand,
|
||||
NotStandalone,
|
||||
ExternalEntityRef,
|
||||
#if EXPAT_VERSION >= 0x010200
|
||||
StartDoctypeDecl,
|
||||
EndDoctypeDecl,
|
||||
#endif
|
||||
#if EXPAT_VERSION == 0x010200
|
||||
ExternalParsedEntityDecl,
|
||||
InternalParsedEntityDecl,
|
||||
#endif
|
||||
#if EXPAT_VERSION >= 0x015f00
|
||||
EntityDecl,
|
||||
XmlDecl,
|
||||
ElementDecl,
|
||||
AttlistDecl,
|
||||
#endif
|
||||
_DummyDecl
|
||||
};
|
||||
|
||||
|
@ -142,94 +118,7 @@ set_error(xmlparseobject *self)
|
|||
}
|
||||
|
||||
|
||||
#if EXPAT_VERSION == 0x010200
|
||||
/* Convert an array of attributes and their values into a Python dict */
|
||||
|
||||
static PyObject *
|
||||
conv_atts_using_string(XML_Char **atts)
|
||||
{
|
||||
PyObject *attrs_obj = NULL;
|
||||
XML_Char **attrs_p, **attrs_k = NULL;
|
||||
int attrs_len;
|
||||
PyObject *rv;
|
||||
|
||||
if ((attrs_obj = PyDict_New()) == NULL)
|
||||
goto finally;
|
||||
for (attrs_len = 0, attrs_p = atts;
|
||||
*attrs_p;
|
||||
attrs_p++, attrs_len++) {
|
||||
if (attrs_len % 2) {
|
||||
rv = PyString_FromString(*attrs_p);
|
||||
if (!rv) {
|
||||
Py_DECREF(attrs_obj);
|
||||
attrs_obj = NULL;
|
||||
goto finally;
|
||||
}
|
||||
if (PyDict_SetItemString(attrs_obj,
|
||||
(char*)*attrs_k, rv) < 0) {
|
||||
Py_DECREF(attrs_obj);
|
||||
attrs_obj = NULL;
|
||||
goto finally;
|
||||
}
|
||||
Py_DECREF(rv);
|
||||
}
|
||||
else
|
||||
attrs_k = attrs_p;
|
||||
}
|
||||
finally:
|
||||
return attrs_obj;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef Py_USING_UNICODE
|
||||
#if EXPAT_VERSION == 0x010200
|
||||
static PyObject *
|
||||
conv_atts_using_unicode(XML_Char **atts)
|
||||
{
|
||||
PyObject *attrs_obj;
|
||||
XML_Char **attrs_p, **attrs_k = NULL;
|
||||
int attrs_len;
|
||||
|
||||
if ((attrs_obj = PyDict_New()) == NULL)
|
||||
goto finally;
|
||||
for (attrs_len = 0, attrs_p = atts;
|
||||
*attrs_p;
|
||||
attrs_p++, attrs_len++) {
|
||||
if (attrs_len % 2) {
|
||||
PyObject *attr_str, *value_str;
|
||||
const char *p = (const char *) (*attrs_k);
|
||||
attr_str = PyUnicode_DecodeUTF8(p, strlen(p), "strict");
|
||||
if (!attr_str) {
|
||||
Py_DECREF(attrs_obj);
|
||||
attrs_obj = NULL;
|
||||
goto finally;
|
||||
}
|
||||
p = (const char *) *attrs_p;
|
||||
value_str = PyUnicode_DecodeUTF8(p, strlen(p), "strict");
|
||||
if (!value_str) {
|
||||
Py_DECREF(attrs_obj);
|
||||
Py_DECREF(attr_str);
|
||||
attrs_obj = NULL;
|
||||
goto finally;
|
||||
}
|
||||
if (PyDict_SetItem(attrs_obj, attr_str, value_str) < 0) {
|
||||
Py_DECREF(attrs_obj);
|
||||
Py_DECREF(attr_str);
|
||||
Py_DECREF(value_str);
|
||||
attrs_obj = NULL;
|
||||
goto finally;
|
||||
}
|
||||
Py_DECREF(attr_str);
|
||||
Py_DECREF(value_str);
|
||||
}
|
||||
else
|
||||
attrs_k = attrs_p;
|
||||
}
|
||||
finally:
|
||||
return attrs_obj;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Convert a string of XML_Chars into a Unicode string.
|
||||
Returns None if str is a null pointer. */
|
||||
|
||||
|
@ -537,7 +426,6 @@ VOID_HANDLER(UnparsedEntityDecl,
|
|||
STRING_CONV_FUNC,systemId, STRING_CONV_FUNC,publicId,
|
||||
STRING_CONV_FUNC,notationName))
|
||||
|
||||
#if EXPAT_VERSION >= 0x015f00
|
||||
#ifndef Py_USING_UNICODE
|
||||
VOID_HANDLER(EntityDecl,
|
||||
(void *userData,
|
||||
|
@ -650,7 +538,6 @@ VOID_HANDLER(AttlistDecl,
|
|||
STRING_CONV_FUNC,elname, STRING_CONV_FUNC,attname,
|
||||
STRING_CONV_FUNC,att_type, STRING_CONV_FUNC,dflt,
|
||||
isrequired))
|
||||
#endif
|
||||
|
||||
VOID_HANDLER(NotationDecl,
|
||||
(void *userData,
|
||||
|
@ -726,12 +613,6 @@ RC_HANDLER(int, ExternalEntityRef,
|
|||
|
||||
/* XXX UnknownEncodingHandler */
|
||||
|
||||
#if EXPAT_VERSION == 0x010200
|
||||
VOID_HANDLER(StartDoctypeDecl,
|
||||
(void *userData, const XML_Char *doctypeName),
|
||||
("(O&OOi)", STRING_CONV_FUNC,doctypeName,
|
||||
Py_None, Py_None, -1))
|
||||
#elif EXPAT_VERSION >= 0x015f00
|
||||
VOID_HANDLER(StartDoctypeDecl,
|
||||
(void *userData, const XML_Char *doctypeName,
|
||||
const XML_Char *sysid, const XML_Char *pubid,
|
||||
|
@ -739,28 +620,8 @@ VOID_HANDLER(StartDoctypeDecl,
|
|||
("(O&O&O&i)", STRING_CONV_FUNC,doctypeName,
|
||||
STRING_CONV_FUNC,sysid, STRING_CONV_FUNC,pubid,
|
||||
has_internal_subset))
|
||||
#endif
|
||||
|
||||
#if EXPAT_VERSION >= 0x010200
|
||||
VOID_HANDLER(EndDoctypeDecl, (void *userData), ("()"))
|
||||
#endif
|
||||
|
||||
#if EXPAT_VERSION == 0x010200
|
||||
VOID_HANDLER(ExternalParsedEntityDecl,
|
||||
(void *userData, const XML_Char *entityName,
|
||||
const XML_Char *base, const XML_Char *systemId,
|
||||
const XML_Char *publicId),
|
||||
("(O&O&O&O&)", STRING_CONV_FUNC, entityName,
|
||||
STRING_CONV_FUNC, base, STRING_CONV_FUNC, systemId,
|
||||
STRING_CONV_FUNC, publicId))
|
||||
|
||||
VOID_HANDLER(InternalParsedEntityDecl,
|
||||
(void *userData, const XML_Char *entityName,
|
||||
const XML_Char *replacementText, int replacementTextLength),
|
||||
("(O&O&i)", STRING_CONV_FUNC, entityName,
|
||||
STRING_CONV_FUNC, replacementText, replacementTextLength))
|
||||
|
||||
#endif /* Expat version 1.2 & better */
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
|
@ -924,7 +785,6 @@ xmlparse_GetBase(xmlparseobject *self, PyObject *args)
|
|||
return Py_BuildValue("z", XML_GetBase(self->itself));
|
||||
}
|
||||
|
||||
#if EXPAT_VERSION >= 0x015f00
|
||||
static char xmlparse_GetInputContext__doc__[] =
|
||||
"GetInputContext() -> string\n\
|
||||
Return the untranslated text of the input that caused the current event.\n\
|
||||
|
@ -956,7 +816,6 @@ xmlparse_GetInputContext(xmlparseobject *self, PyObject *args)
|
|||
}
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
static char xmlparse_ExternalEntityParserCreate__doc__[] =
|
||||
"ExternalEntityParserCreate(context[, encoding])\n\
|
||||
|
@ -1033,8 +892,6 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
|
|||
return (PyObject *)new_parser;
|
||||
}
|
||||
|
||||
#if EXPAT_VERSION >= 0x010200
|
||||
|
||||
static char xmlparse_SetParamEntityParsing__doc__[] =
|
||||
"SetParamEntityParsing(flag) -> success\n\
|
||||
Controls parsing of parameter entities (including the external DTD\n\
|
||||
|
@ -1053,8 +910,6 @@ xmlparse_SetParamEntityParsing(xmlparseobject *p, PyObject* args)
|
|||
return PyInt_FromLong(flag);
|
||||
}
|
||||
|
||||
#endif /* Expat version 1.2 or better */
|
||||
|
||||
static struct PyMethodDef xmlparse_methods[] = {
|
||||
{"Parse", (PyCFunction)xmlparse_Parse,
|
||||
METH_VARARGS, xmlparse_Parse__doc__},
|
||||
|
@ -1066,14 +921,10 @@ static struct PyMethodDef xmlparse_methods[] = {
|
|||
METH_VARARGS, xmlparse_GetBase__doc__},
|
||||
{"ExternalEntityParserCreate", (PyCFunction)xmlparse_ExternalEntityParserCreate,
|
||||
METH_VARARGS, xmlparse_ExternalEntityParserCreate__doc__},
|
||||
#if EXPAT_VERSION >= 0x010200
|
||||
{"SetParamEntityParsing", (PyCFunction)xmlparse_SetParamEntityParsing,
|
||||
METH_VARARGS, xmlparse_SetParamEntityParsing__doc__},
|
||||
#endif
|
||||
#if EXPAT_VERSION >= 0x015f00
|
||||
{"GetInputContext", (PyCFunction)xmlparse_GetInputContext,
|
||||
METH_VARARGS, xmlparse_GetInputContext__doc__},
|
||||
#endif
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
@ -1572,7 +1423,6 @@ MODULE_INITFUNC(void)
|
|||
PyModule_AddObject(m, "XMLParserType", (PyObject *) &Xmlparsetype);
|
||||
|
||||
PyModule_AddObject(m, "__version__", get_version_string());
|
||||
#if EXPAT_VERSION >= 0x015f02
|
||||
PyModule_AddStringConstant(m, "EXPAT_VERSION",
|
||||
(char *) XML_ExpatVersion());
|
||||
{
|
||||
|
@ -1581,7 +1431,6 @@ MODULE_INITFUNC(void)
|
|||
Py_BuildValue("(iii)", info.major,
|
||||
info.minor, info.micro));
|
||||
}
|
||||
#endif
|
||||
#ifdef Py_USING_UNICODE
|
||||
init_template_buffer();
|
||||
#endif
|
||||
|
@ -1649,15 +1498,12 @@ MODULE_INITFUNC(void)
|
|||
|
||||
#undef MYCONST
|
||||
|
||||
#if EXPAT_VERSION >= 0x010200
|
||||
#define MYCONST(c) PyModule_AddIntConstant(m, #c, c)
|
||||
MYCONST(XML_PARAM_ENTITY_PARSING_NEVER);
|
||||
MYCONST(XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE);
|
||||
MYCONST(XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
#undef MYCONST
|
||||
#endif
|
||||
|
||||
#if EXPAT_VERSION >= 0x015f00
|
||||
#define MYCONST(c) PyModule_AddIntConstant(model_module, #c, c)
|
||||
PyModule_AddStringConstant(model_module, "__doc__",
|
||||
"Constants used to interpret content model information.");
|
||||
|
@ -1674,7 +1520,6 @@ MODULE_INITFUNC(void)
|
|||
MYCONST(XML_CQUANT_REP);
|
||||
MYCONST(XML_CQUANT_PLUS);
|
||||
#undef MYCONST
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1765,8 +1610,6 @@ pyxml_SetEndCdataSection(XML_Parser *parser, void *junk)
|
|||
(pairsetter)XML_SetCdataSectionHandler);
|
||||
}
|
||||
|
||||
#if EXPAT_VERSION >= 0x010200
|
||||
|
||||
static void
|
||||
pyxml_SetStartDoctypeDeclHandler(XML_Parser *parser, void *junk)
|
||||
{
|
||||
|
@ -1783,8 +1626,6 @@ pyxml_SetEndDoctypeDeclHandler(XML_Parser *parser, void *junk)
|
|||
(pairsetter)XML_SetDoctypeDeclHandler);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
statichere struct HandlerInfo handler_info[] = {
|
||||
{"StartElementHandler",
|
||||
pyxml_SetStartElementHandler,
|
||||
|
@ -1831,23 +1672,12 @@ statichere struct HandlerInfo handler_info[] = {
|
|||
{"ExternalEntityRefHandler",
|
||||
(xmlhandlersetter)XML_SetExternalEntityRefHandler,
|
||||
(xmlhandler)my_ExternalEntityRefHandler },
|
||||
#if EXPAT_VERSION >= 0x010200
|
||||
{"StartDoctypeDeclHandler",
|
||||
pyxml_SetStartDoctypeDeclHandler,
|
||||
(xmlhandler)my_StartDoctypeDeclHandler},
|
||||
{"EndDoctypeDeclHandler",
|
||||
pyxml_SetEndDoctypeDeclHandler,
|
||||
(xmlhandler)my_EndDoctypeDeclHandler},
|
||||
#endif
|
||||
#if EXPAT_VERSION == 0x010200
|
||||
{"ExternalParsedEntityDeclHandler",
|
||||
(xmlhandlersetter)XML_SetExternalParsedEntityDeclHandler,
|
||||
(xmlhandler)my_ExternalParsedEntityDeclHandler},
|
||||
{"InternalParsedEntityDeclHandler",
|
||||
(xmlhandlersetter)XML_SetInternalParsedEntityDeclHandler,
|
||||
(xmlhandler)my_InternalParsedEntityDeclHandler},
|
||||
#endif
|
||||
#if EXPAT_VERSION >= 0x015f00
|
||||
{"EntityDeclHandler",
|
||||
(xmlhandlersetter)XML_SetEntityDeclHandler,
|
||||
(xmlhandler)my_EntityDeclHandler},
|
||||
|
@ -1860,7 +1690,6 @@ statichere struct HandlerInfo handler_info[] = {
|
|||
{"AttlistDeclHandler",
|
||||
(xmlhandlersetter)XML_SetAttlistDeclHandler,
|
||||
(xmlhandler)my_AttlistDeclHandler},
|
||||
#endif /* Expat version 1.95 or better */
|
||||
|
||||
{NULL, NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
|
52
setup.py
52
setup.py
|
@ -550,35 +550,31 @@ class PyBuildExt(build_ext):
|
|||
#
|
||||
# Expat is written by James Clark and must be downloaded separately
|
||||
# (see below). The pyexpat module was written by Paul Prescod after a
|
||||
# prototype by Jack Jansen.
|
||||
#
|
||||
# The Expat dist includes Windows .lib and .dll files. Home page is
|
||||
# at http://www.jclark.com/xml/expat.html, the current production
|
||||
# release is always ftp://ftp.jclark.com/pub/xml/expat.zip.
|
||||
#
|
||||
# EXPAT_DIR, below, should point to the expat/ directory created by
|
||||
# unpacking the Expat source distribution.
|
||||
#
|
||||
# Note: the expat build process doesn't yet build a libexpat.a; you
|
||||
# can do this manually while we try convince the author to add it. To
|
||||
# do so, cd to EXPAT_DIR, run "make" if you have not done so, then
|
||||
# run:
|
||||
#
|
||||
# ar cr libexpat.a xmltok/*.o xmlparse/*.o
|
||||
#
|
||||
expat_defs = []
|
||||
expat_incs = find_file('expat.h', inc_dirs, [])
|
||||
if expat_incs is not None:
|
||||
# expat.h was found
|
||||
expat_defs = [('HAVE_EXPAT_H', 1)]
|
||||
# prototype by Jack Jansen. Source of Expat 1.95.2 is included
|
||||
# in Modules/expat. Usage of a system shared libexpat.so/expat.dll
|
||||
# is only advised if that has the same or newer version and was
|
||||
# build using the same defines.
|
||||
if sys.byteorder == "little":
|
||||
xmlbo = "12"
|
||||
else:
|
||||
expat_incs = find_file('xmlparse.h', inc_dirs, [])
|
||||
|
||||
if (expat_incs is not None and
|
||||
self.compiler.find_library_file(lib_dirs, 'expat')):
|
||||
exts.append( Extension('pyexpat', ['pyexpat.c'],
|
||||
define_macros = expat_defs,
|
||||
libraries = ['expat']) )
|
||||
xmlbo = "21"
|
||||
exts.append(Extension('pyexpat',
|
||||
sources = [
|
||||
'pyexpat.c',
|
||||
'expat/xmlparse.c',
|
||||
'expat/xmlrole.c',
|
||||
'expat/xmltok.c',
|
||||
],
|
||||
define_macros = [
|
||||
('HAVE_EXPAT_H',None),
|
||||
('VERSION', '"1.95.2"'),
|
||||
('XML_NS', '1'),
|
||||
('XML_DTD', '1'),
|
||||
('XML_BYTE_ORDER', xmlbo),
|
||||
('XML_CONTEXT_BYTES','1024'),
|
||||
],
|
||||
include_dirs = ['Modules/expat']
|
||||
))
|
||||
|
||||
# Dynamic loading module
|
||||
dl_inc = find_file('dlfcn.h', [], inc_dirs)
|
||||
|
|
Loading…
Reference in New Issue