29
29
object PyString_FromStringAndSize(char *v, Py_ssize_t len)
30
30
char *PyString_AS_STRING(object o) except NULL
31
31
Py_ssize_t PyString_GET_SIZE(object o) except -1
32
object PyLong_FromString(char *str, char **pend, int base)
32
object PyInt_FromString(char *str, char **pend, int base)
34
34
cdef extern from "stddef.h":
35
35
ctypedef unsigned int size_t
43
43
cdef extern from "string.h":
44
44
void *memcpy(void *dest, void *src, size_t count)
45
char *strndup(char *src, size_t count)
47
46
cdef extern from "python-compat.h":
48
47
int snprintf(char* buffer, size_t nsize, char* fmt, ...)
100
99
self.size = self.size - n
101
100
self.tail = &self.tail[n]
103
cdef char *_read_digits(self, char stop_char) except NULL:
102
cdef int _read_digits(self, char stop_char) except -1:
106
105
while ((self.tail[i] >= c'0' and self.tail[i] <= c'9') or
107
106
self.tail[i] == c'-') and i < self.size:
113
112
if (self.tail[0] == c'0' or
114
113
(self.tail[0] == c'-' and self.tail[1] == c'0')):
116
self._update_tail(i+1)
117
return strndup("0", 1)
119
117
raise ValueError # leading zeroes are not allowed
120
ret = <char*>strndup(self.tail, i)
120
cdef object _decode_int(self):
121
cdef char longstr[32], *tail
123
i = self._read_digits(c'e')
124
if i > sizeof(longstr)-1:
125
raise ValueError("long data too big")
126
memcpy(longstr, self.tail, i)
128
ret = PyInt_FromString(longstr, NULL, 10)
123
129
self._update_tail(i+1)
126
cdef object _decode_int(self):
127
cdef char *longstr, *tail
128
longstr = self._read_digits(c'e')
129
result = PyLong_FromString(longstr, &tail, 10)
133
132
cdef object _decode_string(self):
134
cdef char *longstr, *tail
136
longstr = self._read_digits(c':')
138
n = strtol(longstr, &tail, 10)
140
raise ValueError("Tail invalid: %s" % longstr)
134
i = self._read_digits(c':')
135
n = strtol(self.tail, NULL, 10)
136
self._update_tail(i+1)
144
139
if n > self.size: