@@ -64,24 +64,33 @@ class DefList:
64
64
a line number and a file family.
65
65
Also stores in which families the ident exists for faster tests.'''
66
66
def __init__ (self , data = b'#' ):
67
- self .data , self .families = data .split (b'#' )
67
+ data , self .families = data .split (b'#' )
68
+ self .entries = [self .decode_entry (d ) for d in deflist_regex .findall (data )]
69
+ self .sorted = False
70
+
71
+ def decode_entry (self , entry ):
72
+ id = int (entry [0 ])
73
+ type = defTypeR [entry [1 ].decode ()]
74
+ line = int (entry [2 ])
75
+ family = entry [3 ].decode ()
76
+ return id , type , line , family
77
+
78
+ def encode_entry (self , entry ):
79
+ return str (entry [0 ]) + defTypeD [entry [1 ]] + str (entry [2 ]) + entry [3 ]
68
80
69
81
def iter (self , dummy = False ):
70
82
# Get all element in a list of sublists and sort them
71
- entries = deflist_regex .findall (self .data )
72
- entries .sort (key = lambda x :int (x [0 ]))
73
- for id , type , line , family in entries :
74
- id = int (id )
75
- type = defTypeR [type .decode ()]
76
- line = int (line )
77
- family = family .decode ()
83
+ if not self .sorted :
84
+ self .entries .sort (key = lambda x :int (x [0 ]))
85
+ self .sorted = True
86
+
87
+ for id , type , line , family in self .entries :
78
88
yield id , type , line , family
79
89
if dummy :
80
90
yield maxId , None , None , None
81
91
82
92
def exists (self , idx , line_num ):
83
- entries = deflist_regex .findall (self .data )
84
- for id , _ , line , _ in entries :
93
+ for id , _ , line , _ in self .entries :
85
94
if id == idx and int (line ) == line_num :
86
95
return True
87
96
@@ -90,14 +99,18 @@ def exists(self, idx, line_num):
90
99
def append (self , id , type , line , family ):
91
100
if type not in defTypeD :
92
101
return
93
- p = str (id ) + defTypeD [type ] + str (line ) + family
94
- if self .data != b'' :
95
- p = ',' + p
96
- self .data += p .encode ()
102
+
103
+ self .sorted = False
104
+ self .entries .append ((id , type , line , family ))
97
105
self .add_family (family )
98
106
99
107
def pack (self ):
100
- return self .data + b'#' + self .families
108
+ if not self .sorted :
109
+ self .entries .sort (key = lambda x :int (x [0 ]))
110
+ self .sorted = True
111
+
112
+ data = "," .join (self .encode_entry (entry ) for entry in self .entries )
113
+ return data .encode () + b'#' + self .families
101
114
102
115
def add_family (self , family ):
103
116
family = family .encode ()
@@ -110,7 +123,7 @@ def get_families(self):
110
123
return self .families .decode ().split (',' )
111
124
112
125
def get_macros (self ):
113
- return deflist_macro_regex . findall ( self .data . decode ()) or ''
126
+ return [ entry [ 3 ] for entry in self .entries if entry [ 1 ] == 'macro' ]
114
127
115
128
class PathList :
116
129
'''Stores associations between a blob ID and a file path.
@@ -139,25 +152,36 @@ class RefList:
139
152
and the corresponding family.'''
140
153
def __init__ (self , data = b'' ):
141
154
self .data = data
155
+ self .entries = [self .decode_entry (x .split (b':' )) for x in self .data .split (b'\n ' )[:- 1 ]]
156
+ self .sorted = False
157
+
158
+ def decode_entry (self , k ):
159
+ return (int (k [0 ].decode ()), k [1 ].decode (), k [2 ].decode ())
142
160
143
161
def iter (self , dummy = False ):
144
162
# Split all elements in a list of sublists and sort them
145
- entries = [x .split (b':' ) for x in self .data .split (b'\n ' )[:- 1 ]]
146
- entries .sort (key = lambda x :int (x [0 ]))
147
- for b , c , d in entries :
148
- b = int (b .decode ())
149
- c = c .decode ()
150
- d = d .decode ()
163
+ if not self .sorted :
164
+ self .sorted = True
165
+ self .entries .sort (key = lambda x :int (x [0 ]))
166
+
167
+ for b , c , d in self .entries :
151
168
yield b , c , d
152
169
if dummy :
153
170
yield maxId , None , None
154
171
155
172
def append (self , id , lines , family ):
156
- p = str ( id ) + ':' + lines + ':' + family + ' \n '
157
- self .data += p . encode ( )
173
+ self . sorted = False
174
+ self .entries . append (( id , lines , family ) )
158
175
159
176
def pack (self ):
160
- return self .data
177
+ if not self .sorted :
178
+ self .sorted = True
179
+ self .entries .sort (key = lambda x :int (x [0 ]))
180
+
181
+ result = ""
182
+ for id , lines , family in self .entries :
183
+ result += str (id ) + ":" + lines + ":" + family + "\n "
184
+ return result .encode ()
161
185
162
186
class BsdDB :
163
187
def __init__ (self , filename , readonly , contentType , shared = False , cachesize = None ):
@@ -230,16 +254,14 @@ def exists(self, key):
230
254
if key in self .cache :
231
255
return True
232
256
233
- key = autoBytes (key )
234
- return self .db .exists (key )
257
+ return self .db .exists (autoBytes (key ))
235
258
236
259
def get (self , key ):
237
260
if key in self .cache :
238
261
self .cache .move_to_end (key )
239
262
return self .cache [key ]
240
263
241
- key = autoBytes (key )
242
- p = self .db .get (key )
264
+ p = self .db .get (autoBytes (key ))
243
265
if p is None :
244
266
return None
245
267
p = self .ctype (p )
0 commit comments