~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_rio_pyx.pyx

  • Committer: Jelmer Vernooij
  • Date: 2009-05-14 13:59:04 UTC
  • mto: (4290.1.9 rio-serializer2)
  • mto: This revision was merged to the branch mainline in revision 4368.
  • Revision ID: jelmer@samba.org-20090514135904-zcmvvzmgbdqzovun
More performance tweaks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
"""Pyrex implementation of _read_stanza_*."""
18
18
 
19
 
import re
 
19
#python2.4 support
 
20
cdef extern from "python-compat.h":
 
21
    pass
 
22
 
 
23
cdef extern from "Python.h":
 
24
    ctypedef int Py_ssize_t # Required for older pyrex versions
 
25
    char *PyString_AS_STRING(object s)
 
26
    Py_ssize_t PyString_GET_SIZE(object t)
 
27
 
 
28
cdef extern from "ctype.h":
 
29
     int isalnum(char c)
20
30
 
21
31
from bzrlib.rio import Stanza
22
32
 
23
 
_tag_re = re.compile(r'^[-a-zA-Z0-9_]+$')
24
33
def _valid_tag(tag):
25
 
    return bool(_tag_re.match(tag))
 
34
    cdef char *c_tag
 
35
    cdef int c_len
 
36
    c_tag = PyString_AS_STRING(tag)
 
37
    c_len = PyString_GET_SIZE(tag)
 
38
    for i from 0 <= i < c_len:
 
39
        if (not isalnum(c_tag[i]) and not c_tag[i] == c'_' and 
 
40
            not c_tag[i] == c'-'):
 
41
            return False
 
42
    return True
26
43
 
27
44
 
28
45
def _read_stanza_utf8(line_iter):
29
 
    stanza = Stanza()
 
46
    pairs = []
30
47
    tag = None
31
 
    accum_value = None
 
48
    accum_value = []
32
49
 
33
50
    # TODO: jam 20060922 This code should raise real errors rather than
34
51
    #       using 'assert' to process user input, or raising ValueError
38
55
            break       # end of file
39
56
        if line == '\n':
40
57
            break       # end of stanza
41
 
        real_l = line
42
58
        if line[0] == '\t': # continues previous value
43
59
            if tag is None:
44
 
                raise ValueError('invalid continuation line %r' % real_l)
 
60
                raise ValueError('invalid continuation line %r' % line)
45
61
            accum_value.append('\n' + line[1:-1])
46
62
        else: # new tag:value line
47
63
            if tag is not None:
48
 
                stanza.add(tag, ''.join(accum_value).decode('utf-8'))
 
64
                pairs.append((tag, ''.join(accum_value).decode('utf-8')))
49
65
            try:
50
66
                colon_index = line.index(': ')
51
67
            except ValueError:
52
68
                raise ValueError('tag/value separator not found in line %r'
53
 
                                 % real_l)
 
69
                                 % line)
54
70
            tag = line[:colon_index]
55
 
            if not _valid_tag(tag):
56
 
                raise ValueError("invalid rio tag %r" % (tag,))
57
 
            accum_value = line[colon_index+2:-1]
 
71
            #if not _valid_tag(tag):
 
72
            #    raise ValueError("invalid rio tag %r" % (tag,))
 
73
            accum_value = [line[colon_index+2:-1]]
58
74
    if tag is not None: # add last tag-value
59
 
        stanza.add(tag, ''.join(accum_value).decode('utf-8'))
60
 
        return stanza
 
75
        pairs.append((tag, ''.join(accum_value).decode('utf-8')))
 
76
        return Stanza.from_pairs(pairs)
61
77
    else:     # didn't see any content
62
78
        return None
63
79
 
64
80
 
65
81
def _read_stanza_unicode(unicode_iter):
66
 
    stanza = Stanza()
 
82
    pairs = []
67
83
    tag = None
68
84
    accum_value = None
69
85
 
82
98
            accum_value += '\n' + line[1:-1]
83
99
        else: # new tag:value line
84
100
            if tag is not None:
85
 
                stanza.add(tag, accum_value)
 
101
                pairs.append((tag, accum_value))
86
102
            try:
87
103
                colon_index = line.index(': ')
88
104
            except ValueError:
89
105
                raise ValueError('tag/value separator not found in line %r'
90
106
                                 % real_l)
91
107
            tag = str(line[:colon_index])
92
 
            if not _valid_tag(tag):
93
 
                raise ValueError("invalid rio tag %r" % (tag,))
 
108
            #if not _valid_tag(tag):
 
109
            #    raise ValueError("invalid rio tag %r" % (tag,))
94
110
            accum_value = line[colon_index+2:-1]
95
111
 
96
112
    if tag is not None: # add last tag-value
97
 
        stanza.add(tag, accum_value)
98
 
        return stanza
 
113
        pairs.append((tag, accum_value))
 
114
        return Stanza.from_pairs(pairs)
99
115
    else:     # didn't see any content
100
116
        return None
101
117