blob: f99249c56e3cefc15e3ce6830fa29fc5e791ee83 [file] [log] [blame]
cdef struct ReaderCallbackBase:
Py_ssize_t position
Py_ssize_t maxdepth
cdef struct ReaderCallback:
ReaderCallbackBase base
PyObject *callback
PyObject *args
int32_t lookahead
ctypedef ReaderCallback &ReaderCallbackRef
cdef inline uint32_t _reader_Callback_get(ReaderCallbackRef self):
cdef int32_t c = self.lookahead
self.lookahead = -1
self.base.position += 1
return cast_to_uint32(c)
cdef int32_t _reader_Callback_good(ReaderCallbackRef self) except -1:
cdef Py_ssize_t c = -1
if self.lookahead >= 0:
return True
cdef object value = CallObject(self.callback, self.args)
if (value is None) or (value is False):
return False
if isinstance(value, int):
c = value
elif isinstance(value, ORD_CLASSES):
if not value:
return False
c = ord(value)
else:
_raise_not_ord(value, self.base.position)
if c < 0:
return False
elif c > 0x10ffff:
_raise_not_ord(value, self.base.position)
self.lookahead = c
return True