@@ -22,6 +22,7 @@ type rowreader = {
22
22
f : io:: reader ,
23
23
mut offset : uint ,
24
24
mut buffers : [ [ char ] ] ,
25
+ mut bufferlens : [ uint ] ,
25
26
mut state : state ,
26
27
mut trailing_nl : bool ,
27
28
mut terminating : bool
@@ -58,6 +59,7 @@ fn new_reader_readlen(+f: io::reader, +delim: char, +quote: char, rl: uint) -> r
58
59
f: f,
59
60
mut offset : 0 u,
60
61
mut buffers : [ ] ,
62
+ mut bufferlens: [ ] ,
61
63
mut state : fieldstart ( false ) ,
62
64
mut trailing_nl : false ,
63
65
mut terminating: false
@@ -98,23 +100,27 @@ fn unescape(escaped: [char]) -> [char] {
98
100
}
99
101
100
102
impl of rowiter for rowreader {
103
+ #[ inline]
101
104
fn readrow ( & row: [ str ] ) -> bool {
102
105
fn row_from_buf ( self : rowreader , & fields: [ str ] ) -> bool {
103
106
fn decode ( buffers : [ [ char ] ] , field : fieldtype ) -> str {
104
107
alt field {
105
108
emptyfield( ) { "" }
106
109
bufferfield ( desc) {
107
110
let mut buf = [ ] ;
108
- {
109
- let mut i = desc. sb ;
110
- while i <= desc. eb {
111
- let from = if ( i == desc. sb )
112
- { desc. start } else { 0 u } ;
113
- let to = if ( i == desc. eb )
114
- { desc. end } else { vec:: len ( buffers[ i] ) } ;
115
- buf += vec:: slice ( buffers[ i] , from, to) ;
116
- i = i + 1 u;
111
+ vec:: reserve ( buf, 256 u) ;
112
+ let mut i = desc. sb ;
113
+ while i <= desc. eb {
114
+ let from = if ( i == desc. sb )
115
+ { desc. start } else { 0 u } ;
116
+ let to = if ( i == desc. eb )
117
+ { desc. end } else { vec:: len ( buffers[ i] ) } ;
118
+ let mut j = from;
119
+ while j < to {
120
+ buf += [ buffers[ i] [ j] ] ;
121
+ j += 1 u;
117
122
}
123
+ i = i + 1 u;
118
124
}
119
125
if desc. escaped {
120
126
buf = unescape ( buf) ;
@@ -123,20 +129,21 @@ impl of rowiter for rowreader {
123
129
}
124
130
}
125
131
}
132
+ #[ inline]
126
133
fn new_bufferfield ( self : rowreader , escaped : bool , sb : uint , so : uint , eo : uint ) -> fieldtype {
127
134
let mut eb = vec:: len ( self . buffers ) - 1 u;
128
135
let mut sb = sb, so = so, eo = eo;
129
136
if escaped {
130
137
so += 1 u;
131
- if so > vec :: len ( self . buffers [ sb] ) {
138
+ if so > self . bufferlens [ sb] {
132
139
sb += 1 u;
133
- so = vec :: len ( self . buffers [ sb] ) - 1 u;
140
+ so = self . bufferlens [ sb] - 1 u;
134
141
}
135
142
if eo > 0 u {
136
143
eo -= 1 u;
137
144
} else {
138
145
eb -= 1 u;
139
- eo = vec :: len ( self . buffers [ eb] ) - 1 u;
146
+ eo = self . bufferlens [ eb] - 1 u;
140
147
}
141
148
}
142
149
bufferfield ( { escaped: escaped, sb: sb, eb: eb, start: so, end: eo } )
@@ -201,11 +208,10 @@ impl of rowiter for rowreader {
201
208
}
202
209
self . state = fieldstart( false) ;
203
210
let mut do_read = vec:: len ( self . buffers ) == 0 u;
204
-
211
+ row = [ ] ;
205
212
while ! self. terminating {
206
213
if do_read {
207
214
let mut data = self . f. read_chars( self . readlen) ;
208
- //log(error, ("aa", str::from_chars(data)));
209
215
if vec:: len( data) == 0 u {
210
216
if !self . trailing_nl {
211
217
self . terminating = true ;
@@ -223,12 +229,15 @@ impl of rowiter for rowreader {
223
229
}
224
230
self . trailing_nl = data[ data_len - 1 u] == '\n' ;
225
231
self . buffers += [ data] ;
232
+ self . bufferlens += [ data_len] ;
226
233
self . offset = 0 u;
227
234
}
228
235
229
236
if row_from_buf( self , row) {
230
- if vec:: len( self . buffers) > 1 u {
231
- self . buffers = vec:: slice( self . buffers, vec:: len( self . buffers) - 1 u, vec:: len( self . buffers) ) ;
237
+ let buflen = vec:: len( self . buffers) ;
238
+ if buflen > 1 u {
239
+ self . buffers = [ self . buffers[ buflen-1 u] ] ;
240
+ self . bufferlens = [ self . bufferlens[ buflen-1 u] ] ;
232
241
}
233
242
ret true ;
234
243
}
@@ -244,6 +253,7 @@ fn hashmap_iter_cols(r: rowreader, cols: [str], f: fn(map::hashmap<str, str>)) {
244
253
let m : map:: hashmap < str , str > = map:: str_hash ( ) ;
245
254
let ncols = vec:: len ( cols) ;
246
255
while r. readrow ( fields) {
256
+ log ( error, fields) ;
247
257
if vec:: len ( fields) != ncols {
248
258
cont; // FIXME: how to flag that we dropped a crazy row?
249
259
}
@@ -286,8 +296,8 @@ mod test {
286
296
let f = io:: str_reader ( s) ;
287
297
let r = mk ( f) ;
288
298
let mut i = 0 u;
299
+ let mut row: [ str ] = [ ] ;
289
300
loop {
290
- let mut row: [ str ] = [ ] ;
291
301
if !r. readrow ( row) {
292
302
break ;
293
303
}
0 commit comments