/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/_bencode_c.pyx

  • Committer: Jelmer Vernooij
  • Date: 2009-05-27 14:39:03 UTC
  • mto: (4398.5.1 bencode_serializer)
  • mto: This revision was merged to the branch mainline in revision 4410.
  • Revision ID: jelmer@samba.org-20090527143903-sra474i25jj0vnfs
Avoid using malloc in the inner loop.
Use PyInt_FromString rather than PyLong_FromString so we end up with Int objects when possible.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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)
33
33
 
34
34
cdef extern from "stddef.h":
35
35
    ctypedef unsigned int size_t
42
42
 
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)
46
45
 
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]
102
101
 
103
 
    cdef char *_read_digits(self, char stop_char) except NULL:
104
 
        cdef char *ret
 
102
    cdef int _read_digits(self, char stop_char) except -1:
 
103
        cdef int i
105
104
        i = 0
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')):
115
114
            if i == 1:
116
 
                self._update_tail(i+1)
117
 
                return strndup("0", 1)
 
115
                return i
118
116
            else:
119
117
                raise ValueError # leading zeroes are not allowed
120
 
        ret = <char*>strndup(self.tail, i)
121
 
        if NULL == ret:
122
 
            raise MemoryError 
 
118
        return i
 
119
 
 
120
    cdef object _decode_int(self):
 
121
        cdef char longstr[32], *tail
 
122
        cdef int i
 
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)
 
127
        longstr[i] = c'\0'
 
128
        ret = PyInt_FromString(longstr, NULL, 10)
123
129
        self._update_tail(i+1)
124
130
        return ret
125
131
 
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)
130
 
        free(longstr)
131
 
        return result
132
 
 
133
132
    cdef object _decode_string(self):
134
 
        cdef char *longstr, *tail
135
 
        cdef int n
136
 
        longstr = self._read_digits(c':')
137
 
        # long int
138
 
        n = strtol(longstr, &tail, 10)
139
 
        if tail[0] != c'\0':
140
 
            raise ValueError("Tail invalid: %s" % longstr)
141
 
        free(longstr)
 
133
        cdef int n, i
 
134
        i = self._read_digits(c':')
 
135
        n = strtol(self.tail, NULL, 10)
 
136
        self._update_tail(i+1)
142
137
        if n == 0:
143
138
            return ''
144
139
        if n > self.size: