mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-29 11:41:22 +03:00
applied patch from Malcolm Tredinnick fixing bug #154294 related to saving
* python/generator.py python/libxml.c python/tests/outbuf.py: applied patch from Malcolm Tredinnick fixing bug #154294 related to saving to python file objects. Daniel
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
Mon Oct 4 12:26:28 CEST 2004 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
|
* python/generator.py python/libxml.c python/tests/outbuf.py:
|
||||||
|
applied patch from Malcolm Tredinnick fixing bug #154294
|
||||||
|
related to saving to python file objects.
|
||||||
|
|
||||||
Sat Oct 2 21:08:51 PDT 2004 William Brack <wbrack@mmm.com.hk>
|
Sat Oct 2 21:08:51 PDT 2004 William Brack <wbrack@mmm.com.hk>
|
||||||
|
|
||||||
* tree.c: changed xmlHasNsProp to properly handle a request for
|
* tree.c: changed xmlHasNsProp to properly handle a request for
|
||||||
|
@ -300,6 +300,13 @@ unknown_types = {}
|
|||||||
#
|
#
|
||||||
#######################################################################
|
#######################################################################
|
||||||
|
|
||||||
|
# Class methods which are written by hand in libxml.c but the Python-level
|
||||||
|
# code is still automatically generated (so they are not in skip_function()).
|
||||||
|
skip_impl = (
|
||||||
|
'xmlSaveFileTo',
|
||||||
|
'xmlSaveFormatFileTo',
|
||||||
|
)
|
||||||
|
|
||||||
def skip_function(name):
|
def skip_function(name):
|
||||||
if name[0:12] == "xmlXPathWrap":
|
if name[0:12] == "xmlXPathWrap":
|
||||||
return 1
|
return 1
|
||||||
@ -356,6 +363,9 @@ def print_function_wrapper(name, output, export, include):
|
|||||||
return 0
|
return 0
|
||||||
if skip_function(name) == 1:
|
if skip_function(name) == 1:
|
||||||
return 0
|
return 0
|
||||||
|
if name in skip_impl:
|
||||||
|
# Don't delete the function entry in the caller.
|
||||||
|
return 1
|
||||||
|
|
||||||
c_call = "";
|
c_call = "";
|
||||||
format=""
|
format=""
|
||||||
|
@ -512,6 +512,11 @@ libxml_xmlOutputBufferClose(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|||||||
if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferClose", &pyobj_out))
|
if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferClose", &pyobj_out))
|
||||||
return(NULL);
|
return(NULL);
|
||||||
out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out);
|
out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out);
|
||||||
|
/* Buffer may already have been destroyed elsewhere. This is harmless. */
|
||||||
|
if (out == NULL) {
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return(Py_None);
|
||||||
|
}
|
||||||
|
|
||||||
c_retval = xmlOutputBufferClose(out);
|
c_retval = xmlOutputBufferClose(out);
|
||||||
py_retval = libxml_intWrap((int) c_retval);
|
py_retval = libxml_intWrap((int) c_retval);
|
||||||
@ -533,6 +538,53 @@ libxml_xmlOutputBufferFlush(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|||||||
py_retval = libxml_intWrap((int) c_retval);
|
py_retval = libxml_intWrap((int) c_retval);
|
||||||
return(py_retval);
|
return(py_retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
libxml_xmlSaveFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
||||||
|
PyObject *py_retval;
|
||||||
|
int c_retval;
|
||||||
|
xmlOutputBufferPtr buf;
|
||||||
|
PyObject *pyobj_buf;
|
||||||
|
xmlDocPtr cur;
|
||||||
|
PyObject *pyobj_cur;
|
||||||
|
char * encoding;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, (char *)"OOz:xmlSaveFileTo", &pyobj_buf, &pyobj_cur, &encoding))
|
||||||
|
return(NULL);
|
||||||
|
buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf);
|
||||||
|
cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur);
|
||||||
|
|
||||||
|
c_retval = xmlSaveFileTo(buf, cur, encoding);
|
||||||
|
/* xmlSaveTo() freed the memory pointed to by buf, so record that in the
|
||||||
|
* Python object. */
|
||||||
|
((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL;
|
||||||
|
py_retval = libxml_intWrap((int) c_retval);
|
||||||
|
return(py_retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
libxml_xmlSaveFormatFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
||||||
|
PyObject *py_retval;
|
||||||
|
int c_retval;
|
||||||
|
xmlOutputBufferPtr buf;
|
||||||
|
PyObject *pyobj_buf;
|
||||||
|
xmlDocPtr cur;
|
||||||
|
PyObject *pyobj_cur;
|
||||||
|
char * encoding;
|
||||||
|
int format;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, (char *)"OOzi:xmlSaveFormatFileTo", &pyobj_buf, &pyobj_cur, &encoding, &format))
|
||||||
|
return(NULL);
|
||||||
|
buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf);
|
||||||
|
cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur);
|
||||||
|
|
||||||
|
c_retval = xmlSaveFormatFileTo(buf, cur, encoding, format);
|
||||||
|
/* xmlSaveFormatFileTo() freed the memory pointed to by buf, so record that
|
||||||
|
* in the Python object */
|
||||||
|
((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL;
|
||||||
|
py_retval = libxml_intWrap((int) c_retval);
|
||||||
|
return(py_retval);
|
||||||
|
}
|
||||||
#endif /* LIBXML_OUTPUT_ENABLED */
|
#endif /* LIBXML_OUTPUT_ENABLED */
|
||||||
|
|
||||||
|
|
||||||
@ -3446,6 +3498,8 @@ static PyMethodDef libxmlMethods[] = {
|
|||||||
{(char *) "outputBufferGetPythonFile", libxml_outputBufferGetPythonFile, METH_VARARGS, NULL},
|
{(char *) "outputBufferGetPythonFile", libxml_outputBufferGetPythonFile, METH_VARARGS, NULL},
|
||||||
{(char *) "xmlOutputBufferClose", libxml_xmlOutputBufferClose, METH_VARARGS, NULL},
|
{(char *) "xmlOutputBufferClose", libxml_xmlOutputBufferClose, METH_VARARGS, NULL},
|
||||||
{ (char *)"xmlOutputBufferFlush", libxml_xmlOutputBufferFlush, METH_VARARGS, NULL },
|
{ (char *)"xmlOutputBufferFlush", libxml_xmlOutputBufferFlush, METH_VARARGS, NULL },
|
||||||
|
{ (char *)"xmlSaveFileTo", libxml_xmlSaveFileTo, METH_VARARGS, NULL },
|
||||||
|
{ (char *)"xmlSaveFormatFileTo", libxml_xmlSaveFormatFileTo, METH_VARARGS, NULL },
|
||||||
#endif /* LIBXML_OUTPUT_ENABLED */
|
#endif /* LIBXML_OUTPUT_ENABLED */
|
||||||
{(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL},
|
{(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL},
|
||||||
{(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL},
|
{(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL},
|
||||||
|
@ -3,31 +3,103 @@ import sys
|
|||||||
import libxml2
|
import libxml2
|
||||||
import StringIO
|
import StringIO
|
||||||
|
|
||||||
#print "Skipped"
|
def testSimpleBufferWrites():
|
||||||
#sys.exit(1)
|
f = StringIO.StringIO()
|
||||||
|
buf = libxml2.createOutputBuffer(f, "ISO-8859-1")
|
||||||
|
buf.write(3, "foo")
|
||||||
|
buf.writeString("bar")
|
||||||
|
buf.close()
|
||||||
|
|
||||||
|
if f.getvalue() != "foobar":
|
||||||
|
print "Failed to save to StringIO"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
# Memory debug specific
|
def testSaveDocToBuffer():
|
||||||
libxml2.debugMemory(1)
|
"""
|
||||||
|
Regression test for bug #154294.
|
||||||
|
"""
|
||||||
|
input = '<foo>Hello</foo>'
|
||||||
|
expected = '''\
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<foo>Hello</foo>
|
||||||
|
'''
|
||||||
|
f = StringIO.StringIO()
|
||||||
|
buf = libxml2.createOutputBuffer(f, 'UTF-8')
|
||||||
|
doc = libxml2.parseDoc(input)
|
||||||
|
doc.saveFileTo(buf, 'UTF-8')
|
||||||
|
doc.freeDoc()
|
||||||
|
if f.getvalue() != expected:
|
||||||
|
print 'xmlDoc.saveFileTo() call failed.'
|
||||||
|
print ' got: %s' % repr(f.getvalue())
|
||||||
|
print 'expected: %s' % repr(expected)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
#f = open('res', 'w')
|
def testSaveFormattedDocToBuffer():
|
||||||
f = StringIO.StringIO()
|
input = '<outer><inner>Some text</inner><inner/></outer>'
|
||||||
buf = libxml2.createOutputBuffer(f, "ISO-8859-1")
|
# The formatted and non-formatted versions of the output.
|
||||||
buf.write(3, "foo")
|
expected = ('''\
|
||||||
buf.writeString("bar")
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
buf.close()
|
<outer><inner>Some text</inner><inner/></outer>
|
||||||
|
''', '''\
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<outer>
|
||||||
|
<inner>Some text</inner>
|
||||||
|
<inner/>
|
||||||
|
</outer>
|
||||||
|
''')
|
||||||
|
doc = libxml2.parseDoc(input)
|
||||||
|
for i in (0, 1):
|
||||||
|
f = StringIO.StringIO()
|
||||||
|
buf = libxml2.createOutputBuffer(f, 'UTF-8')
|
||||||
|
doc.saveFormatFileTo(buf, 'UTF-8', i)
|
||||||
|
if f.getvalue() != expected[i]:
|
||||||
|
print 'xmlDoc.saveFormatFileTo() call failed.'
|
||||||
|
print ' got: %s' % repr(f.getvalue())
|
||||||
|
print 'expected: %s' % repr(expected[i])
|
||||||
|
sys.exit(1)
|
||||||
|
doc.freeDoc()
|
||||||
|
|
||||||
if f.getvalue() != "foobar":
|
def testSaveIntoOutputBuffer():
|
||||||
print "Failed to save to StringIO"
|
"""
|
||||||
sys.exit(1)
|
Similar to the previous two tests, except this time we invoke the save
|
||||||
|
methods on the output buffer object and pass in an XML node object.
|
||||||
|
"""
|
||||||
|
input = '<foo>Hello</foo>'
|
||||||
|
expected = '''\
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<foo>Hello</foo>
|
||||||
|
'''
|
||||||
|
f = StringIO.StringIO()
|
||||||
|
doc = libxml2.parseDoc(input)
|
||||||
|
buf = libxml2.createOutputBuffer(f, 'UTF-8')
|
||||||
|
buf.saveFileTo(doc, 'UTF-8')
|
||||||
|
if f.getvalue() != expected:
|
||||||
|
print 'outputBuffer.saveFileTo() call failed.'
|
||||||
|
print ' got: %s' % repr(f.getvalue())
|
||||||
|
print 'expected: %s' % repr(expected)
|
||||||
|
sys.exit(1)
|
||||||
|
f = StringIO.StringIO()
|
||||||
|
buf = libxml2.createOutputBuffer(f, 'UTF-8')
|
||||||
|
buf.saveFormatFileTo(doc, 'UTF-8', 1)
|
||||||
|
if f.getvalue() != expected:
|
||||||
|
print 'outputBuffer.saveFormatFileTo() call failed.'
|
||||||
|
print ' got: %s' % repr(f.getvalue())
|
||||||
|
print 'expected: %s' % repr(expected)
|
||||||
|
sys.exit(1)
|
||||||
|
doc.freeDoc()
|
||||||
|
|
||||||
del buf
|
if __name__ == '__main__':
|
||||||
del f
|
# Memory debug specific
|
||||||
|
libxml2.debugMemory(1)
|
||||||
|
|
||||||
# Memory debug specific
|
testSimpleBufferWrites()
|
||||||
libxml2.cleanupParser()
|
testSaveDocToBuffer()
|
||||||
if libxml2.debugMemory(1) == 0:
|
testSaveFormattedDocToBuffer()
|
||||||
print "OK"
|
testSaveIntoOutputBuffer()
|
||||||
else:
|
|
||||||
print "Memory leak %d bytes" % (libxml2.debugMemory(1))
|
|
||||||
libxml2.dumpMemory()
|
|
||||||
|
|
||||||
|
libxml2.cleanupParser()
|
||||||
|
if libxml2.debugMemory(1) == 0:
|
||||||
|
print "OK"
|
||||||
|
else:
|
||||||
|
print "Memory leak %d bytes" % (libxml2.debugMemory(1))
|
||||||
|
libxml2.dumpMemory()
|
||||||
|
Reference in New Issue
Block a user