[pypy-svn] r55312 - pypy/dist/pypy/lib
fijal at codespeak.net
fijal at codespeak.net
Tue May 27 19:34:27 CEST 2008
Author: fijal
Date: Tue May 27 19:34:25 2008
New Revision: 55312
Modified:
pypy/dist/pypy/lib/pyexpat.py
Log:
Enough support to run the same amount of minidom tests as python2.5
Modified: pypy/dist/pypy/lib/pyexpat.py
==============================================================================
--- pypy/dist/pypy/lib/pyexpat.py (original)
+++ pypy/dist/pypy/lib/pyexpat.py Tue May 27 19:34:25 2008
@@ -39,6 +39,13 @@
func.args = [XML_Parser]
func.result = c_int
+XML_SetReturnNSTriplet = lib.XML_SetReturnNSTriplet
+XML_SetReturnNSTriplet.args = [XML_Parser, c_int]
+XML_SetReturnNSTriplet.result = None
+XML_GetSpecifiedAttributeCount = lib.XML_GetSpecifiedAttributeCount
+XML_GetSpecifiedAttributeCount.args = [XML_Parser]
+XML_GetSpecifiedAttributeCount.result = c_int
+
handler_names = [
'StartElement',
'EndElement',
@@ -101,6 +108,7 @@
self.buffer = None
self.buffer_size = 8192
self.character_data_handler = None
+ self.intern = {}
def _flush_character_buffer(self):
if not self.buffer:
@@ -127,6 +135,9 @@
except KeyError:
cb = getattr(self, 'get_cb_for_%s' % name)(real_cb)
self.storage[(name, real_cb)] = cb
+ except TypeError:
+ # weellll...
+ cb = getattr(self, 'get_cb_for_%s' % name)(real_cb)
setter(self.itself, cb)
def get_cb_for_StartElementHandler(self, real_cb):
@@ -135,9 +146,9 @@
conv = self.conv
self._flush_character_buffer()
if self.specified_attributes:
- import pdb
- pdb.set_trace()
- max = 0
+ max = XML_GetSpecifiedAttributeCount(self.itself)
+ else:
+ max = 0
while attrs[max]:
max += 2 # copied
if self.ordered_attributes:
@@ -179,6 +190,26 @@
CB = ctypes.CFUNCTYPE(None, c_void_p, POINTER(c_char), c_int)
return CB(CharacterData)
+ def get_cb_for_EntityDeclHandler(self, real_cb):
+ def EntityDecl(unused, ename, is_param, value, _, base, system_id,
+ pub_id, not_name):
+
+ self._flush_character_buffer()
+ args = [ename, is_param, value, base, system_id,
+ pub_id, not_name]
+ args = [self.conv(arg) for arg in args]
+ real_cb(*args)
+ CB = ctypes.CFUNCTYPE(None, c_void_p, c_char_p, c_int, c_char_p,
+ c_int, c_char_p, c_char_p, c_char_p, c_char_p)
+ return CB(EntityDecl)
+
+ def get_cb_for_ElementDeclHandler(self, real_cb):
+ # XXX this is broken, needs tests
+ def ElementDecl(unused, *args):
+ pass
+ CB = ctypes.CFUNCTYPE(None, c_void_p, c_char_p, c_void_p)
+ return CB(ElementDecl)
+
def _new_callback_for_string_len(name, sign):
def get_callback_for_(self, real_cb):
def func(unused, s, len):
@@ -209,7 +240,7 @@
get_callback_for_.func_name = 'get_cb_for_' + name
return get_callback_for_
- for name, num in [
+ for name, num_or_sign in [
('EndElementHandler', 1),
('ProcessingInstructionHandler', 2),
('UnparsedEntityDeclHandler', 5),
@@ -218,13 +249,21 @@
('EndNamespaceDeclHandler', 1),
('CommentHandler', 1),
('StartCdataSectionHandler', 0),
- ('EndCdataSectionHandler', 0)]:
- sign = [None, c_void_p] + [c_char_p] * num
+ ('EndCdataSectionHandler', 0),
+ ('StartDoctypeDeclHandler', [None, c_void_p] + [c_char_p] * 3 + [c_int]),
+ ('XmlDeclHandler', [None, c_void_p, c_char_p, c_char_p, c_int]),
+ ('AttlistDeclHandler', [None, c_void_p] + [c_char_p] * 4 + [c_int]),
+ ('EndDoctypeDeclHandler', 0),
+ ]:
+ if isinstance(num_or_sign, int):
+ sign = [None, c_void_p] + [c_char_p] * num_or_sign
+ else:
+ sign = num_or_sign
name = 'get_cb_for_' + name
locals()[name] = _new_callback_for_starargs(name, sign)
def conv_unicode(self, s):
- if s is None:
+ if s is None or isinstance(s, int):
return s
return s.decode(self.encoding)
@@ -247,7 +286,7 @@
self._flush_character_buffer()
self.buffer = None
elif name == 'namespace_prefixes':
- xxx
+ XML_SetReturnNSTriplet(self.itself, int(bool(value)))
elif name in setters:
if name == 'CharacterDataHandler':
# XXX we need to flush buffer here
More information about the Pypy-commit
mailing list